PHP如何在继承链中区分$this指针?

PHP如何在继承链中区分$this指针?,php,inheritance,Php,Inheritance,请看下面截取的代码 class A { function __get($name) { if ($name == 'service') { return new Proxy($this); } } function render() { echo 'Rendering A class : ' . $this->service->get('title'); } protected function resource

请看下面截取的代码

class A
{
  function __get($name)
  {
    if ($name == 'service') {
        return new Proxy($this);
    }
  }

  function render()
  {
    echo 'Rendering A class : ' . $this->service->get('title');
  }

  protected function resourceFile()
  {
    return 'A.res';
  }
}

class B extends A
{
  protected function resourceFile()
  {
    return 'B.res';
  }

  function render()
  {
    parent::render();

    echo 'Rendering B class : ' . $this->service->get('title');
  }
}

class Proxy
{
  private $mSite = null;

  public function __construct($site)
  {
    $this->mSite = $site;
  }

  public function get($key)
  {
     // problem here
  }
}

// in the main script
$obj = new B();
$obj->render();
问题是:在类“Proxy”的方法“get”中,如何仅使用$mSite(对象指针)提取相应的资源文件名(resourceFile返回名称)?

如何:

public function get($key)
{
    $file = $this->mSite->resourceFile();
}
但这要求
A::resourceFile()
必须是
公共的
,否则无法从对象范围之外访问该方法-这就是访问修饰符的设计目的

编辑:

好吧,现在我想我明白了,你想要实现什么。以下示例应演示所需的行为:

class A 
{
    private function _method() 
    { 
        return 'A'; 
    }

    public function render() 
    { 
        echo $this->_method(); 
    }
}

class B extends A 
{
    private function _method() 
    {
        return 'B'; 
    }

    public function render() 
    {
        parent::render();
        echo $this->_method();
    }
}

$b = new B();
$b->render(); // outputs AB

但是如果你问我-我想你应该考虑一下你的设计,因为这个解决方案似乎有点粗糙,对于查看代码的人来说很难理解。

不,如果这很简单,我不会在这里问,我是从其他人那里问的,因为我在黑匣子里,无处可去。是的,resourceFile方法是公共的,这是我的错。问题是当它是可重写的方法时,它总是在派生类中被重写。因此,当调用B对象的render方法时,它也会调用父类render方法,因此B对象会调用代理的get方法,同时,父对象A也会调用代理的get方法,代理类无法区分A和B,它总是调用B的resourceFile,因为它被覆盖了!用可能的解决方案编辑了我的答案。