【发布时间】:2014-09-09 09:51:01
【问题描述】:
假设我有名为 parent 和 child 的类,然后将从名为 caller.php 的 PHP 文件中使用它们
class Child extends Parent {
}
class Parent {
public function parentMethod(){
}
}
调用者.php
已阻止:
$child = new Child();
$child->parentMethod();
允许:
$parent = new Parent();
$parent->parentMethod();
我想阻止这样调用 parentMethod。但是如果我创建了 Parent 对象,我希望能够调用 parentMethod。有什么方法可以用来隐藏这个方法在子类中不公开,但仍然允许父对象公开调用这个方法?
到目前为止,我想出的唯一解决方案是保护这些方法,然后创建一个扩展父类的另一个类,然后为它需要的每个函数提供公共方法,但这听起来不太聪明。
【问题讨论】:
-
没办法。理智的方式。根据定义,您使用了
public,因此您将这些方法定义为随处可见。如果您想对子类隐藏父方法,请使用private- 但是这样的方法不会在任何地方看到,而是在该类本身。 -
那么我应该让它们受保护并创建另一个类来调用所需的受保护方法吗?
-
protected还不够。这意味着无处不在的可见性,包括子类。要对孩子隐藏方法,请使用private -
我的意思是,我必须能够调用外部的方法。就在这个子类案例中,我必须隐藏它。如果我有父对象,我希望能够在类外调用该函数。我认为我不应该创建父对象的任何实例。只需将其扩展到另一个类并创建一个将调用父方法的方法。
-
听起来很荒谬。如果一个类
extends另一个类,那么该类的所有意图和目的都与父类相同,但可能在内部做更多或做一些不同的事情。但它仍然必须能够在可以使用父类的任何实例中完全替换父类。这就是里氏替换原则:en.wikipedia.org/wiki/SOLID。这是糟糕的 OOP 设计。
标签: php class inheritance parent-child visibility