namespace a1;
function a($name)
{
echo $name;
}
spl_autoload_register('a1\a');
namespace a2;
function a($name)
{
echo $name;
}
spl_autoload_register('a2\a');
new a; // 執行個體化a2\a,但是為什麼卻先觸發了a1\a,然後再觸發a2\a
// 我用檔案引用的方式也還是這樣,但是如果a1\a找到了類檔案,則不會在觸發a2\a了,註冊的載入函數“不屬於命名空間”,那麼怎麼能做到不同第三方類庫使用自己的註冊的自載入呢?
回複內容:
namespace a1;
function a($name)
{
echo $name;
}
spl_autoload_register('a1\a');
namespace a2;
function a($name)
{
echo $name;
}
spl_autoload_register('a2\a');
new a; // 執行個體化a2\a,但是為什麼卻先觸發了a1\a,然後再觸發a2\a
// 我用檔案引用的方式也還是這樣,但是如果a1\a找到了類檔案,則不會在觸發a2\a了,註冊的載入函數“不屬於命名空間”,那麼怎麼能做到不同第三方類庫使用自己的註冊的自載入呢?
每個庫忽略掉自己不能夠載入的類即可
真的…………
好吧,我只看了題主的標題。這會兒整理下題主的代碼,盡量細說一下……
php
問題 1:為啥先調 \spaceA\loadA ?
隨便哪個順序都沒啥影響吧?再說,按你傳入的順序調有啥不妥咩?
問題 2: 怎麼能做到不同第三方類庫使用自己的註冊的自載入呢?
不同類庫的類名不一樣就行了,擔心類名衝突的話,不是有命名空間咩?它實際就是類名的首碼,使用時把類名寫全就行了。比如:
php
new \spaceA\Something()new \spaceB\Something()
問題 3: 效率低怎麼辦?
效率低也要看低在哪裡
尋找類檔案的路徑太慢?
可以提前建立索引,通常會提前建好類名(注意命名空間其實就是類名的首碼)到類定義檔案的映射,方便你通過完整的類名直接取到類定義的檔案路徑。或者像Java那樣規範好類的目錄,正如 fig 這個社區組織所整理的的 PSR-4 那樣。
類載入函數調用的次數太多?
每個類定義檔案只會載入一次,runtime找到類的定義後就不再調用你的"類載入函數"了。一般項目裡能引用多少三方庫?能註冊多少個載入函數?能有多少類檔案?萬一得用十萬百萬千萬來計數的話,回頭請給個基準測試資料過來摔在在下的臉上,順便也摔在php開發組的臉上,到時大家一起邊掐邊哭邊研究下下hiahiahia…………。
預留問題(在下暫時想不出了……)
關於spl-autoload-register的使用,詳情請參考文檔 http://php.net/manual/zh/function.spl-autoload-register.php
我懂了,http://www.thinkphp.cn/document/474.html
spl_autoload_register() 會將一個函數註冊到 autoload 函數列表中,當出現未定義的類的時候,SPL [注] 會按照註冊的倒序逐個調用被註冊的 autoload 函數,這意味著你可以使用 spl_autoload_register() 註冊多個 autoload 函數.
逐個的調用被註冊的自動函數,這多麼的不理智啊,被註冊的自動函數應該“屬於某個命名空間”才好啊,項目的各個類庫還是存在很很小的耦合性的,萬一耦合,載入不該載入的那不就完了啊,真是的,我的理解對不對呢?