小弟初学php,对于赋值运算——尤其是+=,-=,&=等——和魔术方法联合使用不太理解。希望大神能讲下魔术方法的原理。
例如:有个类A,私有成员v,魔术方法定义如下
class A
{
 private $v;
 public function __set($name, $val)
{
$v = $val;
}
}//abc.php
$a = new A;
$a->v += 1;
$a->v += 2;最终$v等于3么?
如果这么写是错误的,正确的代码是什么呢?
魔术方法的原理是什么呢,尤其在自赋值运算符上?

解决方案 »

  1.   

    代码应该是这样,最后等于3,没错<?php
    class A
    {
     private $v;
     public function __set($name, $val)
    {
        $this->$name = $val;
    } public function __get($name){
        return $this->$name;
     }
    }
     
    //abc.php
    $a = new A;
    $a->v += 1;
    $a->v += 2;
    echo $a->v;
    ?>
    $a->v += 1;
    相当于
    $a->v = $a->v +1;$a->v += 2;
    相当于
    $a->v = $a->v+ 2;
      

  2.   

    这段代码应该是无法执行的$a->v += 1;这句等价 
    $a->v=$a->v+1;
    会先取v的值,然后加1,再给v赋值。
    但因为class A中的v是private,类中也没有__get,那么是无法取到v值的。
      

  3.   


    class A
    {
     private $v;
     public function __set($name, $val)
    {
        $v = $val;
    }
    }
     
    //abc.php
    $a = new A;
    $a->v += 1;
    $a->v += 2
    你的代码是有问题的,$v=$val; 应该改成$this->v = $val; 你的__set有$name参数,所以不应该写死$v。而使用$this->$name = $val;参考1楼的代码就可以了。