首頁  >  文章  >  後端開發  >  PHP中重載詳解

PHP中重載詳解

小云云
小云云原創
2018-03-31 09:53:213151瀏覽

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);

PHP中重載詳解

也可以在__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的重載介紹

#JavaScript的函數重載詳解

php中重載與魔術方法的範例詳解

以上是PHP中重載詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn