Méthodes magiques PHP __get(), __set(), __call(), __callStatic() et explication détaillée de l'utilisation statique

伊谢尔伦
Libérer: 2023-03-12 13:50:01
original
3198 Les gens l'ont consulté

Après php5, j'ai implémenté quelques méthodes magiques qui sont assez intéressantes. J'ai déjà utilisé des méthodes de programmation orientées processus et j'ai fait moins de recherches sur le oop. est assez intéressant.

J'ai l'impression que beaucoup de choses comme les méthodes magiques ne sont que pour la paresse. Je me souviens que lorsque j'ai écrit PHP pour la première fois, lorsque je bloguais, j'utilisais un framework open source étranger appelé lifetype. toujours PHP4.3. Mais tous les objets sont implémentés dans ce framework et toutes les données sont encapsulées dans des objets.

Ainsi, après avoir sélectionné un tas d'éléments dans la base de données, ils doivent être encapsulés dans des objets un par un dans une boucle. Chaque champ doit également implémenter les méthodes getField() et getField(). un peu difficile à écrire. On a l'impression de faire un travail répétitif.

Puis la naissance de ces méthodes magiques get(), set(), call(), callStatic() a complètement résolu ce problème.

get() et set() sont destinés aux attributs de la classe, call() est destiné aux méthodes et callStatic() est destiné aux méthodes de classe statique.

1. Méthodes magiques Get() et set() :

Lorsqu'un objet est instancié et qu'un attribut qui n'existe pas dans la classe ou n'a aucune autorisation d'accès est appelé , PHP va La méthode get() est appelée par défaut. Cela permet non seulement d'économiser beaucoup de code et de rendre la structure plus claire, mais fournit également une méthode d'accès externe aux membres privés de la classe.

Par exemple :

<?php
class testGet
{
  private $name = &#39;test&#39;;
}
$test = new testGet();
$test->name;
Copier après la connexion

Si nous exécutons le code ci-dessus, une erreur sera signalée : PHP Erreur fatale : Impossible d'accéder à la propriété privée testGet::$name dans /Bibliothèque/WebServer/ Documents/workspace/learn/call/a.php en ligne 7

Mais modifions-le et accédons-y via la méthode get()

<?php
class testGet
{
  private $name = &#39;test&#39;;

  function get($property) {
    if ( isset($this->$property) ) 
      return $this->$property;
    else
      return NULL;
  }
}
$test = new testGet();
echo $test->name . PHP_EOL;
Copier après la connexion

Code changement Après cela, nous n'aurons aucun problème à revenir.

Remarque : Si l'attribut est défini comme statique, une erreur sera également signalée lors de l'accès via get(). La raison en est que les membres statiques appartiennent à la classe elle-même et ne changent pas en raison de l'instanciation, vous pouvez donc les tester vous-même.

En utilisant la méthode set(), vous pouvez interdire la création dynamique d'attributs de classe, ce qui peut éviter des problèmes inutiles aux développeurs ou responsables de programme ultérieurs.

ensemble de fonctions ($property) {

//$property reçoit le nom de la propriété

>

Pour être honnête, la conception d'oop sera mélangée à de nombreuses idées propres au concepteur. S'il n'y a pas de documentation, ce sera toujours très difficile pour les retardataires. lire le code Bien sûr, cela a aussi beaucoup à voir avec le niveau des retardataires.

Ce qui suit est un exemple d'utilisation de get et set ensemble :

<?php
class testGet
{
  private $name = &#39;test&#39;;

  function get($property) {
    if ( isset($this->$property) ) 
      return $this->$property;
    else
      return NULL;
  }
  
  public function set($property, $value) {
    if ( isset($this->$property) )
      $this->$property = $value;
    else
      return NULL;
  }
}
$test = new testGet();
$test->name = &#39;my test name&#39;;
echo $test->name . PHP_EOL;
Copier après la connexion

function set($property, $value) {

//$property reçoit le nom de l'attribut

//$value reçoit la valeur de l'attribut

}

2. Méthodes call() et callStatic() :

Lorsque l'objet appelle une méthode dans la classe qui n'existe pas ou n'a pas l'autorisation d'accéder, l'appel( ) la méthode sera automatiquement appelée.

Je me souviens qu'un collègue m'avait déjà demandé pourquoi il existe de nombreuses méthodes de bas niveau dans le framework TP qui ne sont pas disponibles, mais qui peuvent toujours être appelées dans la couche supérieure. En fait, c'est l'appel(). méthode qui fonctionne.

Si vous ne connaissez pas cette méthode, vous serez certainement confus et le problème sera difficile à localiser.

<?php
abstract class Obj 
{
        private $objData        = array();
        /** 
         * call魔术方法,如果对象请求的方法不存在或者没有权限访问的时候
         * 调用魔术方法
         */
        public function call($name, $args) {
            $field = preg_match(&#39;/^get(\w+)/&#39;, $name, $matches);
            if ( $field && $matches[1] )
                return $this->objData[strtolower($matches[1])];
            $field = preg_match(&#39;/^set(\w+)/&#39;, $name, $matches);
            if ( $field && $matches[1] ) { 
                return $this->objData[strtolower($matches[1])] = $args[0];
            }   
        }   
}
class User extends Obj
{
        
}
$user = new User();
$user->setName(&#39;test&#39;);
echo $user->getName();
Copier après la connexion

La classe User ne fait rien, mais fait tout (getName et setName) en héritant de la méthode call() de la classe.

appel de fonction ($methodName, $args) {

//Le nom de la méthode appelée par $methodName

//Paramètres passés par $argsArray

}

et call() correspondent à callStatic() Les méthodes servent les méthodes statiques des classes statiques.

Exemple :

<?php
    abstract class Obj 
    {
        private static $objData        = array();
        /** 
         * call魔术方法,如果对象请求的方法不存在或者没有权限访问的时候
         * 调用魔术方法
         */
        public static function callStatic($name, $args) {
            $field = preg_match(&#39;/^get(\w+)/&#39;, $name, $matches);
            if ( $field && $matches[1] )
                return self::$objData[strtolower($matches[1])];
            $field = preg_match(&#39;/^set(\w+)/&#39;, $name, $matches);
            if ( $field && $matches[1] ) { 
                return self::$objData[strtolower($matches[1])] = $args[0];
            }   
        }   
    }
    class User extends Obj 
    {
    
    }
    User::setName(&#39;test&#39;);
    echo User::getName() . PHP_EOL;
Copier après la connexion

3. Liaison statique retardée : objet statique

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!

Étiquettes associées:
php
source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal