PHP nasıl miras zincirinin bu işaretçi $ ayırt?

1 Cevap php

Snipped aşağıdaki koda bakın lütfen

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

Soru: yöntemde sınıf 'Vekaleten' of 'olsun', ben sadece $ mSite (nesne işaretçisi) kullanarak gelen kaynak dosya adı (resourceFile adını döndürür) ayıklamak nasıl?

1 Cevap

Ne hakkında:

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

Ama bu A::resourceFile() olmak public , aksi takdirde nesne kapsam dışında yöntemi erişemez gerektirir - bu erişim düzenleyiciler için dizayn edilmiştir buydu.

EDIT:

Tamam - Şimdi ben sana ne elde etmek istediğinizi, anlıyorum düşünüyorum. Aşağıdaki örnek, istenen davranışı göstermelidir:

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

Ama bana sorarsan - çözüm kodu arayan birisi için anlaşılması biraz hacky ve sert görünüyor bence sizin tasarım düşünmek gerekir.