Dans PHP, get_defined_constants () est une fonction très utile qui renvoie un tableau associatif contenant toutes les constantes définies. Cette fonction est généralement utilisée pour faire définir toutes les constantes lors de l'exécution actuelle du script. Vous pouvez rencontrer un problème comme ceci: lorsque vous utilisez get_defined_constants () , les constantes de classe n'apparaissent pas dans le résultat de retour. Alors, pourquoi cela se produit-il? Dans cet article, nous explorerons ce problème en profondeur.
Tout d'abord, nous devons comprendre le concept des constantes de classe. En PHP, les constantes de classe sont des constantes associées aux classes, et non des instances d'objet. Les constantes de classe sont définies par le mot clé const et sont accessibles à l'intérieur et à l'extérieur de la classe, mais leur portée est limitée à cette classe et à sa classe héritée. Un exemple de définition d'une constante de classe est le suivant:
class MyClass {
const MY_CONSTANT = 'This is a class constant';
}
echo MyClass::MY_CONSTANT; // Sortir:This is a class constant
La différence entre les constantes de classe et les quantités générales est que les quantités générales sont globales, tandis que les constantes de classe sont limitées à l'étendue des classes et à leur héritage.
La fonction get_defined_constants () renvoie toutes les constantes définies dans le script PHP actuel, y compris les constantes prédéfinies et les constantes que vous définissez dans le script. Vous pouvez l'utiliser comme ceci:
$constants = get_defined_constants();
print_r($constants);
Cela produit un tableau associatif contenant tous les noms et valeurs constants.
Bien que get_defined_constants () puisse énumérer la plupart des constantes, il ne renvoie pas les constantes de classe. En effet, le système constant de PHP traite les constantes de classe comme faisant partie d'une classe, et non des constantes mondiales. Par conséquent, get_defined_constants () ne renvoie que les constantes globales par défaut et ne renvoie pas les constantes liées à une classe ou une instance d'objet spécifique.
Si vous avez besoin d'obtenir des constantes de classe, vous devez y accéder d'autres manières, par exemple via la classe ReflectionClass . Voici un exemple d'obtention des constantes de classe:
$reflectionClass = new ReflectionClass('MyClass');
$classConstants = $reflectionClass->getConstants();
print_r($classConstants);
Cette méthode renverra toutes les constantes de la classe MyClass , et vous pouvez y accéder comme vous y accédez normalement.
Bien que cela puisse sembler une limitation de PHP, en fait, cette conception est conforme aux principes de la programmation orientée objet (POO). Dans la POO, les constantes de classe appartiennent à une classe spécifique, ne faisant pas partie de la portée mondiale. Leur portée est généralement limitée et appartient à la définition de la classe, pas partie de l'environnement mondial. Par conséquent, l'exclusion des constantes de classe du résultat de retour de get_defined_constants () est d'éviter de polluer l'espace de noms global et de garder la portée des constantes claires.
Si vous devez accéder à toutes les constantes, y compris les constantes de classe, vous pouvez le faire en:
Utilisez ReflectionClass pour obtenir des constantes de classe:
$reflectionClass = new ReflectionClass('MyClass');
$classConstants = $reflectionClass->getConstants();
print_r($classConstants);
Recueillir manuellement les constantes de classe:
Vous pouvez collecter manuellement les constantes de classe séparément des constantes mondiales, stocker les constantes de classe à l'intérieur de la classe ou les gérer de manière centralisée d'autres manières.
Étendre get_defined_constants () :
Vous pouvez créer une fonction personnalisée qui combine get_defined_constants () et réflexion pour renvoyer toutes les constantes, y compris les constantes de classe.
function get_all_constants() {
$constants = get_defined_constants();
$classes = get_declared_classes();
foreach ($classes as $class) {
$reflectionClass = new ReflectionClass($class);
$constants = array_merge($constants, $reflectionClass->getConstants());
}
return $constants;
}
$allConstants = get_all_constants();
print_r($allConstants);
Cette méthode renvoie les constantes mondiales ainsi que les constantes de classe.
La fonction GET_DEFINED_CONSTANTS () de PHP ne renvoie pas les constantes de classe car les constantes de classe appartiennent à la portée de définition de la classe, pas des constantes mondiales. Pour accéder aux constantes de classe, vous pouvez les obtenir via ReflectionClass ou personnaliser des méthodes pour répertorier les constantes de classe avec des constantes mondiales. Le but de cela est de garder la portée des constantes claires et de suivre les principes de la programmation orientée objet.