Dans le contexte d'une classe, les variables statiques sont sur la portée de la classe (pas l'objet), mais contrairement à un const, leurs valeurs peuvent être modifiées.
classClassName{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 5ClassName::$my_var =20;// now equals 20ClassName::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 n'importe où via ClassName :: $ variable.
les variables statiques protégées sont accessibles par la classe de définition ou par l'extension des classes via ClassName :: $ variable.
les variables statiques privées ne sont accessibles que par la classe de définition via ClassName :: $ variable.
Je préfère utiliser self::$variablepour les variables statiques protégées et privées, car je préfère ne garder le nom de classe mentionné qu'une seule fois en lui-même, ce qui est au tout début de la classe.
Lukman
3
Oui, bon point, j'ai négligé de mentionner que le mot-clé self peut être utilisé en cas de référencement depuis la classe elle-même. Les exemples que j'ai fournis ci-dessus ont été exécutés en dehors de la définition de classe, auquel cas le nom de classe doit être utilisé.
Matt Huggins
Excellente réponse, très proche d'accepter. Pourriez-vous s'il vous plaît clarifier un point: "Public, protégé et privé ne sont pas pertinents en termes de consts" - Pourquoi? Les consts sont-ils tous publics par défaut? tout privé?
Chris Jacob
1
un var statique n'a- $t-il pas besoin d'un ? static $my_var = 10;dans la définition
Daniel W.
Ancien fil de discussion, mais j'aimerais ajouter quelque chose: consultez php.net/manual/en/ ... , qui explique que les staticvariables sont également très utiles dans les singletons et les fonctions récursives. Parce que vous POUVEZ changer la valeur mais la variable ne sera initialisée qu'une seule fois. Voir stackoverflow.com/questions/203336/ ... pour plus d'explications sur la création d'un singleton. Pour moi, ce sont des situations dans lesquelles je préfère les variables statiques.
Erik van de Ven
20
Un dernier point à souligner est qu'un const est toujours statique et public. Cela signifie que vous pouvez accéder au const depuis la classe comme suit:
cette déclaration est-elle vraie? que "const est toujours statique et public"?
apil.tamang
7
Ce n'est plus vrai. Depuis PHP 7.1, les constantes de classe peuvent être déclarées privées ou protégées. Voir RFC
DisgruntledGoat
11
La constante est juste une constante, c'est-à-dire que vous ne pouvez pas changer sa valeur après la déclaration.
La variable statique est accessible sans faire d'instance de classe et donc partagée entre toutes les instances d'une classe.
De plus, il peut y avoir une variable locale statique dans une fonction qui n'est déclarée qu'une seule fois (lors de la première exécution d'une fonction) et peut stocker sa valeur entre les appels de fonction, exemple:
function foo(){static $numOfCalls =0;
$numOfCalls++;print("this function has been executed ". $numOfCalls ." times");}
Lorsque vous parlez d'héritage de classe, vous pouvez différencier la constante ou la variable dans différentes portées en utilisant des mots clés selfet static. Consultez cet exemple qui illustre comment accéder à quoi:
classPerson{static $type ='person';const TYPE ='person';staticpublicfunction getType(){
var_dump(self::TYPE);
var_dump(static::TYPE);
var_dump(self::$type);
var_dump(static::$type);}}classPirateextendsPerson{static $type ='pirate';const TYPE ='pirate';}
En d'autres termes, self::fait référence à la propriété statique et à la constante de la même portée où elle est appelée (dans ce cas, la Personsuperclasse), alors static::qu'elle accédera à la propriété et à la constante depuis la portée au moment de l'exécution (donc dans ce cas dans la Piratesous - classe).
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 à l'exécution. C'est aussi la seule raison pour laquelle vous utiliserez jamais const.
Privé, public et protégé 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 ont accès. Private signifie que seule la classe instanciée a accès. Protected signifie que la classe instanciée et les classes dérivées ont accès.
Voici ce que j'ai appris jusqu'à présent sur les membres statiques, les variables constantes et les modificateurs d'accès (privés, publics et protégés).
Constant
Définition
Comme son nom l'indique, les valeurs d'une variable constante ne peuvent pas être modifiées. Les constantes diffèrent des variables normales en ce que vous n'utilisez pas le symbole $ pour les déclarer ou les utiliser.
La valeur doit être une expression constante et non (par exemple) une variable, une propriété, le résultat d'une opération mathématique ou un appel de fonction.
Remarque: la valeur de la variable ne peut pas être un mot-clé (par exemple self, parent et static).
Déclarer une constante en php
<?php
class constantExample{const CONSTANT ='constant value';//constant}?>
La portée de la constante est globale et est accessible à l'aide d'un mot-clé self
<?php
classMyClass{const CONSTANT ='constant value';function showConstant(){
echo self::CONSTANT ."\n";}}
echo MyClass::CONSTANT ."\n";
$classname ="MyClass";
echo $classname::CONSTANT ."\n";// As of PHP 5.3.0
$class =newMyClass();
$class->showConstant();
echo $class::CONSTANT."\n";// As of PHP 5.3.0?>
Statique
Définition
Le mot-clé statique peut être utilisé pour déclarer une classe, une fonction membre ou une variable.Les membres statiques d'une classe sont globaux sont également accessibles à l'aide d'un mot-clé self.Déclarer des propriétés de classe ou des méthodes comme statiques les rend accessibles sans avoir besoin d'une instanciation de la classe . Une propriété déclarée comme statique n'est pas accessible avec un objet de classe instancié (bien qu'une méthode statique le puisse). Si aucune déclaration de visibilité (publique, privée, protégée) n'est utilisée, la propriété ou la méthode sera traitée comme si elle avait été déclarée comme publique, car les méthodes statiques sont appelables sans qu'une instance de l'objet créé.
Remarque: la pseudo-variable $ this n'est pas disponible dans la méthode déclarée comme statique.Les propriétés statiques ne sont pas accessibles via l'objet à l'aide de l'opérateur de flèche ->
Depuis PHP 5.3.0, il est possible de référencer la classe en utilisant une variable. La valeur de la variable> ne peut pas être un mot-clé (par exemple self, parent et static).
Exemple de propriété statique
<?php
classFoo{publicstatic $my_static ='foo';//static variable publicstaticfunction staticValue(){//static function examplereturnself::$my_static;//return the static variable declared globally}}?>
Exemple d'accès aux propriétés et fonctions statiques
En utilisant des mots-clés privés, publics et protégés, vous pouvez contrôler l'accès aux membres d'une classe. Les membres de la classe déclarés publics sont accessibles partout. Les membres déclarés protégés ne sont accessibles que dans la classe elle-même et par les classes héritées et parentes. Les membres déclarés comme privés ne sont accessibles que par la classe qui définit le membre.
Exemple
<?php
classExample{public $variable ='value';// variable declared as public protected $variable ='value'//variable declared as protectedprivate $variable ='value'//variable declared as privatepublicfunction functionName(){//public function//statements}protectedfunction functionName(){//protected function//statements}privatefunction functionName(){//private function//statements}}?>
Accès à l'exemple des membres publics, privés et protégés
Les variables publiques peuvent être accédées et modifiées depuis l'extérieur de la classe ou à l'intérieur de la classe. Mais vous ne pouvez accéder aux variables et fonctions privées et protégées qu'à partir de l'intérieur de la classe. Vous ne pouvez pas modifier la valeur des membres protégés ou publics en dehors de la classe.
<?php
classExample{public $pbVariable ='value';protected $protVariable ='value';private $privVariable ='value';publicfunction publicFun(){
echo $this->$pbVariable;//public variable
echo $this->$protVariable;//protected variable
echo $this->privVariable;//private variable}privatefunctionPrivateFun(){//some statements}protectedfunctionProtectedFun(){//some statements}}
$inst =newExample();
$inst->pbVariable ='AnotherVariable';//public variable modifed from outside
echo $inst->pbVariable;//print the value of the public variable
$inst->protVariable ='var';//you can't do this with protected variable
echo $inst->privVariable;// This statement won't work , because variable is limited to private
$inst->publicFun();// this will print the values inside the function, Because the function is declared as a public function
$inst->PrivateFun();//this one won't work (private)
$inst->ProtectedFun();//this one won't work as well (protected)?>
Pour plus d'informations, lisez cette documentation php sur la visibilité Visibilité Php Doc
self::$variable
pour les variables statiques protégées et privées, car je préfère ne garder le nom de classe mentionné qu'une seule fois en lui-même, ce qui est au tout début de la classe.$
t-il pas besoin d'un ?static $my_var = 10;
dans la définitionstatic
variables sont également très utiles dans les singletons et les fonctions récursives. Parce que vous POUVEZ changer la valeur mais la variable ne sera initialisée qu'une seule fois. Voir stackoverflow.com/questions/203336/ ... pour plus d'explications sur la création d'un singleton. Pour moi, ce sont des situations dans lesquelles je préfère les variables statiques.Un dernier point à souligner est qu'un const est toujours statique et public. Cela signifie que vous pouvez accéder au const depuis la classe comme suit:
De l'extérieur de la classe, vous y accéderiez comme ceci:
la source
La constante est juste une constante, c'est-à-dire que vous ne pouvez pas changer sa valeur après la déclaration.
La variable statique est accessible sans faire d'instance de classe et donc partagée entre toutes les instances d'une classe.
De plus, il peut y avoir une variable locale statique dans une fonction qui n'est déclarée qu'une seule fois (lors de la première exécution d'une fonction) et peut stocker sa valeur entre les appels de fonction, exemple:
la source
Lorsque vous parlez d'héritage de classe, vous pouvez différencier la constante ou la variable dans différentes portées en utilisant des mots clés
self
etstatic
. Consultez cet exemple qui illustre comment accéder à quoi:Et puis faites:
ou:
Production:
En d'autres termes,
self::
fait référence à la propriété statique et à la constante de la même portée où elle est appelée (dans ce cas, laPerson
superclasse), alorsstatic::
qu'elle accédera à la propriété et à la constante depuis la portée au moment de l'exécution (donc dans ce cas dans laPirate
sous - classe).En savoir plus sur la liaison statique tardive ici sur php.net .
Vérifiez également la réponse à une autre question ici et ici .
la source
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 à l'exécution. C'est aussi la seule raison pour laquelle vous utiliserez jamais const.
Privé, public et protégé 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 ont accès. Private signifie que seule la classe instanciée a accès. Protected signifie que la classe instanciée et les classes dérivées ont accès.
la source
Voici ce que j'ai appris jusqu'à présent sur les membres statiques, les variables constantes et les modificateurs d'accès (privés, publics et protégés). Constant
Définition
Comme son nom l'indique, les valeurs d'une variable constante ne peuvent pas être modifiées. Les constantes diffèrent des variables normales en ce que vous n'utilisez pas le symbole $ pour les déclarer ou les utiliser.
La valeur doit être une expression constante et non (par exemple) une variable, une propriété, le résultat d'une opération mathématique ou un appel de fonction.
Déclarer une constante en php
La portée de la constante est globale et est accessible à l'aide d'un mot-clé self
Statique
Définition
Le mot-clé statique peut être utilisé pour déclarer une classe, une fonction membre ou une variable.Les membres statiques d'une classe sont globaux sont également accessibles à l'aide d'un mot-clé self.Déclarer des propriétés de classe ou des méthodes comme statiques les rend accessibles sans avoir besoin d'une instanciation de la classe . Une propriété déclarée comme statique n'est pas accessible avec un objet de classe instancié (bien qu'une méthode statique le puisse). Si aucune déclaration de visibilité (publique, privée, protégée) n'est utilisée, la propriété ou la méthode sera traitée comme si elle avait été déclarée comme publique, car les méthodes statiques sont appelables sans qu'une instance de l'objet créé.
Exemple de propriété statique
Exemple d'accès aux propriétés et fonctions statiques
Public, privé, protégé (modificateurs d'accès AKA)
Avant de lire la définition ci-dessous, lisez cet article sur l'encapsulation. Il vous aidera à comprendre le concept plus en profondeur
Lien 1 wikipedia
Tutoriels pointent le lien sur l'encapsulation
Définition
En utilisant des mots-clés privés, publics et protégés, vous pouvez contrôler l'accès aux membres d'une classe. Les membres de la classe déclarés publics sont accessibles partout. Les membres déclarés protégés ne sont accessibles que dans la classe elle-même et par les classes héritées et parentes. Les membres déclarés comme privés ne sont accessibles que par la classe qui définit le membre.
Exemple
Accès à l'exemple des membres publics, privés et protégés
Pour plus d'informations, lisez cette documentation php sur la visibilité Visibilité Php Doc
Références: php.net
J'espère que vous avez compris le concept. Merci d'avoir lu :) :) Bonne lecture
la source
Alors pour récapituler sur @Matt grande réponse:
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 statique
Exemple:
Edit: Il est important de noter que PHP 7.1.0 a introduit le support pour spécifier la visibilité des constantes de classe .
la source