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 ?
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 ?
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.
Edit : Il est important de noter que PHP 7.1.0 a introduit la possibilité de spécifier la visibilité des constantes de classe. .
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.
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é.
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 ?
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;
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
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");
}
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.
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 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.