__get和__set
1、實例化一個類,然後,調用一個未定義的方法
訪問:
2、但如果我們使用了__set和__get方法,也就是在該object類中,加入這兩個方法,看看會怎麼樣?
我們給一個未定義的屬性賦值:
瀏覽器查看結果:
已經沒有報錯了!
再看結果:
從以上,我們能夠看出,調用是先經過了__set方法,將沒有的屬性和值放到了映射數組,然後,調用的時候,又經過了__get方法,它又獲取了映射數組,給我們返回了結果。
__call和__callStatic
1、如果我們實例化完一個類,調用一個該類沒有定義的方法時,這時候,會怎麼樣呢?
訪問:
2、那麼,這種情況,該如何應對呢?我們可以使用__call魔術方法,在該類中加入此方法:
訪問輸出一下:
以上輸出分爲兩部分,前者,是var_dump出來的方法名稱和參數,後者,是在__call方法裏的輸出。
3、如果我們去訪問一個類的不存在的靜態方法,那麼,會怎麼樣呢?
訪問:
4、那麼,這種情況如何處理呢,我們可以用另外一個魔術方法__callStatic,操作如下:
再次訪問:
所以,爲了防止調用未定義的靜態方法導致報錯,我們可以在類中定義__callStatic方法規避。
__toString
1、如果你要echo一個對象,猜猜會怎麼樣?
訪問一下:
2、那萬一有人這麼訪問,或者,在平時的開發當中,無意中,這麼輸出了,該怎麼辦?我們決不能讓用戶看到這種報錯!這時,__toString就登場了。
再次訪問:
提示,方法必須爲public屬性,更改一下:
再次訪問:
__invoke
1、在PHP中,如果我們把一個對象當做函數去用,那麼,會怎麼樣呢?
2、如何處理,使用__invoke魔術方法,如下:
再次訪問:
剛剛,在沒有創建__invoke方法的時候,直接將對象當方法輸出的時候,IDE已經提示紅線,可當我創建完__invoke方法後,已經沒有警示提示了!