PHP - 設計模式之 魔術方法

__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方法後,已經沒有警示提示了!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章