0

我有一个奇怪的问题,我无法弄清楚。我正在使用PEAR从 PHP 页面发送邮件。该类Send_Mail正在工作(使用 SMTP 发送邮件),但我收到与我的autoloader.

Warning: include(classes/LOGIN.php) 
[<a href='function.include'>function.include</a>]: 
failed to open stream: No such file or directory in 
C:\xampp\htdocs\mysite\initialize.php on line 46`

在我的initialize.php文件中,我有这个:

function autoloader($class) {
    include 'classes/' . $class . '.php';
}

spl_autoload_register('autoloader');

在我的header.php文件中,我正在为该站点加载几个 PHP 类:

// autoload PHP classes for site
autoloader('Navigation');
autoloader('Validation');

该错误是指我没有的 LOGIN 类。但是我搜索了整个站点文件夹,包括php并在以下位置找到了这两行C:\xampp\php\PEAR\Net\SMTP.php

/* These standard authentication methods are always available. */
$this->setAuthMethod('LOGIN', array($this, '_authLogin'), false);
$this->setAuthMethod('PLAIN', array($this, '_authPlain'), false);

当我注释掉包含的行时,LOGIN我得到了相同的警告,但是PLAIN当我注释掉这两行时,警告消失了(但随后 SMTP 身份验证失败)。

为什么会这样?

更新

这是我的新的autoloader

function autoloader($class) {

    if (file_exists('classes' . $class . '.php')) {
        include 'classes' . $class . '.php'; 
    }
}

但是,当我 echo'classes' . $class . '.php'时,我得到了这个:

classes/.php

然后如果我把它改回不使用file_exists它就可以了,但echo仍然显示classes/.php

4

2 回答 2

1

我不确定您使用的是哪个版本的 Net_SMTP,但该setAuthMethod函数将各种不同类型的结构作为参数 - 方法名称、类、对象、可调用对象等。

由于 PHP 是动态类型的,SMTP.php因此在 Net_SMTP 中必须对该对象进行大量检查以确定它是什么类型的对象。作为其中的一部分,它会尝试确定“LOGIN”是否是一个类名,它正在调用您的自动加载器。

解决方案是在尝试包含之前在您的自动加载器中执行一个file_exists,但当然,如果您的包含路径在任何方面都很复杂,那么您基本上会让自己头疼。任何处理过编写综合自动加载器的人都知道你的痛苦。

于 2013-02-15T19:35:48.717 回答
0

我恢复到一个简单的autoloader,事情似乎工作正常:

function autoloader($class) {
    include 'classes/' . $class . '.php';
}

spl_autoload_register('autoloader');

感谢您的建议。

于 2013-03-22T22:47:22.870 回答