17

php5.4の特性は自動読み込みの対象になりますか?

テストする環境はまだありませんが、php.netの__autoloadまたはトレイトページでそれについての言及はありませんが、いくつかの点でトレイトはクラスのように動作するようです。

誰かがこれをもう試しましたか?

アップデート:

ここでリクエストを見つけました: https ://bugs.php.net/bug.php?id = 61265 (2012-03-03 13:10 UTC)

それはそれが機能することを示唆しているようですが、明示的にではありません。欠落している特性に対してストレート__autoload()が呼び出されることを誰かが確認できますか?

更新:確認済み-期待どおりに機能します-__ autoloadは特性をフェッチしますが、php5.4を初めて機能させることはより大きな課題のようです。

ありがとう、MyStream

4

2 に答える 2

56

マニュアルによると、このtrait_exists()関数は、自動ロードに関連する2番目のパラメーターとしてブール値を取ります。これは、特性と自動ロードが2つの互換性のないアイデアではないことを示しているようです。

さらに、そのtrait_exists()関数のソースコードを見ると、その2番目のパラメーターによって条件付けられたコードのセクションが表示されます。これは、のソースコードに表示されるものと非常によく似ていますclass_exists()
だから、私はもう一度、特性と自動ロードは互換性のないアイデアではないと言います;-)

(現在のコンピューターにPHP 5.4がインストールされていないため、自分でテストすることはできませんが、コードを確認してください...)



[編集] OK、現在の安定バージョンであるPHP5.4.3をコンパイルしました。

$ /usr/local/bin/php --version
PHP 5.4.3 (cli) (built: May 17 2012 21:11:42)
Copyright (c) 1997-2012 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2012 Zend Technologies

temp-2.phpとして保存され、このファイルで宣言されていないトレイトを使用しようとするコードの次の短い部分を試してみましょう。

spl_autoload_register(function ($name) {
    echo "AUTOLOAD :: ";
    var_dump($name);
});

class MyClass {
    use MyTrait;   // Let's try to use a trait that is not declared in this file
}

$obj = new MyClass();
$obj->plop();

基本的に、自動読み込みがトレイトに対して機能する場合"AUTOLOAD"、トレイトの名前が表示されます。

それで、コードのその部分を実行してみましょう-そしてこれが私が得る結果です:

$ /usr/local/bin/php ./temp-2.php
AUTOLOAD :: string(7) "MyTrait"

Fatal error: Trait 'MyTrait' not found in /.../temp-2.php on line 13

したがって、自動読み込み関数(ここでは匿名の関数ですが、それは何も変わりません)は呼び出されます...
...これは、PHP 5.4.3では、特性が自動読み込みの対象となることを意味します。

于 2012-05-17T19:04:09.423 に答える
2

同様に確認済み:

PHP 5.4.3-1~dotdeb.0 (cli) (built: May  8 2012 20:49:26)

Fatal error: Trait 'x' not found in /.../index.php on line 12

それらは(変更された?)クラスとして実装されるため、クラスとして扱われます。

たとえば、現在、クラスからの残留動作があります。プロパティを所有できます。

理論的には、彼らはそうすべきではなく、あなたは彼らがこの能力を持っていることに頼るべきではありません。将来的には段階的に廃止される可能性があります。

于 2012-05-17T19:24:39.160 に答える