Maison >développement back-end >tutoriel php >Utiliser l'opérateur de résolution de portée de PHP (::)

Utiliser l'opérateur de résolution de portée de PHP (::)

不言
不言original
2018-06-21 09:31:142190parcourir

Cet article présente principalement l'utilisation de l'opérateur de résolution de portée de PHP (::), qui a une certaine valeur de référence. Maintenant, je le partage avec vous. Les amis dans le besoin peuvent s'y référer

Regardez Joomla aujourd'hui. Je ne m'en rends compte que lorsque j'ai lu le code source. Il s'avère que cet opérateur peut également accéder aux méthodes non statiques de la classe. Cela ne me surprend vraiment pas. J'ai toujours pensé que l'opérateur de résolution de portée ne pouvait accéder qu'aux méthodes statiques et aux variables membres statiques d'une classe.

Opérateur de résolution de portée (::)
Je m'en suis rendu compte en regardant le code source de Joomla aujourd'hui. Il s'avère que cet opérateur peut également accéder aux méthodes non statiques de la classe. Cela ne me surprend vraiment pas. J'ai toujours pensé que l'opérateur de résolution de portée ne pouvait accéder qu'aux méthodes statiques et aux variables membres statiques d'une classe.
Si vous n'y croyez pas, voici un petit code de test simple qui peut le prouver.

class A{ 
private $_name = 'A'; 
function __construct(){ 
echo &#39;A construct <br />&#39;; 
} 
function test(){ 
echo &#39;A test() <br />&#39;; 
} 
} 
class B extends A{ 
private $_name = &#39;B&#39;; 
function __construct(){ 
parent::__construct(); 
echo &#39;B construct <br />&#39;; 
} 
function test(){ 
echo &#39;B test()&#39;; 
} 
} 
A::test(); 
echo &#39;######### <br />&#39;; 
B::test();

Le résultat de la saisie de ce code est :

A test() 
######### 
B test()

Bien que test() en classe A et test en classe B ne soient pas des méthodes statiques, elles peuvent toujours être utilisées en classe. name::Method name (parameter list)" pour effectuer l'appel correct. Son effet est le même que lorsqu'on crée une nouvelle instance d'une classe, puis que l'on utilise cette instance pour appeler la méthode
test.
Cependant, si je dois imprimer l'attribut name dans la méthode de test, que se passera-t-il si je l'appelle directement avec ::? Modifions d'abord le code ci-dessus.

class A{ 
private $_name = &#39;A&#39;; 
function __construct(){ 
echo &#39;A construct <br />&#39;; 
} 
function test(){ 
echo &#39;A test() <br />&#39;, $this->$_name,&#39;<br />&#39;; 
} 
} 
class B extends A{ 
private $_name = &#39;B&#39;; 
function __construct(){ 
parent::__construct(); 
echo &#39;B construct <br />&#39;; 
} 
function test(){ 
echo &#39;B test()&#39;, $this->_name,&#39;<br />&#39;; 
} 
} 
A::test(); 
echo &#39;######### <br />&#39;; 
B::test();

Le résultat de l'exécution du code ci-dessus est le suivant :

Fatal error: Using $this when not in object context in D:\www\test\scoperefe.php on line 9 
[html]

C'est ce que certains amis ont dit. Vous n'avez pas du tout instancié la classe A. Bien sûr, vous ne pouvez pas accéder directement à la variable membre $_name en utilisant $this->_name. Alors, pouvez-vous simplement la changer en self::$_name ?
Faites-le, modifiez maintenant le code ci-dessus

[code] 
class A{ 
private $_name = &#39;A&#39;; 
function __construct(){ 
echo &#39;A construct <br />&#39;; 
} 
function test(){ 
echo &#39;A test() <br />&#39;, self::$_name,&#39;<br />&#39;; 
} 
} 
class B extends A{ 
private $_name = &#39;B&#39;; 
function __construct(){ 
parent::__construct(); 
echo &#39;B construct <br />&#39;; 
} 
function test(){ 
echo &#39;B test()&#39;, $this->_name,&#39;<br />&#39;; 
} 
} 
A::test(); 
echo &#39;######### <br />&#39;; 
B::test();

Exécutez à nouveau le code ci-dessus, le résultat est le suivant :

A test() Fatal error: Access to undeclared static property: A::$_name in D:\www\test\scoperefe.php on line 9

Oh, il s'avère ça ne marche pas Le mot-clé self accède aux méthodes non statiques de la classe actuelle.
Maintenant, si vous souhaitez appeler cette méthode correctement, il existe deux manières :
1. Instanciez d'abord la classe, puis utilisez l'objet pour l'appeler directement en utilisant $this->_name; , définissez la variable membre $_name sur static;
Je pense que tout le monde peut gérer correctement le problème ci-dessus.
En fait, ce que je veux vraiment dire, c'est :
Si une méthode peut être appelée sans instanciation, alors nous ferions mieux de modifier cette méthode avec le mot-clé static. Lors de l’implémentation d’une méthode, seules les variables membres statiques de la classe sont appelées. De cette façon, les problèmes rencontrés ci-dessus ne se produiront pas.
Si une méthode n’est pas définie sur une méthode statique. Ensuite, le moyen le plus sûr est d'utiliser l'objet instance pour effectuer l'appel. C'est plus sûr car l'implémentation de la méthode peut devoir être modifiée à un moment donné. Lors de la modification, le membre non statique
de la classe peut avoir besoin d'être modifié. à appeler. Variables (car, dans une large mesure, lors de la modification de l'implémentation de la méthode, on a oublié de l'appeler directement avec le nom de la classe).
Mon humble avis.

Ce qui précède représente l'intégralité du contenu de cet article. J'espère qu'il sera utile à l'étude de chacun. Pour plus de contenu connexe, veuillez faire attention au site Web PHP chinois !

Recommandations associées :

À propos de l'injection de propriétés et de l'injection de méthodes du comportement des composants du framework Yii en PHP

À propos de PHP depuis Analyse de l'utilisation de la définition de l'interface de sérialisation Serialisable

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn