Le
mot-clé statique déclare un attribut ou une méthode liée à la classe, plutôt qu'à une instance spécifique de la classe. , ces propriétés ou méthodes sont également appelées « propriétés de classe » ou « méthodes de classe ».
Si l'autorisation Contrôle d'accès est autorisée, vous pouvez l'appeler directement en utilisant le nom de la classe plus deux deux-points "::" sans créer d'objet de cette classe.
Le mot-clé static peut être utilisé pour modifier des variables et des méthodes.
Vous pouvez accéder directement aux attributs statiques et aux méthodes statiques de la classe sans instanciation.
Les propriétés et méthodesstatiques ne peuvent accéder qu'aux propriétés et méthodes statiques, et ne peuvent pas accéder aux propriétés et méthodes nonstatiques. Parce que lorsque des propriétés et des méthodes statiques sont créées, il se peut qu'il n'y ait pas encore d'instances de cette classe pouvant être appelées.
Les attributs statiques n'ont qu'une seule copie en mémoire et sont partagés par toutes les instances.
Utilisez le mot-clé self:: pour accéder aux membres statiques de la classe actuelle.
Caractéristiques publiques des propriétés statiques
Toutes les instances d'une classe partagent les propriétés statiques de la classe.
En d'autres termes, même s'il y a plusieurs instances dans la mémoire, il n'y a qu'une seule copie des attributs statiques.
Dans l'exemple suivant, un attribut counter $count est défini, avec des modifications privées et statiques. De cette façon, le monde extérieur ne peut pas accéder directement à la propriété $count. Suite à l'exécution du programme, nous constatons également que plusieurs instances utilisent le même attribut statique $count.
<?php class user{ private static $count = 0 ; //记录所有用户的登录情况. public function construct(){ self::$count = self::$count + 1; } public function getCount(){ return self::$count; } public function destruct(){ self::$count = self::$count -1; } } $user1 = new user(); $user2 = new user(); $user3 = new user(); echo "now here have ".$user1->getCount()." user"; echo "<br>"; unset( $user3); echo "now here have ".$user1->getCount()." user"; ?>
Résultat de l'exécution du programme :
1
2
maintenant ici, j'ai 3 utilisateurs
maintenant ici, j'ai 2 utilisateurs jb51.net
L'attribut statique est appelé directement
Les propriétés statiques peuvent être utilisées directement sans instanciation, et peuvent être utilisées directement avant la création de la classe.
La méthode utilisée est nom de classe :: nom de propriété statique.
<?php class Math{ public static $pi = 3.14; } //求一个半径3的园的面积。 $r = 3; echo "半径是 $r 的面积是<br>"; echo Math::$pi * $r * $r ; echo "<br><br>"; //这里我觉得 3.14 不够精确,我把它设置的更精确。 Math::$pi = 3.141592653589793; echo "半径是 $r 的面积是<br>"; echo Math::$pi * $r * $r ; ?>
Résultat de l'exécution du programme :
1
2
3
4
La zone de rayon 3 est
28,26
Le rayon is L'aire de 3 est
28.2743338823
La classe n'est pas créée et les attributs statiques peuvent être utilisés directement. Quand les propriétés statiques sont-elles créées en mémoire ? Je n'ai vu aucune information pertinente en PHP. Citer des concepts en Java pour les expliquer devrait également être universel.
Propriétés et méthodes statiques, créées lors de l'appel de la classe. Lorsqu'une classe est appelée, cela signifie que la classe est créée ou que tout membre statique de la classe est appelé.
Méthodes statiques
Les méthodes statiques peuvent être utilisées directement sans que la classe soit instanciée.
La méthode utilisée est nom de classe : nom de méthode statique.
Continuons à écrire ce cours de mathématiques pour effectuer des calculs mathématiques. Nous concevons une méthode pour calculer la valeur maximale. Puisqu’il s’agit d’une opération mathématique, nous n’avons pas besoin d’instancier cette classe. Il serait beaucoup plus pratique si cette méthode pouvait être prise et utilisée.
Nous avons conçu ce cours uniquement pour démontrer la méthode statique. PHP fournit la fonction max() pour comparer des valeurs numériques.
<?php class Math{ public static function Max($num1,$num2){ return $num1 > $num2 ? $num1 : $num2; } } $a = 99; $b = 88; echo "显示 $ a 和 $ b 中的最大值是"; echo "<br>"; echo Math::Max($a,$b); echo "<br>";echo "<br>";echo "<br>"; $a = 99; $b = 100; echo "显示 $ a 和 $ b 中的最大值是"; echo "<br>"; echo Math::Max($a,$b); ?>
Résultats d'exécution du programme :
Affiche que la valeur maximale de $a et $b est
99
Affiche que la valeur maximale de $a et $b est
100
Comment appeler des méthodes statiques à partir de méthodes statiques
Le premier exemple, lorsqu'une méthode statique appelle d'autres méthodes statiques, utilisez directement le nom de la classe.
<?php // 实现最大值比较的Math类。 class Math{ public static function Max($num1,$num2){ return $num1 > $num2 ? $num1 : $num2; } public static function Max3($num1,$num2,$num3){ $num1 = Math::Max($num1,$num2); $num2 = Math::Max($num2,$num3); $num1 = Math::Max($num1,$num2); return $num1; } } $a = 99; $b = 77; $c = 88; echo "显示 $a $b $c 中的最大值是"; echo "<br>"; echo Math::Max3($a,$b,$c); ?>
Résultat d'exécution du programme :
1
2
La valeur maximale affichée en 99 77 88 est
99
Vous pouvez également utiliser self :: Appelez d'autres méthodes statiques dans la classe actuelle. (Suggestion)
<?php // 实现最大值比较的Math类。 class Math{ public static function Max($num1,$num2){ return $num1 > $num2 ? $num1 : $num2; } public static function Max3($num1,$num2,$num3){ $num1 = self::Max($num1,$num2); $num2 = self::Max($num2,$num3); $num1 = self::Max($num1,$num2); return $num1; } } $a = 99; $b = 77; $c = 88; echo "显示 $a $b $c 中的最大值是"; echo "<br>"; echo Math::Max3($a,$b,$c); ?>
Résultat de l'exécution du programme :
1
2
La valeur maximale affichée parmi 99 77 88 est
99
Appels de méthode statique statique L'attribut
utilise le nom de classe :: nom de propriété statique pour appeler les propriétés statiques de cette classe.
<?php // class Circle{ public static $pi = 3.14; public static function circleAcreage($r){ return $r * $r * Circle::$pi; } } $r = 3; echo " 半径 $r 的圆的面积是 " . Circle::circleAcreage($r); ?>
Résultat de l'exécution du programme :
1
L'aire d'un cercle de rayon 3 est de 28,26
Utilisez self:: pour appeler les propriétés statiques de cette classe. (Suggestion)
<?php // class Circle{ public static $pi = 3.14; public static function circleAcreage($r){ return $r * $r * self::$pi; } } $r = 3; echo " 半径 $r 的圆的面积是 " . Circle::circleAcreage($r); ?>
Résultat de l'exécution du programme :
1
L'aire d'un cercle de rayon 3 est de 28,26
Les méthodes statiques ne peuvent pas appeler de propriétés non statiques
Les méthodes statiques ne peuvent pas appeler de propriétés non statiques. Les propriétés non statiques ne peuvent pas être appelées en utilisant self::.
<?php // class Circle{ public $pi = 3.14; public static function circleAcreage($r){ return $r * $r * self::pi; } } $r = 3; echo " 半径 $r 的圆的面积是 " . Circle::circleAcreage($r); ?>
Résultat de l'exécution du programme :
1
Erreur fatale : la constante de classe non définie 'pi' dans E:PHPProjectstest.php à la ligne 7
ne peut pas non plus être used $this obtient la valeur d'une propriété non statique.
<?php // class Circle{ public $pi = 3.14; public static function circleAcreage($r){ return $r * $r * $this->pi; } } $r = 3; echo " 半径 $r 的圆的面积是 " . Circle::circleAcreage($r); ?>
Résultat de l'exécution du programme :
1
Erreur fatale : utilisation de $this lorsqu'il n'est pas dans le contexte objet dans E:PHPProjectstest.php à la ligne 7
Les méthodes statiques appellent des méthodes non statiques
En PHP5, l'identifiant $this ne peut pas être utilisé dans les méthodes statiques pour appeler des méthodes non statiques.
<?php // 实现最大值比较的Math类。 class Math{ public function Max($num1,$num2){ echo "bad<br>"; return $num1 > $num2 ? $num1 : $num2; } public static function Max3($num1,$num2,$num3){ $num1 = $this->Max($num1,$num2); $num2 = $this->Max($num2,$num3); $num1 = $this->Max($num1,$num2); return $num1; } } $a = 99; $b = 77; $c = 188; echo "显示 $a $b $c 中的最大值是"; echo "<br>"; echo Math::Max3($a,$b,$c); ?>
Le résultat de l'exécution du programme :
Affiche que la valeur maximale parmi 99 77 188 est
Erreur fatale : utiliser $this lorsqu'il n'est pas dans le contexte d'un objet dans E:test.php en ligne 10
Lorsqu'une méthode non statique d'une classe est appelée par self::, le système convertira automatiquement cette méthode en méthode statique.
Le code suivant a été exécuté et a produit des résultats. Parce que la méthode Max est convertie en méthode statique par le système.
<?php // 实现最大值比较的Math类。 class Math{ public function Max($num1,$num2){ return $num1 > $num2 ? $num1 : $num2; } public static function Max3($num1,$num2,$num3){ $num1 = self::Max($num1,$num2); $num2 = self::Max($num2,$num3); $num1 = self::Max($num1,$num2); return $num1; } } $a = 99; $b = 77; $c = 188; echo "显示 $a $b $c 中的最大值是"; echo "<br>"; echo Math::Max3($a,$b,$c); ?>
程序运行结果:
1
2
显示 99 77 188 中的最大值是
188
下面的例子中,我们让静态方法Max3 用过self::调用了非静态方法Max,有让非静态方法Max通过$this 调用非静态属性 $pi 。
在运行是报出了错误,这个错误和前一个例子 3-1-9.php一样,这次倒是非静态方法Max报出了静态方法调用非静态属性的错误。
这倒是证明了一点,在这里我们定义的非静态方法 Max 被系统自动转换成静态方法了。
<?php // 实现最大值比较的Math类。 class Math{ public $pi = 3.14; public function Max($num1,$num2){ echo self::$pi; //这里的调用看来不应该有问题. return $num1 > $num2 ? $num1 : $num2; } public static function Max3($num1,$num2,$num3){ $num1 = self::Max($num1,$num2); $num2 = self::Max($num2,$num3); $num1 = self::Max($num1,$num2); return $num1; } } $a = 99; $b = 77; $c = 188; echo "显示 $a $b $c 中的最大值是"; echo "<br>"; echo Math::Max3($a,$b,$c); ?>
程序运行结果:
1
2
显示 99 77 188 中的最大值是
Fatal error: Access to undeclared static property: Math::$pi in E:PHPProjectstest.php on line 7
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!