Ai-je raison de supposer que les propriétés constantes sont automatiquement publiques ? Existe-t-il un moyen de les rendre privées ou protégées ?
Merci d'avance.
Ai-je raison de supposer que les propriétés constantes sont automatiquement publiques ? Existe-t-il un moyen de les rendre privées ou protégées ?
Merci d'avance.
Historiquement, les constantes de classe étaient toujours accessibles publiquement tant que la classe était chargée et il n'y avait aucun moyen de changer cela.
À partir de PHP 7.1, ils restent publics par défaut mais les modificateurs d'accès peuvent maintenant être appliqués . Voici l'exemple tiré des notes de mise à jour :
<?php
class ConstDemo
{
const PUBLIC_CONST_A = 1;
public const PUBLIC_CONST_B = 2;
protected const PROTECTED_CONST = 3;
private const PRIVATE_CONST = 4;
}
Les constantes de classe devraient avoir l'option d'être privées/protégées parce que si elles sont publiques, elles exposent des détails internes de la classe que d'autres classes/codes peuvent utiliser par erreur en pensant qu'elles peuvent être utilisées parce qu'elles sont publiques.
Il serait bon de savoir que la modification d'une constante privée n'affecte QUE la classe dans laquelle elle est définie. Malheureusement, nous n'avons pas cette option.
Rappelez-vous quand vous appreniez la conception et l'analyse d'objets... vous donnez aux méthodes et aux attributs des classes l'accès le plus RESTRICTIF possible, puis vous les assouplissez si nécessaire (il est beaucoup plus difficile de revenir en arrière parce que d'autres classes/codes commencent à les utiliser, ce qui casserait d'autres codes).
SOLUTION DE RECHANGE
Le mieux est de créer une variable privée ou protégée et de la mettre en majuscule pour indiquer qu'il s'agit d'une constante. Vous pouvez toujours créer une classe appelée constant($value_to_be_constant) qui implémente les méthodes magiques / interfaces spl correctes pour empêcher qu'elle soit modifiée.
Je suis conscient que cette question date de 6 ans
Php 7.1 (actuellement RC1) permet de spécifier la visibilité des constantes de classe.
class Token {
// Constants default to public
const PUBLIC_CONST = 0;
// Constants then also can have a defined visibility
private const PRIVATE_CONST = 0;
protected const PROTECTED_CONST = 0;
public const PUBLIC_CONST_TWO = 0;
//Constants can only have one visibility declaration list
private const FOO = 1, BAR = 2;
}
A partir de php7.1 vous pouvez définir les constantes de votre classe avec modificateurs d'accès ( public
, private
ou protected
). Regardez l'exemple suivant :
<?php
class superheroes{
public const kal_el = 'Superman';
protected const bruce_wayne = 'Batman'; # works php7.1 onwards
private const anthony_stark = 'Iron Man'; # works php7.1 onwards
public static function show_remaining(){
echo self::bruce_wayne, '<br />';
echo self::anthony_stark, '<br />';
}
}
echo superheroes::kal_el, '<br />';
superheroes::show_remaining();
Crédits : http://dwellupper.io/post/48/defining-class-constants-in-php
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.
6 votes
Quelle est la raison de les rendre cachés ? Même s'ils sont publics, ils sont en lecture seule.
2 votes
Les constantes sont censées être publiques, parce qu'elles sont destinées à décrire des faits immuables concernant la classe, et non son état. Il n'y a donc aucun intérêt à les cacher.
0 votes
On pourrait les falsifier dans les futures versions avec
__getStatic
. En général, on peut se demander si les modificateurs d'accès sont vraiment nécessaires dans les langages de script. (Javascript/Python étant beaucoup plus orientés objet n'en ont pas besoin).0 votes
Oui, c'est une question un peu stupide en y repensant. Merci pour les réponses.
18 votes
Je ne pense pas que ce soit une question stupide du tout ; les constantes de classe privées seraient utiles : Pour un usage interne à la classe ... les méthodes publiques pourraient les utiliser, mais le code extérieur ne devrait pas en dépendre ... l'API pourrait changer.
4 votes
Pour commencer, si vous voulez créer une classe de base de données, il serait logique de déclarer l'hôte, le nom d'utilisateur, le serveur et la base de données comme des constantes privées, n'est-ce pas ?
0 votes
En ASP.net, si je voulais stocker des informations statiques dont la classe a besoin mais qui ne sont pas nécessaires en dehors de la classe, j'utiliserais des constantes privées stockées en haut de la page, faciles à trouver et à modifier.