您好,登錄后才能下訂單哦!
案例一、
實踐目標:
1、PHP中__get的定義格式如下:public function __get(參數1) ,這里注意必須是2個__,名稱必須是__get,而且必須是要帶1個參數,多一個少一個都不行
具體代碼如下:
<?php class Animal{ public function eat(){ } public function sleep(){ } // static public function staticFun(){ // echo "Animal中的staticFun執行了<br/>"; // } //魔術方法 public function __get($name){ echo "自動執行了Animal類中的__get方法,當前屬性為:{$name}<br/>"; } } $ani = new Animal(); ?>
運行結果為:
未報錯,說明語法正確
現在我們 多加個參數看下
<?php class Animal{ public function eat(){ } public function sleep(){ } // static public function staticFun(){ // echo "Animal中的staticFun執行了<br/>"; // } //魔術方法 public function __get($name,$arg){ echo "自動執行了Animal類中的__get方法,當前屬性為:{$name}<br/>"; } } $ani = new Animal(); $name = $ani->name; ?>
運行結果為:
Fatal error: Method Animal::__get() must take exactly 1 argument in D:\E-class\class-code\classing\index.php on line 14
所以從結果可以看出,參數有且只能有一個,多一個少一個都不行
案例二、
實踐目標:
1、當調用不存在的屬性時,系統會自動觸發對象所在類的定義好的__get方法
具體代碼如下:
<?php class Animal{ public function eat(){ } public function sleep(){ } // static public function staticFun(){ // echo "Animal中的staticFun執行了<br/>"; // } //魔術方法 public function __get($name){ echo "自動執行了Animal類中的__get方法,當前屬性為:{$name}<br/>"; } } $ani = new Animal(); $name = $ani->name; ?>
運行結果如下:
自動執行了Animal類中的__get方法,當前屬性為:name
我們發現其實我們沒有手動的去調用__get方法,就是說沒有寫成$ani->__get(),但是這個方法依然執行了,因為什么呢?因為我們寫了$ani->name;而這個name方法沒有在類中定義,然后這個類中又定義了這個魔術方法,所以它就像魔術一樣,突然就被自動執行了,而且我們__get中的參數就是這個屬性
這里一定要注意,是2個下劃線,不是一個,否則就不是魔術方法了,下面還是再來做下測試
<?php class Animal{ public function eat(){ } public function sleep(){ } // static public function staticFun(){ // echo "Animal中的staticFun執行了<br/>"; // } //魔術方法 試著少寫一個_ public function _get($name){ echo "自動執行了Animal類中的__get方法,當前屬性為:{$name}<br/>"; } } $ani = new Animal(); $name = $ani->name; ?>
運行結果如下:
Notice: Undefined property: Animal::$name in D:\E-class\class-code\classing\index.php on line 18
所以此刻就會報錯了,因為沒有__get的魔術方法了,所以一定要注意是2個下劃線,就好像構造函數和析構函數一樣,都是兩個下劃線
案例一、
實踐目標:
1、PHP中__set在類中定義格式如下 public function __set(屬性參數1,屬性對應的值的參數2),這里注意必須是2個__,名稱必須是__set,而且必須是要帶2個參數,多一個少一個都不行
具體代碼如下:
<?php class Animal{ public function eat(){ } public function sleep(){ } //魔術方法 public function __set($name,$val){ echo "自動執行了Animal類中的__set方法,當前屬性為:{$name},值為:{$val}<br/>"; } } $ani = new Animal(); ?>
運行結果為:
空白,說明沒有報錯
接下來,我們少一個參數看下
<?php class Animal{ public function eat(){ } public function sleep(){ } //魔術方法 public function __set($name){ echo "自動執行了Animal類中的__set方法,當前屬性為:{$name},值為:{$val}<br/>"; } } $ani = new Animal(); ?>
運行結果為:
Fatal error: Method Animal::__set() must take exactly 2 arguments in D:\E-class\class-code\classing\index.php on line 11
所以__set方法的參數有且只能是2個,一個是屬性名,一個是屬性要設置的值
案例二、
實踐目標:
1、當設置不存在的屬性時,系統會自動觸發對象所在類的定義好的__set方法
具體代碼如下:
<?php class Animal{ public function eat(){ } public function sleep(){ } //魔術方法 public function __set($name,$val){ echo "自動執行了Animal類中的__set方法,當前屬性為:{$name},值為:{$val}<br/>"; } } $ani = new Animal(); $ani->name = "小狗"; ?>
運行結果為:
自動執行了Animal類中的__set方法,當前屬性為:name,值為:小狗
我們發現其實我們沒有手動的去調用__set方法,也就是說沒有寫成$ani->__set(),但是這個方法依然執行了,因為什么呢?因為我們寫了$ani->name = "小狗";;這個name屬性在類中沒有定義,然后這個類中又定義了這個魔術方法,所以它就像魔術一樣,突然就被自動執行了
這里一定要注意,是2個下劃線,不是一個,否則就不是魔術方法了,下面還是再來做下測試
具體代碼如下:
<?php class Animal{ public function eat(){ } public function sleep(){ } //魔術方法 試著少寫一個_ public function _set($name,$val){ echo "自動執行了Animal類中的__sett方法,當前屬性為:{$name},值為:{$val}<br/>"; } } $ani = new Animal(); $ani->name = "小狗"; ?>
運行結果如下:
空白了
所以說明沒有執行__set魔術方法了,所以一定要記得是兩個__。
以上就是PHP魔術方法之__get,__set詳解(代碼實例)的詳細內容,更多請關注億速云其它相關文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。