PHP物件導向_get(),_set()是如何來使用的? __set()方法是為屬性設定值的,__get()方法是為屬性取得值的,這兩個方法都是需要手動加入到程式中的,接下來我們就來具體看一下這兩個方法的使用。
一般來說,總是把類別的屬性定義為private,這比較符合現實的邏輯。但是,對屬性的讀取和賦值操作是非常頻繁的,因此在PHP5中,預先定義了兩個函數「__get()」和「__set()」來取得和賦值其屬性。類似java中的javabean的操作,所使用的方法也類似,只是不需要像javabean那樣,對每個欄位進行set和get的操作。只需要再加上兩個魔術方法即可。即私有成員的設值和取值的操作。在PHP5中給我們提供了專門為屬性設定值和獲取值的方法,「__set()」和「__get()」這兩個方法,這兩個方法不是預設存在的,而是我們手工添加到類裡面去的,像構造方法(__construct())一樣,類別裡面添加了才會存在,可以按下面的方式來添加這兩個方法,當然也可以按個人的風格來添加:
1 //__set()方法用来设置私有属性 2 public function __set($name,$value){ 3 $this->$name = $value; 4 } 5 //__get()方法用来获取私有属性 6 public function __get($name){ 7 return $this->$name; 8 }
__get()方法:這個方法用來取得私有成員屬性值的,有一個參數,參數傳入你要取得的成員屬性的名稱,返回取得的屬性值,這個方法不用我們手工的去調用,因為我們也可以把這個方法做成私有的方法,是在直接取得私有屬性的時候物件自動呼叫的。因為私有屬性已經被封裝上了,是不能直接取得值的,但是如果你在類別裡面加上了這個方法,在使用「echo$p1->name」這樣的語句直接取得值的時候就會自動呼叫__get($name)方法,將屬性name傳給參數$name,透過這個方法的內部執行,傳回我們傳入的私有屬性的值。如果成員屬性不封裝成私有的,物件本身就不會去自動呼叫這個方法。
__set()方法:這個方法用來為私有成員屬性設定值的,有兩個參數,第一個參數為你要為設定值的屬性名,第二個參數是要給屬性設定的值,沒有傳回值。這個方法同樣不用我們手工去調用,它也可以做成私有的,是在直接設定私有屬性值的時候自動調用的,同樣屬性私有的已經被封裝上
了,如果沒有__set()這個方法,是不允許的,例如:$this->name='zhangsan',這樣會出錯,但是如果你在類別裡面加上了__set($property_name, $value)這個方法,在直接給私有屬性賦值的時候,就會自動呼叫它,把屬性例如name傳給$property_name,把要賦的值「zhangsan」傳給$value,透過這個方法的執行,達到賦值的目的。如果成員屬性不封裝成私有的,物件本身就不會去自動呼叫這個方法。為了不傳入非法的值,還可以在這個方法給做判斷。程式碼如下:
1 <?php 2 class Person 3 { 4 //下面是人的成员属性,都是封装的私有成员 5 private $name; //人的名子 6 private $sex; //人的性别 7 private $age; //人的年龄 8 //__get()方法用来获取私有属性 9 private function __get($property_name) 10 { 11 echo "在直接获取私有属性值的时候,自动调用了这个__get()方法<br>"; 12 if(isset($this->$property_name)) 13 { 14 return($this->$property_name); 15 } 16 else 17 { 18 return(NULL); 19 } 20 } 21 //__set()方法用来设置私有属性 22 private function __set($property_name, $value) 23 { 24 echo "在直接设置私有属性值的时候,自动调用了这个__set()方法为私有属性赋值<br>"; 25 $this->$property_name = $value; 26 } 27 } 28 $p1=newPerson(); 29 //直接为私有属性赋值的操作,会自动调用__set()方法进行赋值 30 $p1->name="张三"; 31 $p1->sex="男"; 32 $p1->age=20; 33 //直接获取私有属性的值,会自动调用__get()方法,返回成员属性的值 34 echo "姓名:".$p1->name."<br>"; 35 echo "性别:".$p1->sex."<br>"; 36 echo "年龄:".$p1->age."<br>"; 37 ?>
程式執行結果:
在直接設定私有屬性值的時候,自動呼叫了這個__set()方法來為私有屬性賦值
在直接設定私有屬性值的時候,自動呼叫了這個__set()方法為私有屬性賦值
在直接設定私有屬性值的時候,自動呼叫了這個__set()方法為私有屬性賦值
在直接取得私有屬性值的時候,自動呼叫了這個__get()方法
姓名:張三
在直接取得私有屬性值的時候,自動呼叫了這個__get()方法
性別:男
在直接取得私有屬性值的時候,自動呼叫了這個__get()方法
年齡:20
以上程式碼如果不加上__get()和__set()方法,程式就會出錯,因為不能在類的外部操作私有成員,而上面的程式碼是透過自動呼叫__get()和__set()方法來幫助我們直接存取封裝的私有成員的。
相關推薦:
以上是php中_get(),_set()的使用方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!