我怎么不在PHP中自动加载一个类?

时间:2012-12-17 22:40:59

标签: php autoload autoloader

我的php代码开头的自动加载器

function __autoload($class_name) {
    include_once $class_name . '.class.php';
}

导致对new MongoClient();的调用失败并显示错误 Warning: include_once(MongoClient.class.php): failed to open stream

如何在我的课程中使用自动加载器并仍然使用标准类?

注意:MongoDb已经安装了PECL,并且在删除自动加载功能的情况下工作正常。 php 5.4.9上的mongo-1.3.0beta2

3 个答案:

答案 0 :(得分:4)

PHP将尝试自动加载stl中的任何内容(如PDO,mysqli等)

如果MongoClient不是这些类型的类别之一,它会尝试自动加载它。

Make sure you have PECL installed

答案 1 :(得分:0)

每次尝试访问尚未使用__autoload()require_once()手动导入且不属于PHP内部类的类时,都会调用

include_once()(如果已定义)。

在您的情况下,虽然您尝试访问php-mongo扩展提供的PHP内部类__autoload(),但会触发MongoClient。当您不使用__autoload()时,它会按预期工作。

看起来扩展程序与PHP解释器的说话不太好。您应首先尝试从测试版到稳定版1.3.1版的更新。如果这没有帮助,则需要进一步调查。


顺便说一下,如果你试图在命名空间中实例化MongoClient对象,请使用\MongoClient(),如下所示:

namespace Foo;

$client = new \MongoClient();

\指的是全局命名空间。

答案 2 :(得分:0)

正如Neal指出的那样,请确保安装了PECL mongo客户端,并记住有时PHP会为CLI使用不同的php.ini文件。

如果在CLI中,您可以通过执行以下操作获得正确的php.ini

php -r "phpinfo();" | grep "php.ini"

因此,在检查PECL后,请确保extension=mongo.so正确php.ini