您好,欢迎访问一九零五行业门户网

关于_set()的有关问题

关于__set()的问题
php codexproname = $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 codepublic 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 在对象中的作用是在存取属性的同时隐式的之行一些方法,而无需显式的调用方法

其它类似信息

推荐信息