コマンドラインでのオートロードは機能します。「インタラクティブ」の言及に注意してください。
PHP には 2 つのインタラクティブ モードがありますが、残念ながらどちらもphp -a
コマンド シェルで を使用して呼び出されます。
PHP が readline サポート付きでコンパイルされている場合、「対話型シェル」が得られます。このモードでは、すべてのコマンドがほぼ瞬時に評価され、解析エラーに関するフィードバックも即座に得られます。
このモードでは、オートロードが機能します。
もう 1 つのモードは「対話モード」と呼ばれます。このモードには凝ったものは何もなく、短いメッセージを出すだけで、基本的には PHP スクリプトを書きます - そして STDIN を閉じない限り何も起こりません。そうして初めて、書かれたコードが解析され、実行されます。__autoload()
これは、未知のクラスに対して関数が呼び出されない唯一のケースです。
対話型シェル セッションの例 (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