Prima di tutto: A quite similar problem è stato pubblicato e in qualche modo risolto già, ma non risponde ancora al mio problema specifico. Maggiori informazioni su questo più tardi.PHP Il metodo padre ereditato non può accedere alla proprietà privata del figlio
In parole: Ho una classe base che fornisce alcuni metodi a tutti i childs, ma non contiene alcuna proprietà. Mio figlio eredita questi metodi, che dovrebbero essere usati per accedere alle proprietà del bambino. Se la proprietà del figlio è protected
o public
, tutto funziona correttamente, ma se la proprietà del figlio è private
, ha esito negativo senza errori (non succede nulla).
in codice:
class MyBaseClass {
public function __set($name, $value) {
if(!property_exists($this, $name))
throw new Exception("Property '$name' does not exist!");
$this->$name = $value;
}
}
class ChildClass extends MyBaseClass {
public $publicProperty;
protected $protectedProperty;
private $privateProperty;
}
$myChild = new ChildClass();
$myChild->publicProperty = 'hello world'; //works of course!
$myChild->protectedProperty = 'hello world'; //works as expected
$myChild->privateProperty = 'hello world'; //doesn't work?
il suddetto problema simile ha ottenuto la soluzione di utilizzare il metodo magico __set()
per accedere alle proprietà private, ma questo io sto già facendo. Se implemento __set()
all'interno del bambino, funziona ovviamente, ma l'idea è che il figlio erediti lo __set()
dal suo genitore, ma ovviamente non può accedere al metodo privato del figlio.
Lo fa apposta? Sto sbagliando qualcosa di sbagliato? o il mio approccio è solo una schifezza di design?
Background: La mia idea originale era: Il tutto dinamico su __set()
è una cosa che non mi piace. Di solito una proprietà privata dovrebbe mai essere accessibile dall'esterno, quindi ho implementato lanciando metodi __set- e __get nella mia ultima classe base (da cui ereditano tutte le classi).
Ora voglio generare dinamicamente un'istanza da un file XML e quindi ho bisogno di accedere alle proprietà. Ho fatto la regola, che qualsiasi classe XML-istanzabile ha bisogno di implementare il magico metodo __set()
e quindi può essere creato dinamicamente. Invece di implementarlo in ogni classe che potrebbe essere generata un giorno, ho deciso di farli ereditare da una classe chiamata come class Spawnable { }
che fornisce il metodo __set necessario.
Questo non dovrebbe funzionare ... Questo '$ myChild-> protectedProperty = 'hello world';' dovrebbe generare un errore irreversibile ... Come la proprietà private. http://php.net/manual/en/language.oop5.visibility.php – dododedodonl