为什么可以在PHP中重写实例变量,而在Java中却不能?
考虑以下代码:为什么可以在PHP中重写实例变量,而在Java中却不能?,java,php,oop,instance-variables,Java,Php,Oop,Instance Variables,考虑以下代码: <?php class Base { protected $name = "Base"; public function getName() { return $this->name; } } class Foo extends Base { protected $name = "Foo"; } $f = new Foo(); echo $f->getName();
<?php
class Base {
protected $name = "Base";
public function getName() {
return $this->name;
}
}
class Foo extends Base {
protected $name = "Foo";
}
$f = new Foo();
echo $f->getName(); // output: Foo
$b = new Base();
echo $b->getName(); // output: Base
您使实例变量受保护,这意味着扩展类可以覆盖它。如果你想防止这种情况发生,请使用私有的
不,这与我无关
我想这只是PHP开发人员做出的一个设计决定。这可能是因为它更像是一种脚本语言而不是Java。(在Java中,您需要有一个字段的“虚拟”查找表来支持这一点,或者自动生成getter/setter)。我没有票数,所以我无法找到您的答案,但这是唯一一个接近于回答为什么在PHP中超类ivar被覆盖的问题,而在Java等中,超类ivar是隐藏的(它们并不完全相同)。-1:这并不能回答为什么可以在PHP中这样做,而不能在Java中这样做。