以下代码将让PHP感到不满,即customMethod()是私有的。为什么会这样?可见性是由声明某事物而不是定义的地方决定的吗?
如果我想使customMethod仅对Template类中的样板代码可见并防止它被覆盖,我是否会将其保护并最终保留?
的template.php:
abstract class Template() {
abstract private function customMethod();
public function commonMethod() {
$this->customMethod();
}
}
CustomA.php:
class CustomA extends Template {
private function customMethod() {
blah...
}
}
Main.php
...
$object = new CustomA();
$object->commonMethod();
..
答案 0 :(得分:44)
抽象方法不能是私有的,因为根据定义它们必须由派生类实现。如果您不希望它为public
,则需要protected
,这意味着派生类可以看到它,但没有其他人可以看到。
The PHP manual on abstract classes向您展示了以这种方式使用protected
的示例。
答案 1 :(得分:2)
抽象方法是公开的或受保护的。这是必须的。
答案 2 :(得分:1)
如果您担心customMethod
课程之外会调出CustomA
,则可以CustomA
课程final
。
abstract class Template{
abstract protected function customMethod();
public function commonMethod() {
$this->customMethod();
}
}
final class CustomA extends Template {
protected function customMethod() {
}
}
答案 3 :(得分:0)
父类看不到PHP在子类中私有的任何内容。子类看不到父类中私有的任何内容。
请记住,在PHP中使用抽象方法时,可见性必须在子类与父类之间流动。在这种情况下,将可见性private
与PHP配合使用将CustomA::customMethod
完全封装在CustomA
内部。您唯一的选择是public
或protected
可见性。
由于您无法创建抽象类Template
的实例,因此可以维护客户端代码的隐私。如果使用final
关键字来防止将来的类扩展CustomA
,那么您将找到解决方案。但是,如果必须扩展CustomA
,则必须暂时了解PHP的运行方式。