PHP中的重載和別的物件導向(C#、Java)語言不同,如:在C#中的重載表示,具有相同的方法名,但是形參列表不同(即形參的個數、類型、排列方式中的一個不同)函數,會在呼叫時根據形參列表來決定該呼叫那個方法。
而在PHP中重載是針對目前物件不可存取成員(沒有定義或定義了但存取不到)的處理:
<?php Class Student{ private $_age; } $o1=new Student(); $o1->_name="Li"; var_dump($o1); echo "<br/>"; $o1->_age=24; var_dump($o1); ?>
從這個結果我們可以看出:當存取不存在的成員$_name時,會把成員當作共有屬性放入物件中。而涉及到存取權限問題時,會報錯。
對於這種情況,php中有一些屬性重載的魔術方法:
1.__set($name,$value):當調用的某個屬性無法存取(不存在/存取受限)時,系統會自動呼叫該對應類別中的__set()函數。 $name表示呼叫的屬性名,$value 代表操作時傳入的值。
如果屬性不存在:
<?php Class Student{ private $_age; function __set($name,$value){ } } $o1=new Student(); $o1->_name="Li"; var_dump($o1);
也可以在__set()方法中寫上該程式碼:
function __set($name,$value){ $this->$name=$value; }
此時的結果為
如果屬性存在,但其無法存取:
<?php header("Content-Type:text/html;charset=utf-8"); Class Student{ private $_age; function __set($name,$value){ //进入该函数表示$name 这个属性不可访问。 if(property_exists($this,$name)){ //property_exists()函数判断当前对象($this)中是否存在$name属性。 trigger_error("属性不可访问!",E_USER_ERROR); }else{ } } } $o1=new Student(); $o1->_age=2; var_dump($o1);
2.__get():當存取不可存取成員的時候會觸發:
<?php header("Content-Type:text/html;charset=utf-8"); Class Student{ private $_age=23; function __get($name){ //进入该函数表示$name 这个属性不可访问。 return $this->$name; } } $o1=new Student(); echo $o1->_age; echo "<br/>"; var_dump($o1);
3.__unset():當刪除某個變數時會觸發函數。
其具體的應用場景:我們都知道unset()函數,也就是刪除某一個變量,這也可以用到物件中,例如我們上面的例子中,如果$_age為public,那麼可以用unset($o1->_age);但是,這裡的$_age 是一個private屬性,此時用unset()肯定無法存取。
<?php header("Content-Type:text/html;charset=utf-8"); Class Student{ private $_age=23; } $o1=new Student(); unset($o1->_age);
這就需要__unset()魔術方法,在類別中實作屬性的刪除:
<?php header("Content-Type:text/html;charset=utf-8"); Class Student{ private $_age=23; function __get($name){ return $this->$name;//正常应该有判断语句,这里省略了。 } function __unset($name){ unset($this->$name); } } $o1=new Student(); echo $o1->_age; unset($o1->_age); echo $o1->_age;
其特定的應用和上面的__set()、__get()類似,即當你unset(變數名);時,會自動呼叫__unset()方法,方法體可以自己定義。
4.__isset():主要是用來判斷是否有屬性,跟__unset()用法一樣。當外部想要判斷是有屬性的時候,用isset()函數無法存取私有變量,此時可以使用__isset()方法定義。
方法重載和屬性重載的條件一樣:當呼叫不存在或無法存取的方法時,會呼叫__call()、Static__callStatic()方法。
在系統預設的情況下呼叫本不存在的方法:
<?php header("Content-Type:text/html;charset=utf-8"); Class Student{ public static $a=1; private $_age=23; } $o1=new Student(); $o1->getName();//当调用本不存在的方法时。
#系統會出現一個嚴重錯誤。
__call():使用物件呼叫時使用的魔術方法
<?php header("Content-Type:text/html;charset=utf-8"); Class Student{ public static $a=1; private $_age=23; function __call($name,$arr){ //$name表示传入的方法名,$arr表示传入的方法列表(是一个数组)。 trigger_error("不存在该函数",E_USER_NOTICE);//直接报错 //也可以在此重写函数。 } } $o1=new Student(); $o1->getName();//当调用本不存在的方法时。
#Static__callStatic():使用類別呼叫方法,也就是呼叫一個不存在的靜態方法時,可以使用此魔術方法。
相關推薦:
以上是PHP中重載詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!