我正在尝试使用SwiftMailer php库与我编写的程序。在包含这个库之前,我一直在使用spl_autoload_register()函数。然而,在使用这个库之前,我使用spl函数显式地定义了类扩展和位置:
set_include_path(get_include_path().[my include path]);
spl_autoload_extensions('.class.php');
spl_autoload_register();
session_start();
我遇到的问题是,现在我试图使用一个不遵循相同命名约定的库。它们自己的自动加载类(通过对库的初始调用构建)是这样的:
public static function autoload($class)
{
//Don't interfere with other autoloaders
if (0 !== strpos($class, 'Swift_'))
{
return;
}
$path = dirname(__FILE__).'/'.str_replace('_', '/', $class).'.php';
if (!file_exists($path))
{
return;
}
if (self::$initPath && !self::$initialized)
{
self::$initialized = true;
require self::$initPath;
}
require $path;
}
当我尝试在调用它们的类后简单地运行程序时,我得到:
Fatal error: spl_autoload() [<a href='function.spl-autoload'>
function.spl-autoload</a>]:Class Swift_MailTransport could not
be loaded in [my file] on line 30
30行:
$transport = Swift_MailTransport::newInstance();
我已经尝试使用一个自定义的自动加载类建模后,然而,所有我得到当我尝试:
var_dump(spl_autoload_functions());
结果:
bool(false);
我知道这是一个相当简单的问题,我忽略了它,但我找不到它。
试着删除这个:
spl_autoload_register();
来自文档:
[if] spl_autoload_register() is called without any parameters then
[spl_autoload(...)] functions will be used
知道了这一点,认为spl_autolload不知道在哪里加载你的SwiftMailer类是合乎逻辑的,因为你得到的错误说明了这一点。然后,SwiftMailer不在你的include路径中,因为spl_autolload试图从那里加载。
下一步是把你的SwiftMailer类放在其中一个包含路径中。
好吧,在我绞尽脑汁了一整天却一无所获之后,我从我的兄弟那里得到了一个很棒的反馈,他也是一个程序员。
所有的问题都源于这一行:
require_once(SITE_ROOT.'/classes/lib/swift_required.php');
SITE_ROOT变量实际上是引用web位置(即http://),与我当前的主机,这不起作用,它需要使用物理文件位置代替。做了这个修改后,所包含的自动加载器就像广告中说的那样工作了。