萬盛學電腦網

 萬盛學電腦網 >> 網絡編程 >> php編程 >> php中__get()和__set()用法介紹

php中__get()和__set()用法介紹

想要對對象的屬性進行一些設置,如果一個一個設置,會比較麻煩,這時可以使用對象的處理器函數__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後才有效。

copyright © 萬盛學電腦網 all rights reserved