拥有代码
class A {
private function foo() {}
public function test() {
$this->foo();
static::foo();
}
}
class B extends A {
private function foo() {}
}
并采取文件说" ... $ this->将尝试从同一范围调用私有方法..."
答案 0 :(得分:1)
来自相同范围&#39; 1 的措辞意味着来自相同类的定义此方法< / EM>&#39;
在这种情况下,{A}中定义了test
。因此,$this->foo()
会调用A foo
- 如果$this
是A或B,则无关紧要,因为private
方法是不是 polymorphic。
将此与 多态的protected
方法进行对比,因此更改访问修饰符会改变行为;和删除相同的范围&#39;条款
至于为什么会这样,考虑修饰符的作用:
声明受保护的成员只能在类本身以及继承和父类中访问。 声明为私有的成员只能由定义该成员的 [相同]类访问。
这意味着$this->foo()
(来自A&#39的测试)无法可能会调用B的foo,否则会违反此限制。其他OOP语言的工作原理相同,原因相同:只有多态才能使调用者可以访问该方法。
请参阅Why are private methods not working with polymorphism?哪个确实是重复的,尽管问题是根据经验丰富的行为编写的。
1 这个&#39;相同的范围&#39;措辞适用于如何解决方法,并且不直接与$this
相关。 $this
的词法范围是一个特殊变量,它是当前的实例方法;并且$this
的值是调用该方法的实例的值。
答案 1 :(得分:0)
$这在类本身的范围内是有效的,所以在类B中调用$ this-&gt; foo将调用类B的foo()函数,因为它在B的范围内,如果你想调用foo在类B中的类A的(),使用父关键字引用它:
parent :: foo(),在这种情况下,foo不在B的本地范围内,它在父范围内。
答案 2 :(得分:0)
here对$this
调用方法时,伪变量$ this可用 在对象上下文中。 $ this是对调用对象的引用 (通常是方法所属的对象,但可能是另一个 object,如果从a的上下文静态调用该方法 次要对象)。
PHP's visibility也可以让您对类和对象级别的范围有所了解。