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)?
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é! –
Édité ma réponse avec une solution possible. –