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

来源:2-9 PHP类和对象之重载

奈何花落

2015-09-14 19:57

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

写回答 关注

4回答

  • 思君满月
    2015-09-14 21:25:03
    已采纳

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

  • Boy_iOS
    2016-03-01 23:18:28

    好回答

  • zqbinary
    2016-03-01 22:07:49

    补充一下:题主说的不准确: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;


  • 奈何花落
    2015-09-17 11:06:04

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

PHP进阶篇

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

181734 学习 · 2575 问题

查看课程

相似问题