首頁 >後端開發 >php教程 >php中_get(),_set()的使用方法

php中_get(),_set()的使用方法

不言
不言原創
2018-07-20 16:36:471577瀏覽

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的_set()跟_get()

以上是php中_get(),_set()的使用方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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