11

これは何よりも私自身の個人的な啓蒙のためですが、これは常に私を悩ませてきたものです.CLIモードでPHPが「自動ロード」を実行できないのはなぜですか?

私はこの免責事項を何年も読んでいますが、その理由に触れているものは読んだことがありません。

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

注: CLI 対話モードで PHP を使用している場合、オートロードは使用できません。

CLI モードでの作業中に言語としての PHP が自動ロードされない原因を知っている人はいますか?

4

3 に答える 3

7

コマンドラインでのオートロードは機能します。「インタラクティブ」の言及に注意してください。

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
于 2013-02-04T22:33:23.617 に答える
3

PHP の対話型 CLI についての基本的な考え方は、PHP が空のスクリプトを開始し、 からファイルを読み取り、PHP://stdinそれを解析して実行するというものです。ファイルの場所、つまりインクルード パス、およびその他の環境変数は無視されます。__FILE__あなたが存在しない場合は、現在の。
まあ、それは単なる見方であり、全体の話ではありません (それとは程遠い) が、実際には、それはあなたがそれを考えることができる方法です. 対話型 CLI で開始するファイルはまったく必要ありません。

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

ドキュメントから推測できるように

args... スクリプトに渡される引数。最初の引数が - で始まる場合、またはスクリプトが stdin から読み取られる場合は、 -- args を使用します

于 2013-02-04T22:47:11.050 に答える
1

彼らはCLIについて話しているのではなく、PHPインタラクティブモード、別名php -a.

なぜ?テスト目的と短いスニプレットのみであり、何かが自動ロードされると、動作がおかしくなる可能性があるためです。

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

于 2013-02-04T22:34:19.787 に答える