这更多的是对我个人的启迪,但是,这一直困扰着我:为什么 PHP 在 CLI 模式下不能执行“自动加载”?
多年来我一直在阅读这份免责声明,但我从未读过任何涉及原因的内容:
http://php.net/manual/en/language.oop5.autoload.php:
Note: Autoloading is not available if using PHP in CLI interactive mode.
有谁知道是什么阻止了 PHP 作为一种语言在 CLI 模式下自动加载?
最佳答案
在命令行上自动加载有效。请注意“交互式”的提及。
PHP 带有两种交互模式,但不幸的是,它们都是通过在您的命令 shell 上使用 php -a
来调用的。
如果 PHP 编译时带有 readline 支持,您将获得“交互式 shell”。在这种模式下,几乎可以立即评估每个命令,并且您还可以获得有关任何解析错误的即时反馈。
在此模式下,自动加载有效。
另一种模式称为“交互模式”。这种模式没有任何花哨的东西,它只发出一条短消息,然后你基本上编写了一个 PHP 脚本——除非你关闭 STDIN,否则什么也做不了。只有这样,编写的代码才会被解析和执行。这是唯一不为未知类调用 __autoload()
函数的情况。
交互式 shell session 示例(在 Linux 上使用 PHP 5.3.2):
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 >
交互模式示例(在 Windows 上使用 PHP 5.3.18)
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
关于php - 为什么 PHP 的自动加载功能在 CLI 模式下不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14696961/