<?php
class classname
{
var $value1;
function __get($name)
{
return $this->$name;
}
function __set($name,$value)
{
$this->$name=$value;
}
}
$a=new classname();
$a->$value1=5;
?>
问题一:书里面说$a->$value=5间接调用__set() 只是赋值为什么能调用?问题二:$this->name和$this->$name  多了个"$"有什么区别?

解决方案 »

  1.   

    问题一:书里面说$a->$value=5间接调用__set() 只是赋值为什么能调用? 
    __set()在类中其实也是赋值,两者功能相同
    问题二:$this->name和$this->$name  多了个"$"有什么区别?
    $this->name为当前类的name成员,$this->$name为当前类的以$name变量字符串为变量名的成名;
      

  2.   

    $this->$name为当前类的以$name变量字符串为变量名的成名; 这句话不大理解, $this->$name编译器不能通过.
      

  3.   

    $this->name为当前类的成员; 
    $this->$name没有这样的用法吧
      

  4.   

    同意楼上的。。
    $this->$name
    可以吗!?
      

  5.   


    这个写法没用过,也许可以吧,就和$$name一个道理
      

  6.   

    $this->$name应该不可以,引用类的方法或成员应该用$this->name或者$this->callable()的形式。另外,关于__set/__get,一般我们可以简单的理解为对属性的赋值和取值,但是真正的意义远不止此。特别在__set中,它可以完成很复杂的工作。我举一个例子说明:假定我设计一个数据库的类,其中有个属性是active。我可以用$db->active=true;来激活这个数据库链接。但是,其实要做的就不是:__set($value)
    {
      $this->active=$value;
    }那么简单了。我必须要获得当前的数据库连接配置,然后获得数据库连接的句柄,才算完成这个貌似简单的赋值过程。当然,你也可以用一个$db->open()方法来完成。但是,用->active是不是更直观?这个应用,是大多数人会忽略的。这个才是__set/__get的真正意义所在。