автозагрузчик в начале моего 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 и отлично работает с удаленной функцией автозагрузки. mongo-1.3.0beta2 по php 5.4.9
__autoload()
, если он определен, вызывается каждый раз, когда вы пытаетесь получить доступ к классу, который не был импортирован вручную, используя require_once()
или include_once()
и не является частью внутренних классов PHP.
В вашем случае __autoload()
хотя вы пытаетесь получить доступ к внутреннему классу PHP – MongoClient
, предоставляемому расширением php-mongo. Когда вы не используете __autoload()
он работает так, как ожидалось.
Похоже, что расширение не хорошо говорит с интерпретатором PHP. Сначала вы должны попробовать обновление с бета-версии до версии 1.3.1. Если это не поможет, это потребует дальнейшего расследования.
Btw, если вы попытаетесь создать экземпляр объекта MongoClient
внутри пространства имен, используйте \MongoClient()
, например:
namespace Foo; $client = new \MongoClient();
\
Относится к глобальному пространству имен.
PHP не будет пытаться автозагружать все, что находится в stl (например, PDO, mysqli и т. Д.).
Если MongoClient
не является одним из этих типов классов, он попытается автозагрузить его.
Убедитесь, что у вас установлен PECL
Как отметил Нил, убедитесь, что у вас установлен клиент PECL mongo, и имейте в виду, что PHP иногда использует другой файл php.ini
для CLI.
Если в CLI вы можете получить правильный php.ini
, выполнив:
php -r "phpinfo();" | grep "php.ini"
Итак, после проверки PECL убедитесь, что у вас есть extension=mongo.so
в правильном php.ini