182 votes

PHP 5 : const et static

En PHP 5, quelle est la différence entre l'utilisation de la fonction const y static ?

Quand chacun d'eux est-il approprié ? Et quel rôle joue le public , protected y private le jeu - le cas échéant ?

203voto

Matt Huggins Points 16854

Dans le contexte d'une classe, les variables statiques sont sur la portée de la classe (et non de l'objet), mais contrairement à une const, leurs valeurs peuvent être modifiées.

class ClassName {
    static $my_var = 10;  /* defaults to public unless otherwise specified */
    const MY_CONST = 5;
}
echo ClassName::$my_var;   // returns 10
echo ClassName::MY_CONST;  // returns 5
ClassName::$my_var = 20;   // now equals 20
ClassName::MY_CONST = 20;  // error! won't work.

Public, protected et private ne sont pas pertinents en termes de consts (qui sont toujours publics) ; ils ne sont utiles que pour les variables de classe, y compris les variables statiques.

  • Les variables statiques publiques sont accessibles partout via ClassName::$variable.
  • Les variables statiques protégées sont accessibles par la classe qui les définit ou par les classes étendues via ClassName::$variable.
  • Les variables statiques privées ne sont accessibles que par la classe qui les définit, via ClassName::$variable.

Edit : Il est important de noter que PHP 7.1.0 a introduit la possibilité de spécifier la visibilité des constantes de classe. .

30 votes

Je préfère utiliser self::$variable pour les variables protected static et private static car je préfère que le nom de la classe ne soit mentionné qu'une seule fois en son sein, c'est-à-dire au tout début de la classe.

3 votes

Oui, bon point, j'ai oublié de mentionner que le mot-clé self peut être utilisé si l'on fait référence à l'intérieur de la classe elle-même. Les exemples que j'ai fournis ci-dessus étaient réalisés en dehors de la définition de la classe, auquel cas le nom de la classe doit être utilisé.

0 votes

Excellente réponse, très proche de l'acceptation. Pourriez-vous clarifier un point : "Public, protected, et private ne sont pas pertinents en termes de consts" - Pourquoi ? Les constantes sont-elles par défaut toutes publiques ? toutes privées ?

20voto

luoshiben Points 61

Un dernier point qu'il convient de souligner est qu'une const est toujours statique et publique. Cela signifie que vous pouvez accéder à la const depuis l'intérieur de la classe, comme suit :

class MyClass
{
     const MYCONST = true;
     public function test()
     {
          echo self::MYCONST;
     }
}

De l'extérieur de la classe, vous y accédez de la manière suivante :

echo MyClass::MYCONST;

1 votes

Cette déclaration est-elle vraie ? que "const est toujours statique et public" ?

7 votes

Ce n'est plus le cas. Depuis PHP 7.1, les constantes de classe peuvent être déclarées privées ou protégées. Voir RFC

12voto

Mike Borozdin Points 196

Constant est juste une constante, c'est-à-dire que vous ne pouvez pas changer sa valeur après l'avoir déclarée.

Statique est accessible sans faire d'instance d'une classe et donc partagée entre toutes les instances d'une classe.

De plus, il peut y avoir un statique variable locale dans une fonction qui n'est déclarée qu'une seule fois (lors de la première exécution d'une fonction) et qui peut stocker sa valeur entre les appels de fonction, exemple :

function foo()
{
   static $numOfCalls = 0;
   $numOfCalls++;
   print("this function has been executed " . $numOfCalls . " times");
}

4voto

alexn Points 25639

Déclarer une méthode ou une propriété de classe comme statique les rend accessibles sans avoir besoin d'une instanciation de la classe.

Une constante de classe est comme une constante normale, elle ne peut pas être modifiée au moment de l'exécution. C'est également la seule raison pour laquelle vous utiliserez jamais const.

Private, public et protected sont des modificateurs d'accès qui décrivent qui peut accéder à quel paramètre/méthode.

Public signifie que tous les autres objets peuvent y avoir accès. Private signifie que seule la classe instanciée y a accès. Protégé signifie que la classe instanciée et les classes dérivées y ont accès.

2voto

d.raev Points 1382

Donc, pour récapituler la réponse de @Matt :

  • si la propriété dont vous avez besoin ne doit pas être modifiée, alors une constante est le bon choix.

  • si la propriété dont vous avez besoin est autorisée à être modifiée, utilisez plutôt static

Exemple :

class User{
    private static $PASSWORD_SALT = "ASD!@~#asd1";
    ...
}

class Product{
    const INTEREST = 0.10;
    ...
}

Edit : Il est important de noter que PHP 7.1.0 a introduit la possibilité de spécifier la visibilité des constantes de classe. .

Prograide.com

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.

Powered by:

X