【问题标题】:Why is it possible to override instance variables in PHP but not in Java?为什么在 PHP 中可以覆盖实例变量,而在 Java 中却不能?
【发布时间】:2011-04-29 21:45:31
【问题描述】:

考虑下面的代码:

<?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

因为在其他语言(如 Java)中不允许您覆盖实例变量,但在 PHP 中是可能的。

是不是因为PHP是弱类型语言所以才有可能?

【问题讨论】:

    标签: java php oop instance-variables


    【解决方案1】:

    不,与weak typing无关。

    我猜这只是 PHP 开发人员做出的设计决定。这可能是因为它比 Java 更像是一种脚本语言。 (在 Java 中,您需要有一个“虚拟”字段查找表来支持这一点,或者自动生成 getter / setter)。

    【讨论】:

    • 我没有选票,所以我无法提高你的答案,但这是唯一一个远程接近回答为什么在 PHP 中,超类 ivar 被覆盖而在 Java 中的问题等,超类 ivar 被遮蔽/隐藏(它们并不完全相同)。
    【解决方案2】:

    您使实例变量受保护,这意味着扩展类可以覆盖它。如果你想阻止这种使用私有。

    http://www.php.net/manual/en/language.oop5.visibility.php

    【讨论】:

    • -1:这不能解释为什么在 PHP 中可以做到这一点,而在 Java 中却不能做到。
    猜你喜欢
    • 1970-01-01
    • 2011-02-28
    • 1970-01-01
    • 2020-05-09
    • 2021-10-04
    • 2014-12-03
    • 1970-01-01
    • 2022-01-26
    • 1970-01-01
    相关资源
    最近更新 更多