這篇文章介紹的內容是關於php的命名空間和自動加載,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下
#我們先前講過類的自動加載,然後我就在思索。
我們寫程式碼的時候,每在另一個檔案中呼叫其他類別時
我們並沒有寫spl_autoload_register
這個方法啊?那我們時怎麼實現的呢?
原來啊,我們php在5.3時引入了命名空間的概念(這也是為什麼大多數的框架不支援5.3之前的版本原因之一)
命名空間大家多少還是了解的吧:不知道的去牆角面壁思過
命名空間簡而言之就是一種標識,它的主要目的是解決命名衝突的問題。
就像在日常生活中,有很多名字相同的人,要如何區分這些人呢?那就需要加上一些額外的標識。
把工作單位當成標識似乎不錯,這樣就不用擔心 「撞名」 的尷尬了。
[ ] 完全限定命名空間
[ ] 限定命名空間
new 百度\李彦宏(); // 限定类名new \百度\李彦宏(); // 完全限定类名
在目前命名空間沒有宣告的情況下,限定類別名稱和完全限定類別名稱是等價的。因為如果不指定空間,則預設為全域(\)。
namespace 谷歌;new 百度\李彦宏(); // 谷歌\百度\李彦宏(实际结果)new \百度\李彦宏(); // 百度\李彦宏(实际结果)
這個例子展示了在命名空間下,使用限定類別名稱和完全限定類別名稱的差異。 (完全限定類別名稱 = 目前命名空間 限定類別名稱)
/* 导入命名空间 */use 百度\李彦宏;new 李彦宏(); // 百度\李彦宏(实际结果)/* 设置别名 */use 百度\李彦宏 AS CEO;new CEO(); // 百度\李彦宏(实际结果)/* 任何情况 */new \百度\李彦宏();// 百度\李彦宏(实际结果)
使用命名空間只是讓類別名稱有了前綴,不容易發生衝突,系統仍然不會進行自動導入。
如果不引入文件,系統會在拋出 “Class Not Found” 錯誤之前觸發 __autoload 函數,並將限定類別名稱傳入作為參數。
所以上面的例子都是基於你已經將相關文件手動引入的情況下實現的,否則系統會拋出 ” Class ‘百度\李彥宏’ not found」。
所以在引入命名空間以後右引入了自動載入
類別的自動載入在前面我們講spl_autoload_register的時候已經跟大家講過了。今天我們講另一個
__autoload()
php的__autoload函數是一個魔術函數,在這個函數出現之前,如果一個php檔案裡引用了100個對象,那麼這個檔案就需要使用include或require引進100個類文件,這將導致該php文件無比龐大。於是就有了這個 __autoload函數。
__autoload函數在什麼時候呼叫呢?當php檔案中使用了new關鍵字實例化一個物件時,如果該類別沒有在本php檔案中被定義,將會觸發__autoload函數,此時,就可以引進定義該類別的php文件,爾後,就能實例化成功了。 (注意:如果需要實例化的對象,在本文件中已經找到該類的定義的話,就不會觸發__autoload函數)
他和spl_autoload_register的區別就在於
當檔案中同時出現__autoload和spl_autoload_register時,以spl_autoload_register為準
相關推薦:
#以上是php的命名空間和自動加載的詳細內容。更多資訊請關注PHP中文網其他相關文章!