想要對對象的屬性進行一些設置,如果一個一個設置,會比較麻煩,這時可以使用對象的處理器函數__get()和__set(),不過使用這兩個方法的前提,屬性需要是protect或private的,如下例:
代碼如下
復制代碼
class Person
{
private $__data = array();
public function __get($property)
{
if (isset($this->__data[$property]))
{
return $this->__data[$property];
}
else
{
return false;
}
}
public function __set($property, $value)
{
$this->__data[$property] = $value;
}
}
__set()和__get()方法是針對protect或private屬性的,這樣可以做到在外界不能直接訪問屬性,而通過public定義的__set()和__get()方法卻可以輕易訪問它,同事這兩個方法對屬性的操作通用性也比較高,也可以限制對象的屬性的合法性,只有屬於$__data數組中的屬性,才可以進行設置,可以防止外界直接對屬性進行設置。但是使用__set()和__get()也有些不足之處。第一,這兩個方法只會捕捉私有或受保護的屬性,即是外界沒有訪問權限的屬性,這樣php會報一個致命錯誤;第二,這兩個方法破壞了屬性的繼承性。如果父對象中有一個__set()方法,而在子類中又實現了自己的__get()方法,那麼對象就不會正常的運行,因為父對象的__get()方法是永遠調不到的,而且要想檢測重寫的屬性是否存在也不能得到的,因為它不會調用__get()方法。見到有人通過實現__isset()和__unset()來解決上面的問題。代碼如下:
代碼如下
復制代碼
public function __isset($property)
{
if (isset($this->data[$property]))
{
return true;
}
else
{
return false;
}
}
public function __unset($property)
{
if (isset($this->data[$property]))
{
return unset($this->data[$property]);
}
else
{
return false;
}
}
使用__isset()和__unset()則能保證屬性是否真正存在,不過這兩個方法只有在PHP5.1後才有效。