PHP Hérité de la méthode parent ne peut pas l'accès de l'enfant à la propriété privée
Tout d'abord: Une tout à fait le même problème a été posté, et en quelque sorte résolu, mais n'est toujours pas répondre à mon problème spécifique. Plus sur cela plus tard.
Dans les mots: j'ai une classe de base qui fournit des méthodes pour tous les enfants, mais ne contiennent pas de propriété. Mon enfant est hériter de ces méthodes, qui devrait être utilisé pour l'accès de l'enfant propriétés.
Si les biens de l'enfant est protected
ou public
, tous fonctionne bien, mais si les biens de l'enfant est private
, il échoue sans erreur (tout ne se passe rien).
Dans le code:
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?
Le ci-dessus mentionné problème similaire ont la solution pour utiliser la magie __set()
méthode pour accéder aux propriétés privées, mais ce que je fais déjà. Si j'en œuvre __set()
à l'intérieur de l'enfant, il fonctionne bien, mais l'idée est que l'enfant hérite de la __set()
de son parent, mais évidemment il ne peut pas accéder à l'enfant privé de méthode.
Est que sur le but? Suis-je doinf quelque chose de mal? ou est-ce mon approche c'est de la merde?
De fond:
Mon idée de départ était: l'ensemble de La dynamique chose à propos de __set()
est quelque chose que je n'aime pas. Généralement une propriété privée doit jamais être accessibles de l'extérieur, j'ai donc mis en œuvre en jetant __et __get-méthodes dans mon ultime de la classe de base (à partir de laquelle toutes les classes héritent).
Maintenant, je veux dynamicially frayer une instance à partir d'un fichier XML et, par conséquent, ont besoin d'accéder aux propriétés. J'ai fait de la règle, que toute XML-instantiatable les besoins de la classe pour mettre en œuvre la magie __set()
méthode et peut donc être créé dynamicially. Au lieu de la mettre en œuvre, dans chaque Classe, qui pourrait être engendré un jour, j'ai décidé de les faire hériter d'une classe appelée comme class Spawnable { }
qui fournit le nécessaire, __set-méthode.
$myChild->protectedProperty = 'hello world';
doit générer une erreur Fatale... Même que le privateProperty. php.net/manual/en/language.oop5.visibility.phpOriginalL'auteur Jan | 2010-10-26
Vous devez vous connecter pour publier un commentaire.
C'est la différence entre
private
etprotected
. Les méthodes et propriétés privées ne peut pas être héritée ou atteint. Vous aurez besoin de les changer pour protégé la place.Voir le manuel sur la visibilité
Parent::Method()
. De sorte qu'il devient hors de la visibilité et peut - bien sûr - seulement l'accès du public et des champs protégés. C'est très insatisfaisante, même si je sais que maintenant. Merci beaucoup pour votre aide!OriginalL'auteur Emil Vikström
Je suppose que vous pourriez la mode quelque chose à l'aide de la Réflexion. Par exemple, dans votre lieu de "spawn" de la classe:
Pas la plus jolie du code.
...bien sûr, ce n'est pas la meilleure approche, mais en général je garder mes soldats scellés de toute façon. J'ai juste besoin de mettre en œuvre .NET est d'avoir du XML-Configs avec des objets qui peuvent être instanciée au moment de l'exécution. Fonctionnalité très intéressante qui je veux dans mon framework php. Merci pour l'astuce, je vais vérifier le reflet de la documentation.
Oui, toutes sortes de méchanceté peut être fait avec la réflexion. Gardez à l'esprit que c'est assez lent, même si.
OriginalL'auteur Frode
Après avoir examiné mon concept, je pense que c'est une mauvaise idée, pour aller avec cette approche. C'est un problème général avec PHP absence de différences entre les propriétés et les champs. Bien sûr champs privés devraient jamais être accessibles de l'extérieur, mais uniquement les propriétés qui sont définies par le programmeur. L'absence d'auto-propriétés (et je ne parle pas de ces petites méthodes
__set()
et__get()
) ou de certaines règles conventionnelles pour l'accès à la propriété, il est difficile de deviner la convention de nommage a été utilisé par le programmeur lors de la mise en œuvre de setters pour les champs privés de la classe.Le meilleur concept, ici peut-être, à s'appuyer sur l'existence de bien-nommé setters pour chaque lieu de "spawn" de la classe, même si elle peut briser, si quelqu'un a contribué code, ce qui n'est pas la mise en œuvre de la devrait classiques nommé setters.
Cependant, un grand merci pour vos pensées et vos conseils!
stackoverflow.com/a/295109/489772
OriginalL'auteur Jan