Почему функция автоматической загрузки PHP не работает в режиме CLI?


Это больше для моего личного назидания, чем что-либо еще, но это то, что всегда беспокоило меня: почему конкретно PHP не может выполнять "автозапуск" в режиме CLI?

Я читаю эту оговорку в течение многих лет, но я никогда не читал ничего, что касалось бы вопроса " почему?":

Http://php.net/manual/en/language.oop5.autoload.php :

Примечание: автоматическая загрузка недоступна при использовании PHP в интерактивном режиме CLI.

Кто-нибудь знает, что мешает PHP, как языку, автоматически загружаться при работе в режиме CLI?

3 7

3 ответа:

Автозагрузка в командной строке работает. Обратите внимание на упоминание "интерактивного".

PHP поставляется с двумя интерактивными режимами, но, к сожалению, оба они вызываются с помощью php -a в командной оболочке.

Если PHP компилируется с поддержкой readline, вы получаете "интерактивную оболочку". В этом режиме каждая команда оценивается почти мгновенно, и вы также получаете мгновенную обратную связь о любых ошибках синтаксического анализа.

В этом режиме работает автоматическая загрузка.

Другой режим называется "интерактивный режим". Этот режим лишен каких - либо причуд, он только выдает короткое сообщение, а затем вы в основном пишете PHP-скрипт-и ничего не делается, пока вы не закроете STDIN. Только после этого написанный код разбирается и выполняется. И это единственный случай, когда функция __autoload() не вызывается для неизвестных классов.

Пример сеанса интерактивной оболочки (с использованием PHP 5.3.2 в Linux):

vagrant@lucid32:/etc/apache2$ php -a
Interactive shell

php > function __autoload($classname) {
php { echo "Autoload $classname";
php { eval("class $classname{}");
php { return true;
php { }
php > new Bar();
Autoload ▒▒Bar
php > new FooBar();
Autoload ▒▒FooBar
php > var_dump($a = get_declared_classes());
array(123) {
[0]=>
string(8) "stdClass"
[1]=>
string(9) "Exception"
[2]=>
string(14) "ErrorException"
   ... lots of internal classes here ...
[121]=>
string(3) "Bar"
[122]=>
string(6) "FooBar"
}
php >

Пример для интерактивного режима (использование PHP 5.3.18 в Windows)

PS C:\Users\sven> php -a
Interactive mode enabled

<?php
function __autoload($class) { echo "Auto: $class"; eval("class $class {}"); }
echo "Hello World";
$x = new Foo;
var_dump($x);
var_dump($a = get_declared_classes());
^Z
Hello World
Fatal error: Class 'Foo' not found in - on line 4

Call Stack:
  100.6337    1114608   1. {main}() -:0

Способ думать об интерактивном CLI PHP в основном таков: PHP запускает пустой скрипт и читает файл из PHP://stdin, который затем анализирует и выполняет. Расположение файла, а следовательно, и путь к нему, а также другие переменные среды игнорируются. Текущий __FILE__, Если хотите, не существует.
Ну, это просто способ взглянуть на это, это не говорит всей истории (далеко не так), но на практике, это то, как вы можете думать об этом. Там не должно быть файла, чтобы начать в интерактивном режиме CLI, вообще:

$ php '<?php echo "this is read from STDIN"; ?>'

Как можно заключить из документов :

Аргументы...                    Аргументы передаются в сценарий. Используйте -- аргументы, когда первый аргумент                               начинается с - или скрипт читается из stdin

Я бы сказал, что они говорят не о CLI, а об интерактивном режиме PHP, он же php -a.

И почему? Потому что это только для целей тестирования и коротких фрагментов, и если что-то загружается автоматически, поведение может быть сумасшедшим.

Http://www.php.net/manual/en/features.commandline.interactive.php