關於__set()的問題
PHP code
Employee::__set is called $proName=='.$xproName.', $value=='.$value.''; $this->xproName = $value; }}class CEO extends Employee { function __construct($name="") { echo 'CEO::__construct begin!
'; $this->name = $name; echo 'CEO::__construct end!
'; } }$boss = new CEO("Blus");?>
上面的代碼,__set()被莫名其妙執行了兩次,請問這是為什麼呢? 輸出結果為:
CEO::__construct begin!
Employee::__set is called $proName==name, $value==Blus
Employee::__set is called $proName==xproName, $value==Blus
CEO::__construct end!
------解決方案--------------------
__set( $property, $value ) : 給一個未定義的屬性賦值時調用
你賦值了兩次當然就執行兩次了。
------解決方案--------------------
第一次給未定義的類成員$name賦值: $this->name = $name; 調用一次
在調用重載方法__set的時候,第二次給未定義的類成員 $xproName賦值: $this->xproName = $value; 調用一次。
我想你的本意是這樣:
PHP code
public function __set($xproName, $value) { echo 'Employee::__set is called $proName=='.$xproName.', $value=='.$value.'
'; // 這個 $xproName是一個變數,內容是變數名。 詳見手冊中 可變變數 $this->$xproName = $value; }
------解決方案--------------------
預定義了兩個函數“__get()”和“__set()”來擷取和賦值其屬性,以及檢查屬性的“__isset()”
//__get()方法用來擷取私人屬性
private function __get($property_name)
{
if(isset($this->$property_name))
{
return($this->$property_name);
}else
{
return(NULL);
}
}
//__set()方法用來設定私人屬性
private function__set($property_name,$value)
{
$this->$property_name=$value;
}
------解決方案--------------------
你仍然沒弄清楚__set()的作用,當你為類成員屬性$xproName賦值後,它已經不再是未定義了。所以不具備死迴圈的條件。
我覺得用__set()來實現的封裝是過分的封裝,為什麼要在類外部修改一個隱藏的屬性?為什麼不設為公有?
至於說 事實上,為了“添加一個隱藏屬性”
添加一個隱藏的屬性?你的程式需要的屬性名稱難道不是固定的嗎?你應該先聲明該隱藏屬性。
------解決方案--------------------
所用物件導向的語言中都對對象的每個屬性設有 Access 和 Assign 方法,以便開發人員靈活的控制對象的行為。由於 php 不是物件導向的語言,所以雖然粗糙的提供了 __get 和 __set 方法,但與 Access 和 Assign 相比還是有很大差距的
與 Access 和 Assign 一樣,如果僅僅將 __get 和 __set 作用於對象屬性的存取,就大有畫蛇添足的嫌疑
__get 和 __set 在對象中的作用是在存取屬性的同時隱式的之行一些方法,而無需顯式的調用方法