Comment puis-je définir une constante à l'intérieur d'une classe et la rendre visible uniquement lorsqu'elle est appelée dans un contexte de classe?
....quelque chose comme Foo::app()->MYCONSTANT;
(et s'il est appelé comme MYCONSTANT
pour être ignoré)
Réponses:
Voir les constantes de classe :
class MyClass { const MYCONSTANT = 'constant value'; function showConstant() { echo self::MYCONSTANT. "\n"; } } echo MyClass::MYCONSTANT. "\n"; $classname = "MyClass"; echo $classname::MYCONSTANT. "\n"; // As of PHP 5.3.0 $class = new MyClass(); $class->showConstant(); echo $class::MYCONSTANT."\n"; // As of PHP 5.3.0
Dans ce cas , en écho
MYCONSTANT
par lui - même soulèverait un avis au sujet d' une constante indéfinie et la sortie de la constante nom converti en une chaîne:"MYCONSTANT"
.EDIT - Peut-être que vous recherchez ces propriétés / variables statiques :
class MyClass { private static $staticVariable = null; public static function showStaticVariable($value = null) { if ((is_null(self::$staticVariable) === true) && (isset($value) === true)) { self::$staticVariable = $value; } return self::$staticVariable; } } MyClass::showStaticVariable(); // null MyClass::showStaticVariable('constant value'); // "constant value" MyClass::showStaticVariable('other constant value?'); // "constant value" MyClass::showStaticVariable(); // "constant value"
la source
(is_null(self::$staticVariable) === true) && (isset($value) === true)
serait beaucoup plus succinct queself::$staticVariable === null && $value !== null
.$value
sera toujours défini dans la fonction, donc pas besoin d'utiliserisset
. Et l'hyper-explicite=== true
n'ajoute rien.C'est une vieille question, mais maintenant sur PHP 7.1, vous pouvez définir une visibilité constante.
EXEMPLE
<?php class Foo { // As of PHP 7.1.0 public const BAR = 'bar'; private const BAZ = 'baz'; } echo Foo::BAR . PHP_EOL; echo Foo::BAZ . PHP_EOL; ?>
Sortie de l'exemple ci-dessus en PHP 7.1:
Plus d'infos ici
la source
class Foo { const BAR = 'baz'; } echo Foo::BAR;
C'est la seule façon de créer des constantes de classe . Ces constantes sont toujours globalement accessibles via
Foo::BAR
, mais elles ne sont pas accessibles via justeBAR
.Pour obtenir une syntaxe comme celle-ci
Foo::baz()->BAR
, vous devez renvoyer un objet de la fonctionbaz()
de classeFoo
qui a une propriétéBAR
. Ce n'est pas une constante cependant. Toute constante que vous définissez est toujours accessible globalement de n'importe où et ne peut pas être limitée aux résultats des appels de fonction.la source
C'est une question assez ancienne, mais peut-être que cette réponse peut encore aider quelqu'un d'autre.
Vous pouvez émuler une constante publique restreinte dans une portée de classe en appliquant le mot-clé final à une méthode qui renvoie une valeur prédéfinie, comme ceci:
class Foo { // This is a private constant final public MYCONSTANT() { return 'MYCONSTANT_VALUE'; } }
Le mot clé final sur une méthode empêche une classe étendue de redéfinir la méthode. Vous pouvez également placer le mot-clé final devant la déclaration de classe, auquel cas le mot-clé empêche l'héritage de classe.
Pour obtenir presque exactement ce qu'Alex recherchait, le code suivant peut être utilisé:
final class Constants { public MYCONSTANT() { return 'MYCONSTANT_VALUE'; } } class Foo { static public app() { return new Constants(); } }
La valeur constante émulée serait accessible comme ceci:
la source
Vous pouvez définir une constante de classe en php. Mais votre constante de classe serait également accessible à partir de n'importe quelle instance d'objet. C'est la fonctionnalité de php. Cependant, à partir de php7.1 , vous pouvez définir vos constantes de classe avec des modificateurs d'accès (
public
,private
ouprotected
).Une solution serait de définir votre constante comme
private
ouprotected
, puis de la rendre lisible via un fichierstatic function
. Cette fonction ne doit renvoyer les valeurs constantes que si elle est appelée à partir du contexte statique.Vous pouvez également créer cette fonction statique dans votre classe parente et simplement hériter de cette classe parente sur toutes les autres classes pour en faire une fonctionnalité par défaut.
Crédits: http://dwellupper.io/post/48/defining-class-constants-in-php
la source