php基本功之_get(),_set()的用法

通常來講,老是把類的屬性定義爲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()方法來幫助咱們直接存取封裝的私有成員的。

相關文章
相關標籤/搜索