课程
/后端开发
/PHP
/PHP进阶篇
上面命名就是一个私有的数组,将属性名直接当做了键名,属性值当做了键值,为什么最后直接$car->name就输出了呢?啊,头大!
2015-09-14
源自:PHP进阶篇 2-9
正在回答
这个不难理解:当你向类中不存在的属性赋值时,__set会自动运行,而且参数也是自动传递的。我们可以在类中提供一个“容器”,用于保存动态创建的成员属性。而且当访问一个不存在的属性是,__get会被自动调用,我们可以从这个“容器”找,找到就返回否则就返回null。__set和__get成为魔术方法,但是逻辑要自己实现。
好回答
补充一下:题主说的不准确: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;
奥奥,谢谢,好像明白了。也就是说在最开始动态创建属性时,会自动调用__set()方法,然后将键值和键名都赋给私有的数组。在访问这个属性时,会自动调用__get()方法,在get方法内部是可以访问这个私有数组的,通过将这个私有数组中键名为$key的数组中的一项返回,在客户端的代码看来,我们就已经得到了name属性的值。就像你说的,__set和__get提供自动调用机制,但是逻辑的实现还是自己写的。
举报
轻松学习PHP中级课程,进行全面了解,用PHP快速开发网站程序
1 回答PHP类和对象之重载
3 回答用面向对象方法来做金字塔,大神进
1 回答求大神指点
2 回答求大神指点
2 回答类和对象这点看不懂