关于_set()的有关问题
关于__set()的问题
- PHP code
<!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --> <?php namespace longli; class Employee { private $name; public function __set($xproName, $value) { echo '<p>Employee::__set is called $proName=='.$xproName.', $value=='.$value.''; $this->xproName = $value; } } class CEO extends Employee { function __construct($name="") { echo '<h2 id="CEO-construct-begin">CEO::__construct begin!</h2>'; $this->name = $name; echo '<h2 id="CEO-construct-end">CEO::__construct end!</h2>'; } } $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 '<p>Employee::__set is called $proName=='.$xproName.', $value=='.$value.'</p>'; // 这个 $xproName是一个变量,内容是变量名。 详见手册中 可变变量 $this->$xproName = $value; } <br><font color="#e78608">------解决方案--------------------</font><br>预定义了两个函数“__get()”和“__set()”来获取和赋值其属性,以及检查属性的“__isset()”<br><br><br>//__get()方法用来获取私有属性<br>private function __get($property_name)<br>{<br>if(isset($this->$property_name))<br>{<br>return($this->$property_name);<br>}else<br>{<br>return(NULL);<br>}<br>}<br>//__set()方法用来设置私有属性<br>private function__set($property_name,$value)<br>{<br>$this->$property_name=$value;<br>} <br><font color="#e78608">------解决方案--------------------</font><br>你仍然没弄清楚__set()的作用,当你为类成员属性$xproName赋值后,它已经不再是未定义了。所以不具备死循环的条件。<br>我觉得用__set()来实现的封装是过分的封装,为什么要在类外部修改一个隐藏的属性?为什么不设为公有?<br><br>至于说 事实上,为了“添加一个隐藏属性”<br>添加一个隐藏的属性?你的程序需要的属性名难道不是固定的吗?你应该先声明该隐藏属性。<br> <br><font color="#e78608">------解决方案--------------------</font><br>所用面向对象的语言中都对对象的每个属性设有 Access 和 Assign 方法,以便开发者灵活的控制对象的行为。由于 php 不是面向对象的语言,所以虽然粗糙的提供了 __get 和 __set 方法,但与 Access 和 Assign 相比还是有很大差距的<br>与 Access 和 Assign 一样,如果仅仅将 __get 和 __set 作用于对象属性的存取,就大有画蛇添足的嫌疑<br> __get 和 __set 在对象中的作用是在存取属性的同时隐式的之行一些方法,而无需显式的调用方法<br> <div class="clear"> </div>

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

MyBatis動態SQL標籤解讀:Set標籤用法詳解MyBatis是一個優秀的持久層框架,它提供了豐富的動態SQL標籤,可以靈活地建構資料庫操作語句。其中,Set標籤是用來產生UPDATE語句中SET子句的標籤,在更新作業中非常常用。本文將詳細解讀MyBatis中Set標籤的用法,以及透過具體的程式碼範例來示範其功能。什麼是Set標籤Set標籤用於MyBati

在使用PHP編寫程式碼時,我們可能會遇到「Notice:Undefinedproperty」這個錯誤提示。這個錯誤提示意味著我們正在存取一個未定義的屬性,通常是因為該屬性在程式碼中尚未被初始化。那麼,該如何解決這個問題呢?以下是幾種可能的解決方法:初始化屬性這是解決問題的最簡單方法。在程式碼中明確地初始化屬性,可以確保它在使用前已經被定義。例如:class

PHPNotice:Tryingtogetpropertyofnon-object-解決方法在PHP開發過程中,我們可能會遇到一個常見的錯誤提示:Tryingtogetpropertyofnon-object(試圖取得非物件的屬性)。這個錯誤通常是由我們對一個非物件類型的變數嘗試存取屬性(或呼叫方法)時引起的。這篇文章將向你介紹這

刪除元素的方法:1、使用delete(),可從Set物件中刪除指定的元素,語法「setObj.delete(value);」;2、使用clear(),可刪除Set物件中的所有元素,語法「setObj.clear();」。

Vue是一種流行的用於建立使用者介面的JavaScript框架。在開發過程中,我們可能會遇到各種錯誤和異常。其中一個常見的錯誤是"TypeError:Cannotreadproperty'XXX'ofnull"。在本文中,我們將探討這個錯誤的原因以及如何解決它。首先,讓我們來了解這個錯誤背後的原因。當我們嘗試存取一個物件的屬性或方法時,如果該對

php提交表单通过后,弹出的对话框怎样在当前页弹出php提交表单通过后,弹出的对话框怎样在当前页弹出而不是在空白页弹出?想实现这样的效果:而不是空白页弹出:------解决方案--------------------如果你的验证用PHP在后端,那么就用Ajax;仅供参考:HTML code

本文基於Python基礎,介紹如何去使用dict和set,使用key-value儲存結構的dict在Python中非常有用,選擇不可變物件作為key很重要,最常用的key是字串。

Vue中的TypeError:Cannotreadproperty'XXX'ofundefined,該怎麼辦?對於使用Vue開發的前端開發者來說,可能在開發過程中經常遇到TypeError:Cannotreadproperty'XXX'ofundefined的錯誤。這個錯誤通常出現在嘗試存取一個未定義(undefined)的屬性時。在
