【发布时间】:2013-08-17 12:22:52
【问题描述】:
我知道我不能在 PHP 中重载方法。而且,据我所知,类中的private 方法对于扩展基类的类是不可见的。那么为什么这不起作用呢?
class Base {
private function foo($arg) {
print "Base $arg";
}
}
class Child extends Base {
public function foo() {
print "Child";
}
}
$c = new Child;
print $c->foo();
错误:
PHP Strict Standards: Declaration of Child::foo() should be compatible with Base::foo($arg) in /var/www/boludo.php on line 17
我假设foo($arg) 方法在Child 类中是不可见的,因为它是private。所以,我没有重载foo,我只是创建了一个名为foo的方法。
【问题讨论】:
-
你调用的是属性,而不是方法
-
@Simon_eQ 抱歉,现在它已修复(我正在尝试另一个代码,如果您查看错误 Child:foo() is called :P)
-
它们在核心级别不是不可见的。它们无法访问。
-
如果
Base中的某个其他方法调用$this->foo(),并且该方法在Child类型的对象中被调用,您期望得到什么?您已经覆盖了该方法,但原始代码并没有预料到它,因为该方法是私有的。 -
@enrmarc 实际上我发现它非常粗略地说:你不能对 PHP 隐藏任何东西。如果您扩展一个类,PHP 核心确实知道基类中的每个方法,无论它是私有的、公共的、受保护的、静态的等等……而且它的工作是阻止您访问它们。因此,一旦 PHP 意识到这一点,在编译时它会阻止您访问私有方法。这不是关于可见性,而是关于可访问性。例如,如果您阅读相同内容的 C# 手册,您将永远不会看到“可见性”一词:msdn.microsoft.com/en-us/library/st6sy9xe.aspx
标签: php oop overloading