通常來講,老是把類的屬性定義爲private,這更符合現實的邏輯。可是,對屬性的讀取和賦值操做是很是頻繁的,所以在PHP5中,預約義了兩個函數「__get()」和「__set()」來獲取和賦值其屬性,以及檢查屬性的「__isset()」和刪除屬性的方法「__unset()」。php
上一節中,咱們爲每一個屬性作了設置和獲取的方法,在PHP5中給咱們提供了專門爲屬性設置值和獲取值的方法,「__set()」和「__get()」這兩個方法,這兩個方法不是默認存在的,而是咱們手工添加到類裏面去的,像構造方法(__construct())同樣, 類裏面添加了纔會存在,能夠按下面的方式來添加這兩個方法,固然也能夠按我的的風格來添加:函數
//__get()方法用來獲取私有屬性this
private function __get($property_name)spa
{對象
if(isset($this->$property_name))get
{io
return($this->$property_name);function
}elseclass
{程序
return(NULL);
}
}
//__set()方法用來設置私有屬性
private function __set($property_name, $value)
{
$this->$property_name = $value;
}
__get()方法:這個方法用來獲取私有成員屬性值的,有一個參數,參數傳入你要獲取的成員屬性的名稱,返回獲取的屬性值,這個方法不用咱們手工的去調用,由於咱們也能夠把這個方法作成私有的方法,是在直接獲取私有屬性的時候對象自動調用的。由於私有屬性已經被封裝上了,是不能直接獲取值的(好比:「echo $p1->name」這樣直接獲取是錯誤的),可是若是你在類裏面加上了這個方法,在使用「echo $p1->name」這樣的語句直接獲取值的時候就會自動調用__get($property_name)方法,將屬性name傳給參數$property_name,經過這個方法的內部執行,返回咱們傳入的私有屬性的值。若是成員屬性不封裝成私有的,對象自己就不會去自動調用這個方法。
__set()方法:這個方法用來爲私有成員屬性設置值的,有兩個參數,第一個參數爲你要爲設置值的屬性名,第二個參數是要給屬性設置的值,沒有返回值。這個方法一樣不用咱們手工去調用,它也能夠作成私有的,是在直接設置私有屬性值的時候自動調用的,一樣屬性私有的已經被封裝上
了,若是沒有__set()這個方法,是不容許的,好比:$this->name=‘zhangsan’, 這樣會出錯,可是若是你在類裏面加上了__set($property_name, $value)這個方法,在直接給私有屬性賦值的時候,就會自動調用它,把屬性好比name傳給$property_name, 把要賦的值「zhangsan」傳給$value,經過這個方法的執行,達到賦值的目的。若是成員屬性不封裝成私有的,對象自己就不會去自動調用這個方法。爲了避免傳入非法的值,還能夠在這個方法給作一下判斷。代碼以下:
<?php
class Person
{
//下面是人的成員屬性, 都是封裝的私有成員
private $name; //人的名子
private $sex; //人的性別
private $age; //人的年齡
//__get()方法用來獲取私有屬性
private function __get($property_name)
{
echo "在直接獲取私有屬性值的時候,自動調用了這個__get()方法<br>";
if(isset($this->$property_name))
{
return($this->$property_name);
}
else
{
return(NULL);
}
}
//__set()方法用來設置私有屬性
private function __set($property_name, $value)
{
echo "在直接設置私有屬性值的時候,自動調用了這個__set()方法爲私有屬性賦值<br>";
$this->$property_name = $value;
}
}
$p1=new Person();
//直接爲私有屬性賦值的操做,會自動調用__set()方法進行賦值
$p1->name="張三";
$p1->sex="男";
$p1->age=20;
//直接獲取私有屬性的值, 會自動調用__get()方法,返回成員屬性的值
echo "姓名:".$p1->name."<br>";
echo "性別:".$p1->sex."<br>";
echo "年齡:".$p1->age."<br>";
?>
程序執行結果:
在直接設置私有屬性值的時候,自動調用了這個__set()方法爲私有屬性賦值
在直接設置私有屬性值的時候,自動調用了這個__set()方法爲私有屬性賦值
在直接設置私有屬性值的時候,自動調用了這個__set()方法爲私有屬性賦值
在直接獲取私有屬性值的時候,自動調用了這個__get()方法
姓名:張三
在直接獲取私有屬性值的時候,自動調用了這個__get()方法
性別:男
在直接獲取私有屬性值的時候,自動調用了這個__get()方法
年齡:20
以上代碼若是不加上__get()和__set()方法,程序就會出錯,由於不能在類的外部操做私有成員,而上面的代碼是經過自動調用__get()和__set()方法來幫助咱們直接存取封裝的私有成員的。