在子类中定义一个属性,然后在父类中使用它,PHP中的奇怪行为?

Posted

技术标签:

【中文标题】在子类中定义一个属性,然后在父类中使用它,PHP中的奇怪行为?【英文标题】:Define a property in sub class, then use it in parent class, strange behavour in PHP? 【发布时间】:2014-11-09 10:25:48 【问题描述】:

php 中,我在子类中定义了一个名为 $table_name 的属性,然后在父类中,我可以使用这个属性:

class A
public function getTable()
    return $this->table_name;



class B extends A

protected $table_name='admin;


这可以在 Java 或 C++ 中实现吗?我只是想知道这是否是一个好的 OOP 实践,或者它只是在 PHP 中可行,因为 PHP 是一种解释语言。

更新:直到我发现一个 MVC 框架使用它之前,我才意识到这在 PHP 中是可能的!当我学习 Java 时,我不记得有这样的事情,所以我认为它可能值得讨论。

【问题讨论】:

这对我来说是个新闻……这在 C# 中肯定行不通,但不确定 Java 等(我猜不是)。 添加其他语言的标签,让更多人看到您的问题。 由于作用域,这不适用于大多数语言。 IMO 由于父子之间存在循环依赖而不是单向依赖,这不是好的 OOP 实践。 在 C++ 中不起作用。您必须在基类中声明table_name(在这种情况下为A)。我很确定这适用于所有提到的其他语言。 您可以做到这一点并不意味着您应该这样做。我不知道 PHP 会允许这样做,因为我从来没有想过尝试!我希望它可以被视为未记录的行为,因此不应依赖它,因为结果未定义并且将来可能会发生变化。我很想知道你在哪个框架中找到了这个,所以我以后可以避免它:) 【参考方案1】:

OOP 的要点之一是多态性和使用派生类的能力。这背后的想法是,您可以访问基属性(在基类中)并依赖它们存在于任何派生类中。

做上面演示的事情会打破这一点。这本质上意味着基类对于派生类以外的任何东西都是无用的,应该避免这种行为。

所以:您从派生类访问基属性,而不是相反。

短版:这是不好的 OOP 做法。

【讨论】:

是的,和上面所有的 cmets 一样,这是 BAD OOP 的做法,这也是 PHP 的 OOP 的缺点 --- 它允许许多方法编写糟糕的 OOP 代码! 我完全同意同意。 (我已经用那些确切的词更新了我的帖子,因为它击中了头上的钉子——除了 PHP 部分,我不想开始一场激烈的战争;) @user305611156 PHP 允许这种特殊的不良做法这一事实并没有使 PHP 成为一种糟糕的语言。有许多不应该在许多语言中使用的不良做法的例子,这并不会使它们变得糟糕。我同意这个特殊的例子令人惊讶,但它是一个误用的例子,并不会因此而使整个语言变得糟糕。 @vascowhite,我同意,只是 PHP 允许这种行为,而其他强类型语言则不允许。一个优秀的程序员从来不会那样写代码,但我确实看到过一些这样的 PHP 代码。 @webnoob,感谢您的回复。我接受了答案,因为我猜你可能希望我接受它:)

以上是关于在子类中定义一个属性,然后在父类中使用它,PHP中的奇怪行为?的主要内容,如果未能解决你的问题,请参考以下文章

关于Java中子类调用父类方法

总结7

Java 继承和重写

继承和多态

@RequestMapping 不能在父类中使用与子类不同的静态最终常量

面向对象编程 多态