2012-05-17 90 views
17

php5.4中的特徵是否受自動加載?php5.4自動加載特徵

我還沒有一個可以測試的環境,但是我在php.net或traits頁面的__autoload上看不到任何提及它的地方,但它似乎在某些方面類似於類。

有沒有人試過這個呢?

UPDATE:

我發現了一個請求,在這裏: https://bugs.php.net/bug.php?id=61265(2012-03-03 13:10 UTC)

,這似乎表明,它的工作,但沒有明確。任何人都可以證實,一個直__autoload()將被稱爲缺少的特質?

更新:確認 - 它按預期工作 - 儘管讓php5.4第一次工作似乎是更大的挑戰,但__autoload將獲取特性。

謝謝, MyStream

回答

55

按照手冊,trait_exists()函數採用一個布爾作爲第二個參數,即涉及到自動加載;這似乎表明特質和自動加載不是兩個不兼容的想法。另外,如果你看看trait_exists()函數的源代碼,你會看到一段由第二個參數調節的代碼,看起來和你在源代碼中看到的非常相似 - 代碼class_exists()
所以,我想說的第二個時間特徵和自動加載並不矛盾的想法;-)

(我沒有PHP 5.4安裝在我目前的電腦上,所以我不能由我自己測試 - 但,看代碼...)



[編輯] OK,我剛剛編譯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,受自動加載

+5

您不僅安裝了它,而且還測試並提供了非常好的答案。 +1優秀的回覆。謝謝! – MyStream

+0

不客氣:-) *(我想安裝5.4,因爲很長一段時間 - 我終於做到了^^)* –

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 

他們被視爲類,因爲它們是作爲(modiffied?)類實現的。

例如,他們目前有一個類的殘留行爲:他們可以擁有屬性。

理論上他們不應該和你不應該依靠他們有這種能力。將來它可能會被淘汰。

+0

謝謝你 - 非常有用的答案和建議。 +1看看它的發展將會非常有趣。 – MyStream

+0

海事組織這是一個非常糟糕/笨拙的語法。 允許性狀的屬性(如果它繼續)。 B.基本上允許「完整」多重繼承。 我一直很興奮地測試這個功能,就像我是關於命名空間back @ php5.3一樣,並且再次失望。 –

+0

也在php5.4中,我們有直接的函數返回值解析:explode('','Mihai Stancu')[1] =='Stancu',以及數組語法['key'=>'value']。 –