PHP Traits - la définition des constantes génériques
Quelle est la meilleure façon de définir des constantes qui peuvent être utilisées par un certain nombre de classes au sein d'un espace de noms? J'essaie d'éviter de trop héritage afin d'étendre les classes de base n'est pas une solution idéale et j'ai du mal à trouver une bonne solution à l'aide de traits. Est-ce de quelque manière possible en PHP 5.4 ou faut une autre approche?
J'ai la situation suivante:
trait Base
{
//generic functions
}
class A
{
use Base;
}
class B
{
use Base;
}
Le problème est qu'il n'est pas possible de définir des constantes PHP traits. Idéalement ce que je veux c'est quelque chose comme ce qui suit:
trait Base
{
const SOME_CONST = 'someconst';
const SOME_OTHER_CONST = 'someotherconst';
//generic functions
}
Puis ceux-ci pourraient être consulté si la classe qui s'applique le trait:
echo A::SOME_CONST;
echo B::SOME_OTHER_CONST;
Mais en raison des limites de traits, ce n'est pas possible. Des idées? Merci.
- Vous peut l'utilisation des propriétés statiques, ce n'est pas une constante, mais il est également à seulement un caractère différent à l'appeler...
public static $SOME_VAR = 'someconst';
etecho B::$SOME_VAR
- Merci pour l'astuce. C'est une option bien que c'est un refactoriser le code du travail, et pas de nouveau code, donc je préfère le comportement de rester le même, plutôt que de mettre à jour tous les appels incessants (il y en a beaucoup).
- Vous pouvez utiliser l'interface de déclarer consts.
- bugs.php.net/bug.php?id=70986
- bugs.php.net/bug.php?id=70986 a été remplacé par bugs.php.net/bug.php?id=75060 maintenant,
Vous devez vous connecter pour publier un commentaire.
J'ai fini à l'aide de @sectus suggestion d'interfaces comme il se sent comme la moins problématique façon de gérer cela. À l'aide d'une interface pour stocker des constantes plutôt que les contrats d'API a une mauvaise odeur à ce sujet mais peut-être que ce problème est plus sur OO concevoir qu'un trait de mise en œuvre. Je ne suis pas encore parfaitement à l'aise avec cette solution n'accepte pas la réponse pour un tandis que dans le cas où quelqu'un a une meilleure suggestion.
Qui permet de:
constant
, il n'est pas destiné à changer.static::VALIDATION_REGEX
pour obtenir le fin de la statique lié valeur)Vous pouvez également utiliser des variables statiques. Ils peuvent être utilisés dans la classe ou le trait lui-même. - Fonctionne très bien pour moi comme un remplacement pour const.
À limiter la portée de votre constantes, vous pouvez définir à l'intérieur d'un espace de noms:
Un inconvénient de cette approche est que le chargement automatique ne fonctionne pas pour les constantes, au moins pas pour 5,4; typique de la façon de contourner cela est d'envelopper ces constantes dans une classe statique, c'est à dire:
Pas une bonne idée, mais peut-être...
il y a un peu hackish façon de faire cela, par la définition d'une constante, alors le retour de cette constante avec votre trait fonctions:
Autre chose à considérer est de savoir si ou non vous pouvez utiliser une classe abstraite au lieu de cela, et puis hériter.
Bien sûr, une partie de la raison pour traits est de remplacer l'héritage complexe arbres avec la composition. Dépend de la situation.