搜索

首页  >  问答  >  正文

__set() 操作流程是怎样的?

    class dome{
    private $age;
    public function __construct($age){

            $this->age =$age;
    }
public function __set($name,$value){

if($name =='age')
        {return false;}      

return $this->$name=$value;
    }  

 }

$obj =new dome(24);

echo $obj->age=25;和
     $obj->age=26;
     echo $obj->age;

问题很简单 我想通过在__set()方法中 通过if语句被让age被修改 正常情况 2个输出结果都应该是默认值24 但

echo $obj->age=25的结果是25 age 被修改了? $obj->age=26;  echo $obj->age; 这句没有问题,他们意思有上面不同吗?

葫芦娃平衡盘葫芦娃平衡盘2663 天前1284

全部回复(2)我来回复

  • DayDayUp

    DayDayUp2017-08-12 16:38:41

    class demo{
        private $age;
        public function __construct($age){
                $this->age =$age;
        }
        public function __set($name,$value){
            if($name =='age'){
                return false;
            }       
            return $this->$name=$value;
        }   
    }
        $obj =new demo(24);
        echo $obj->age=25;
        $obj->age=26;
        echo $obj->age;

    你这个代码,第二个echo应该是不能执行的,你代码没贴全吧,因为他会提示你不能访问私有属性

    两个输出结果的差异是因为你echo的写法,echo a = 3 这种写法会执行赋值语句,但不管赋值成不成功,会把等号右边的数输出到屏幕上

    1、第一个echo $obj->age=25;执行了你的set方法,得到name是等于age的,执行return false ,所以没有修改属性age的值。 但你这种写法,他会输出你等号右边的25在屏幕上 ;

    2、第二个就是正常一般的写法,会执行这个赋值语句,然后判断返回false,不修改age的值,然后输出你的age属性的值还是24


    回复
    1
  • 葫芦娃平衡盘

    明白了 非常感谢

    葫芦娃平衡盘 · 2017-08-12 18:18:18
  • DayDayUp

    DayDayUp2017-08-12 16:00:34

    echo $obj->age=25  这种语句是错误的,你没有更改类里面的值,你只是单纯的输出了一个25.

    1、你的set方法里面应该是写错了吧,你看下你的else语句好像弄掉了

    2、你要读取私有属性,要再写一个get方法

    if($name =='age')
            {return false;}  //没有else     
    return $this->$name=$value;
        }   
     }
         
       //正确代码
       public function __set($name,$value){
            if($name == 'age'){
                echo 'age不允许修改';
            }else{      
                return $this->$name = $value;
            } 
        } 
        
        public function __Get($name){
                return $this->$name;
        }


    回复
    0
  • 取消回复