关于__set()的问题
<!--Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--><?phpnamespace 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>CEO::__construct begin!</h2>'; $this->name = $name; echo '<h2>CEO::__construct end!</h2>'; } }$boss = new CEO("Blus");?>
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>