簡體   English   中英

php5.4自動加載特性

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM