先看程式碼:
<?php
類別嚴格座標類別 {
私有 $arr = array('x' => NULL, 'y' => NULL);
函數 __construct() {
print "正在創建 StrictCooperativeClass";
列印“<br/>”;
}
函數 __destruct() {
列印“<br/>”;
print "StrictCooperativeClass 正在被銷毀";
}
函數 __get($property) {
if (array_key_exists($property, $this->arr)) {
返回 $this->arr[$property];
} 別的 {
print "錯誤: 無法讀取 x & y 以外的屬性n";
}
}
函數 __set($屬性, $值) {
if (array_key_exists($property, $this->arr)) {
$this->arr[$property] = $value;
} 別的 {
print "錯誤: 無法寫入 x & y 以外的屬性n";
}
}
}
$obj = new StrictCooperativeClass();
$obj->x = 1;
印出 $obj->x;
列印“<br/>”;
$obj->n = 2;
列印“<br/>”;
印出 $obj->n;
?>
輸出結果:
正在創建 StrictCooperativeClass
1
錯誤:無法寫入 x 和 y 以外的屬性
錯誤:無法讀取 x 和 y 以外的屬性
StrictCooperativeClass 正在被銷毀
__construct()和__destruct()其實是Java中的建構子以及C中的建構子。
至於__get和__set請看下面:
參考自: http://www.phpchina.com/html/54/26354-31906.html
.__set() __get() __isset() __unset() 四種方法的應用一般來說,總是把類別的屬性定義為私有,這更符合現實的邏輯。非常密集的,因此在PHP5中,預先定義了兩個函數「__get()」和「__set()」來取得和分配其屬性,以及檢查屬性的「__isset()」和刪除屬性的方法「__unset( )」。
上面中,我們為每個屬性做了設定和取得的方法,在PHP5中給我們提供了專門為屬性設定值和取得值的方法,「__set()」和「__get()」這兩個方法,這兩個方法不是預設存在的,而是我們手動加入到類別裡面去的,像構造方法(__construct())一樣,下面的類別裡面添加了就會存在,可以按的方式來添加這兩個方法方法,當然也可以以個人的風格來添加:
//__get()方法用來取得樹木屬性
私有函數__get($property_name) {
if(isset($this->$property_name)) {
返回($this->$property_name);
}別的 {
返回(空);
}
}
//__set()方法用來設定私有屬性
私有函數__set($property_name,$value) {
$this->$property_name=$value;
}
__get() 方法:這個方法用來取得樹木成員屬性值的,有一個參數,參數決定你要取得的成員屬性的名稱,傳回取得的屬性值,這個方法不用我們手工的呼叫去,因為我們也可以把這個方法蒸發掉蒸發的方法,是在直接取得蒸發器屬性的時候物件自動呼叫的。這樣)直接取得是錯誤的),但是如果你在類別裡面加上了這個方法,在使用「echo $p1->name」這樣的語句直接取得值的時候自動呼叫__get($property_name)方法,將屬性name給參數$property_name,透過這個方法的內部執行,傳回我們建立的蠟燭屬性的值。
__set() 方法:這個方法用來為蠟燭成員屬性設定值的,有兩個參數,第一個參數為你要給屬性設定值的屬性名,第二個參數是要給屬性設定值的,沒有回傳這個方法同樣不用我們手工去調用,它也可以是蒸發皿的,是在直接設定蒸發皿屬性值的時候自動調用的,同樣蒸發皿的已經被封裝了,如果沒有__set()這個方法,是不允許的,例如:$this->name='zhangsan',這樣會出錯,但是如果你在類別裡面加上了__set($property_name, $value)這個方法,在直接給樹木屬性賦值的時候,可以自動呼叫它,把屬性例如name傳給$property_name,把要賦予的值「zhangsan」傳給$value,透過這個方法的執行,達到屬性的目的。就不會去自動呼叫這個方法。
<?php
類人{
// 下面是人的成員屬性,都是封裝的封裝成員
私人$名稱; //人的名子
私人$性; //人的性別
私人$年齡; //人的年齡
//__get()方法用來取得樹木屬性
私有函數__get($property_name) {
echo"在直接取得樹枝屬性值的時候,自動呼叫了這個__get()方法<br>";
if(isset($this->$property_name)) {
返回($this->$property_name);
} 別的 {
返回(空);
}
}
//__set()方法用來設定私有屬性
私有函數__set($property_name,$value) {
echo"在直接設定電線屬性值的時候,自動呼叫了這個__set()方法為電線屬性屬性<br>";
$this->$property_name=$value;
}
}
$p1=newPerson();
//直接為外部屬性賦值的操作,會自動呼叫__set()方法進行賦值
$p1->name="張三";
$p1->sex="男";
$p1->年齡=20;
//直接取得成員屬性的值,會自動呼叫__get()方法,傳回成員屬性的值
echo"姓名:".$p1->name."<br>";
echo"性別:".$p1->性別。"<br>";
echo"年齡:".$p1->年齡."<br>";
?>
程式執行結果:
在直接設定婆羅洲屬性值的時候,自動呼叫了這個__set()方法為婆羅洲屬性在直接設定婆羅洲屬性值的時候,自動呼叫了這個__set()方法為婆羅洲屬性在直接設定婆羅洲屬性值的,自動調用了這個__set()方法為股權屬性在直接獲取股權屬性的時候,自動調用了這個__get()方法姓名:張三在直接獲取股權屬性的時候,自動調用了這個__get()方法性別:男在直接取得毛髮屬性值的時候,自動呼叫了這個__get()方法年齡:20
以上程式碼如果不加上__get()和__set()方法,程式就會出錯,因為不能在類別的外部操作私有成員,而上面的程式碼是透過自動呼叫__get()和__set()方法來幫助我們直接訪問封裝的創口成員的。
__isset()方法:在看這個方法之前我們先看一下「isset()」函數的應用,isset()是判斷變數設定是否用的函數,確定一個變數作為參數,如果確定的變數存在則傳遞那麼如果在一個物件外面使用「isset()」這個函數去判斷物件裡面的成員是否被設定可以用呢?屬性,如果是外部的成員屬性,這個函數我們就失效了,原因就是因為外部的被封裝了,在外部不可見。被設定了呢? ,就會自動呼叫類別裡面的「__isset()」方法了幫助我們完成了這樣的操作,「__isset()」方法也可以是蒸發器外部的。
私有函數__isset($nm) {
echo"當在類別外部使用isset()函數測定變數成員$nm時,自動呼叫<br>";
返回 isset($this->$nm);
}
__unset() 方法:看這個方法呢,我們也先看一下「unset()」這個函數,「unset()」這個函數的作用是刪除指定的變數且傳回true,參數為要刪除的變數那麼如果在一個物件外部去刪除物件內部的成員屬性用「unset()」函數不可以呢,也分兩種情況,如果一個物件裡面的屬性成員是公有的,就可以在物件外部使用這個函數刪除物件的公有屬性,如果物件的成員屬性是私有的,我用這個函數就沒有權限去刪除,但同樣如果你在一個物件裡面加上「__unset()」這個方法,就可以在物件的外部去物件裡面加上了「__unset()」這個方法之後,當物件外部使用「unset()」函數刪除物件內部的私有成員屬性時,自動呼叫「__unset()」函數來幫我們刪除物件內部的私有成員屬性,這個方法也可以在類別的內部定義成私有的。
私有函數__unset($nm) {
echo"當在類別外部使用unset()函數來刪除樹木成員時自動呼叫的<br>";
取消設定($this->$nm);
}
我們來看一個完整的實例:
<?php
類人{
// 下面是人的成員屬性
私人$名稱; //人的名子
私人$性; //人的性別
私人$年齡; //人的年齡
//__get()方法用來取得樹木屬性
私有函數__get($property_name) {
if(isset($this->$property_name)) {
返回($this->$property_name);
}別的{
返回(空);
}
}
//__set()方法用來設定私有屬性
私有函數__set($property_name,$value) {
$this->$property_name=$value;
}
//__isset()方法
私有函數__isset($nm) {
echo"isset()函式測定內部成員時,自動呼叫<br>";
返回 isset($this->$nm);
}
//__unset()方法
私有函數__unset($nm) {
echo"當在類別外部使用unset()函數來刪除樹木成員時自動呼叫的<br>";
取消設定($this->$nm);
}
}
$p1=newPerson();
$p1->name="這是一個人名";
//使用完成isset()函數來測定父成員時,自動呼叫__isset()方法幫助我們,回傳結果為true
echovar_dump(isset($p1->name))."<br>";
echo $p1->名稱."<br>";
//使用完成unset()函數刪除私有成員時,自動呼叫__unset()方法幫助我們,刪除私有成員
取消設定($p1->名稱);
//已經刪除了,所以這行不會有輸出
回顯$p1->名稱;
?>
輸出結果為:
isset()函數判斷成員成員時,自動調用
布爾(真)
這是一個人名
當在類別外部使用unset()函數來刪除樹木成員時自動呼叫的
__set()、__get()、__isset()、__unset()這四個方法都是我們加入到物件裡面的,在需要的時候自動呼叫的,來完成在物件外部對物件內部屬性的操作。