在PHP中,__set()方法可以用於為私有成員屬性設定值,給一個未定義的屬性賦值時會被觸發;語法格式“__set($property, $value)”,有兩個參數,第一個參數指定屬性名,第二個參數是要為屬性設定的值,沒有回傳值。
推薦:《PHP影片教學》
一般來說,總是把類別的屬性定義為private ,這比較符合現實的邏輯。但是,對屬性的讀取和賦值操作是非常頻繁的,因此在PHP5中,預先定義了兩個函數「__get()」和「__set()」來取得和賦值其屬性。
__set() 方法用來設定私有屬性值。
__get() 方法用來取得私有屬性值。
在PHP5中給我們提供了專門為屬性設定值和取得值的方法,「__set()」和「__get()」這兩個方法,這兩個方法不是預設存在的,而是我們手工添加到類別裡面去的,像構造方法(__construct())一樣,類別裡面添加了才會存在,可以按下面的方式來添加這兩個方法,當然也可以按個人的風格來加入:
//__set()方法用来设置私有属性 public function __set($name,$value){ $this->$name = $value; } //__get()方法用来获取私有属性 public function __get($name){ return $this->$name; }
__get()方法:這個方法用來取得私有成員屬性值的,有一個參數,參數傳入你要取得的成員屬性的名稱,傳回取得的屬性值,這個方法不用我們手工的去調用,因為我們也可以把這個方法做成私有的方法,是在直接取得私有屬性的時候物件自動調用的。因為私有屬性已經被封裝上了,是不能直接取得值的,但是如果你在類別裡面加上了這個方法,在使用「echo$p1->name」這樣的語句直接取得值的時候就會自動呼叫__get($name)方法,將屬性name傳給參數$name,透過這個方法的內部執行,傳回我們傳入的私有屬性的值。如果成員屬性不封裝成私有的,物件本身就不會去自動呼叫這個方法。
__set( $property, $value )方法:這個方法用來為私有成員屬性設定值的,有兩個參數,第一個參數為你要為設定值的屬性名,第二個參數是要給屬性設定的值,沒有回傳值。這個方法同樣不用我們手工去調用,它也可以做成私有的,是在直接設定私有屬性值的時候自動調用的,同樣屬性私有的已經被封裝上了,如果沒有__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=newPerson(); //直接为私有属性赋值的操作,会自动调用__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()方法來幫助我們直接存取封裝的私有成員的。
更多程式相關知識,請造訪:程式設計入門! !
以上是php __set()方法怎麼用?的詳細內容。更多資訊請關注PHP中文網其他相關文章!