类继承和$ this变量

时间:2015-07-01 19:39:16

标签: php

拥有代码

class A {
    private function foo() {}
    public function test() {
        $this->foo();
        static::foo();
    }
}

class B extends A {
    private function foo() {}
}

并采取文件说" ... $ this->将尝试从同一范围调用私有方法..."

  1. 这是什么意思"相同的范围"?
  2. " $ this"的范围是什么?在示例代码中?

3 个答案:

答案 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也可以让您对类和对象级别的范围有所了解。