为了账号安全,请及时绑定邮箱和手机立即绑定

php面向对象的重载不懂,请大神指点

上面命名就是一个私有的数组,将属性名直接当做了键名,属性值当做了键值,为什么最后直接$car->name就输出了呢?啊,头大!

正在回答

5 回答

这个不难理解:当你向类中不存在的属性赋值时,__set会自动运行,而且参数也是自动传递的。我们可以在类中提供一个“容器”,用于保存动态创建的成员属性。而且当访问一个不存在的属性是,__get会被自动调用,我们可以从这个“容器”找,找到就返回否则就返回null。__set和__get成为魔术方法,但是逻辑要自己实现。

2 回复 有任何疑惑可以回复我~

好回答

0 回复 有任何疑惑可以回复我~

补充一下:题主说的不准确:class Car {

    private $ary = array();    

    public function __set($key, $val) {// 赋值  

        $this->ary[$key] = $val;

    }//例子其他无关的去掉了只留下这些   

}

$car = new Car();

$car->name = '汽车';  //向类中不存在的属性赋值时,__set会自动运行,参数(name 是键值,"汽车"是变量值)传递(name 传递给$key,"汽车"传递给$val) ==》name属性动态创建并赋值

echo $car->name;


2 回复 有任何疑惑可以回复我~

奥奥,谢谢,好像明白了。也就是说在最开始动态创建属性时,会自动调用__set()方法,然后将键值和键名都赋给私有的数组。在访问这个属性时,会自动调用__get()方法,在get方法内部是可以访问这个私有数组的,通过将这个私有数组中键名为$key的数组中的一项返回,在客户端的代码看来,我们就已经得到了name属性的值。就像你说的,__set和__get提供自动调用机制,但是逻辑的实现还是自己写的。

0 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消
PHP进阶篇
  • 参与学习       181734    人
  • 解答问题       2575    个

轻松学习PHP中级课程,进行全面了解,用PHP快速开发网站程序

进入课程

php面向对象的重载不懂,请大神指点

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信