欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  后端开发

我在听XX视频课程,遇到__set()魔术方法,不能使用的问题

程序员文章站 2022-03-29 20:58:42
...
 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