2012-04-08 3 views
2

Je voudrais empêcher une classe enfant de redéclarer les attributs de certains parents. Comment puis-je faire cela?Comment faire un attribut final dans une classe PHP?

EDIT: Si ma classe parent a une propriété « title », je ne veux pas que les enfants peuvent (re) déclarer la propriété avec ce nom

+0

Cela n'a pas de sens. Un enfant peut toujours «redéclarer» la propriété, mais cela ne fait aucune différence **. Probablement c'est pourquoi il n'y a pas de propriétés "finales", vous n'avez tout simplement pas besoin de ce genre de chose. – hakre

Répondre

4

Je ne sais pas si cela va fonctionner, mais vous pouvez essayer de jouer avec la classe de réflexion et de détecter si un enfant a redéclarée la propriété et le feu une exception ou quelque chose

MISE À JOUR:

vérifier ce lien sur:

http://www.php.net/manual/en/reflectionproperty.getdeclaringclass.php

et

http://www.php.net/manual/en/reflectionproperty.setaccessible.php

Il devrait aider

+0

C'est ce que je pensais. Mais avant de faire cela, je demande un mot clé "final" pour la classe variable – TeChn4K

+0

php n'a pas de mot-clé final pour les propriétés, seulement pour les méthodes –

3

Si vous voulez dire pour les variables de la classe, tout simplement les rendre privés :

private $var = 1; 
+1

N'est-ce pas la question des propriétés, pas des méthodes? –

+2

Je n'étais pas sûr, donc mettre les deux – BenOfTheNorth

+0

Oui, il s'agit de propriétés. Mais avec private var, la classe enfant peut déclarer des propriétés avec le même nom, non? Je ne veux pas ça! – TeChn4K

0

Définir la variable de classe comme privée.

private $_var = 'would not be changed by a child class'; 
+1

' private $ _var = 'ne serait pas modifié par une classe enfant, ni même utilisable dans la classe enfant'; ' –

+0

@EliasVanOotegem: autant que je sache, la tâche était d'empêcher redéclarer. S'il peut y avoir un besoin de lire l'accès - pas de problème pour écrire un getter. – MFix

+0

vrai, mais voir la mise à jour de ma réponse. La prudence est recommandée, en particulier lors de l'utilisation de setters, ou si la variable privée est initialisée dans le constructeur de la classe parente –

Questions connexes