關於_set()的有關問題

來源:互聯網
上載者:User
關於__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 在對象中的作用是在存取屬性的同時隱式的之行一些方法,而無需顯式的調用方法
  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.