Ok. Je suppose que vous ne parlez pas de modèles de comportement actA réels.
Si vous définissez une nouvelle méthode __get(), elle remplacera automatiquement la méthode __get() du parent.
Maintenant dans votre nouvelle méthode __get(), vous vérifiez d'abord si elle existe dans votre instance actuelle, puis celle du parent.
Je piraté cela ensemble (gardez à l'esprit, il est presque minuit):
<?php
class bar {
public $data = array();
public function __construct() {
$this->data['virtual_field'] = "set in bar";
}
public function __get($name) {
if(array_key_exists($name, $this->data)) {
return $this->data[$name];
}
return null;
}
public function __set($name, $value) {
$this->data[$name] = $value;
}
}
class foo extends bar {
public $data = array();
public function __construct() {
}
public function __get($name) {
if(array_key_exists($name, $this->data)) {
return $this->data[$name];
}
if (parent::__get($name))
return parent::__get($name);
return null;
}
public function __set($name, $value) {
$this->data[$name] = $value;
}
}
$a = new foo;
echo $a->virtual_field;
Maintenant, je ne sais pas comment cela fonctionne bien pour ce que vous essayez d'atteindre.
+1 pour cette bonne question. Mais qu'est-ce que vous entendez exactement par «effacer le champ»? – greg0ire
Eh bien, je pense qu'une meilleure chose à dire serait "Si je trouve un appel vitrual_field, n'appelez pas le parent __get()" – mattalxndr