我在听XX视频课程,遇到__set()魔术方法,不能使用的问题
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;
我按老师视频里书写的,视频里老师的zend没有报错,而我的报错了,说age是私有属性....,难道因为视频是11年的所以,如今变化很大?还是需要什么设置?我发现我按老师说的很多魔术方法都会使用时报错,很苦恼~求助!!
回复内容:
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;
我按老师视频里书写的,视频里老师的zend没有报错,而我的报错了,说age是私有属性....,难道因为视频是11年的所以,如今变化很大?还是需要什么设置?我发现我按老师说的很多魔术方法都会使用时报错,很苦恼~求助!!
楼主的调用没有错啊。
假设有一个类,类中有一个私有变量$name
name = '文艺青年阿虚V';
按照常理面向对象是不允许你这样调用的
$obj->name = '文艺青年阿虚V';
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()
上一篇: php实现进度条原理
下一篇: php发送邮箱乱码