Rumah >pembangunan bahagian belakang >tutorial php >我在听XX视频课程,遇到__set()魔术方法,不能使用的问题
<code> class study{ private $name; private $age; function say(){ echo "我的名字是:".$this->name.",我的年龄是:".$this->age ; } function __set($k,$v){ echo "1111"; } } $lisi=new study(); $lisi->age=100;</code>
我按老师视频里书写的,视频里老师的zend没有报错,而我的报错了,说age是私有属性....,难道因为视频是11年的所以,如今变化很大?还是需要什么设置?我发现我按老师说的很多魔术方法都会使用时报错,很苦恼~求助!!
<code> class study{ private $name; private $age; function say(){ echo "我的名字是:".$this->name.",我的年龄是:".$this->age ; } function __set($k,$v){ echo "1111"; } } $lisi=new study(); $lisi->age=100;</code>
我按老师视频里书写的,视频里老师的zend没有报错,而我的报错了,说age是私有属性....,难道因为视频是11年的所以,如今变化很大?还是需要什么设置?我发现我按老师说的很多魔术方法都会使用时报错,很苦恼~求助!!
楼主的调用没有错啊。
假设有一个类,类中有一个私有变量$name
<code><?php class People{ private $name; public function __set($key = '', $value = ''){ echo "here"; } } $obj = new People(); $obj->name = '文艺青年阿虚V';</code>
按照常理面向对象是不允许你这样调用的
<code>$obj->name = '文艺青年阿虚V'; </code>
PHP中__set的功能就是让你可以这么做,具体的流程是这样的,当PHP解析器看到你正在使用对象调用一个私有变量,这时它本想着报错呢,可是又发现你的类中有一个__set()方法,于是它就不报错,而自动执行__set()方法了
上面的__set()方法其实很简陋,只echo "here";了,既然它在上面所说的这种情况下自动调用,那我就可以在这种情况下完善一下__set()方法,让它去做你想干的事。
根据你的say()方法,我猜是你的__set方法内缺了一行$this->$k = $v;
如果仍然有问题,确认你的php版本,__set
方法是php5中有的,你不会找了一个很古老的4.x的版本吧?
然后作为属性重载方法,必须把方法的访问控制声明为public,如果你的视频教程没有提到这点,那么是一个非常不严谨的教程,我建议你赶紧换。见: http://php.net/manual/zh/language.oop5.overloading.php 当然了,由于php为了向下兼容,所以即使你不写public的访问控制,它默认也会声明称public,然而这是一个不可依赖的特性,你不知道未来PHP是否还会兼容这种写法
?太彻了 private是私有属性 只能在类里面调用
你写的没错啊,就是因为age是私有属性才会有__set()
与__get()