2009-06-26 7 views
1

S'il vous plaît consulter le code suivant Snipped

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

La question est: dans la méthode « get » de la classe « Proxy », comment j'extraire le nom de fichier de ressources correspondant (RESOURCEFILE renvoie le nom) en utilisant seulement mSite $ (pointeur d'objet)?

Répondre

3

Qu'en est-:

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

Mais cela nécessite A::resourceFile() être public sinon vous ne pouvez pas accéder à la méthode de l'extérieur du champ d'objet - c'est ce que les modificateurs d'accès ont été conçus pour.

EDIT:

OK - maintenant, je pense que je ne comprends, ce que vous voulez atteindre. L'exemple suivant doit démontrer le comportement souhaité:

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 

Mais si vous me demandez - je pense que vous devriez penser à votre conception comme la solution semble quelque peu hacky et difficile à comprendre pour quelqu'un qui cherche le code.

+0

Non, si c'était si simple, je ne le demanderais pas ici, je demande cela à d'autres, parce que j'ai dans la boîte noire, nulle part où aller. oui, la méthode resourceFile EST publique, c'est de ma faute. Le problème est quand c'est la méthode overridable, et elle est toujours surchargée dans les classes dérivées. Ainsi, lorsque la méthode de rendu de l'objet B est appelée, elle appelle la méthode de rendu des classes parentes, donc l'objet B appelle la méthode get du Proxy et l'objet parent A appelle aussi la méthode get du Proxy, la classe Proxy n'a aucun moyen de différencier A et B , il appelle toujours le resourceFile de B, car il est surchargé! –

+0

Édité ma réponse avec une solution possible. –

Questions connexes