[英]php5.4 autoloading traits
php5.4中的特征是否需要自動加載?
我還沒有一個可以測試的環境,但我在php.net或traits頁面上的__autoload上看不到任何提及它,但似乎特征在某些方面表現得像類。
有人試過這個嗎?
更新:
我在這里找到了一個請求: https ://bugs.php.net/bug.php?id = 61265(2012-03-03 13:10 UTC)
這似乎表明它確實有效,但沒有明確說明。 任何人都可以確認將為一個缺失的特征調用一個直的__autoload()嗎?
更新:確認 - 它按預期工作 - __autoload將獲取特征,雖然讓php5.4第一次工作似乎是更大的挑戰。
謝謝,MyStream
根據手冊, trait_exists()
函數將布爾值作為第二個參數,與自動加載有關; 這似乎表明特征和自動加載不是兩個不相容的想法。
另外,如果你看一下trait_exists()
函數的源代碼,你會看到一段代碼,由第二個參數決定,看起來非常類似於你在源代碼中看到的代碼。 class_exists()
。
所以,我會說第二次特征和自動加載不是不相容的想法;-)
(我當前的計算機上沒有安裝PHP 5.4,所以我不能自己測試 - 但是,查看代碼......)
[編輯]好的,我剛剛編譯了PHP 5.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,特征是自動加載的 。
確認也是:
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
它們被視為類,因為它們被實現為(modiffied?)類。
例如,他們目前有類的剩余行為:他們可以擁有屬性。
理論上他們不應該,你不應該依賴他們擁有這種能力。 將來它可能會逐步淘汰。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.