Position actuelle: Accueil> Derniers articles> La raison pour laquelle get_defined_constants () ne renvoie pas les constantes de classe

La raison pour laquelle get_defined_constants () ne renvoie pas les constantes de classe

M66 2025-05-23

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.

Que sont les constantes de classe?

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 de la fonction get_defined_constants ()

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.

Pourquoi les constantes de classe n'apparaissent-elles pas dans get_defined_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.

Pourquoi est-il approprié de ne pas retourner les constantes de classe?

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.

Comment remplacer get_defined_constants () pour obtenir des constantes de classe?

Si vous devez accéder à toutes les constantes, y compris les constantes de classe, vous pouvez le faire en:

  1. Utilisez ReflectionClass pour obtenir des constantes de classe:

 $reflectionClass = new ReflectionClass('MyClass');
$classConstants = $reflectionClass->getConstants();
print_r($classConstants);
  1. 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.

  2. É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.

Résumer

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.