PHP中private修饰符未按预期工作:为何可给私有变量赋值?
问题:为何能对PHP私有成员变量赋值并输出?
我定义了如下Product类:
class Product { public $name; private $price2; protected $number; function getNmae() { return $this->name; } function getPrice() { return $this->price2; } function getNumber() { return $this->number; } }
随后创建了继承自Product的Banana类,并编写了以下代码:
<?php include 'oop_test.php'; class Banana extends Product { } $ba = new Banana(); echo $ba->price2 = 2000; ?>
执行后成功为private修饰的$price2赋值并输出结果,我无法理解为何能对私有变量进行赋值操作?
解答
你并没有修改Product类里的私有成员$price2,而是给Banana类的实例$ba动态新增了一个公共成员变量$price2。
PHP是弱类型且支持动态属性的语言,当你尝试给对象的一个未定义属性赋值时,PHP会自动在该对象上创建一个新的公共属性——不管父类里是否有同名的私有属性。
私有成员$price2是属于Product类的,只有Product类内部的方法才能访问它。而你通过$ba->price2 = 2000创建的是Banana实例自己的公共属性,和父类的私有属性完全是两个不同的变量,只是名字相同而已。
如果要验证这一点,你可以调用父类的getPrice()方法查看返回值:
echo $ba->getPrice(); // 输出null,因为父类的私有$price2根本没被赋值
这就说明父类的私有成员并没有被修改,你只是给实例新增了一个同名的公共属性而已。
内容的提问来源于stack exchange,提问作者Osama Mohammed
相关产品推荐
相关产品推荐

