PHP Как отличить этот указатель в цепочке наследования? - PullRequest
1 голос
/ 26 июня 2009

Пожалуйста, обратите внимание на следующий код:

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();

Вопрос в том, как: в методе 'get' класса 'Proxy' как извлечь соответствующее имя файла ресурсов (resourceFile возвращает имя), используя только $ mSite (указатель объекта)?

1 Ответ

3 голосов
/ 26 июня 2009

А как же:

public function get($key)
{
    $file = $this->mSite->resourceFile();
}

Но для этого необходимо, чтобы A::resourceFile() было public, иначе вы не сможете получить доступ к методу вне области видимости объекта - для этого и были разработаны модификаторы доступа.

EDIT:

ОК - теперь я думаю, что понимаю, чего вы хотите достичь. Следующий пример должен продемонстрировать желаемое поведение:

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

Но если вы спросите меня - я думаю, вы должны подумать о своем дизайне, поскольку решение кажется несколько хакерским и трудным для понимания тем, кто смотрит на код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...