Un résumé concis de la méthode Magic dans les classes PHP

高洛峰
Libérer: 2023-03-04 15:40:02
original
1405 Les gens l'ont consulté

1. __construct() et __destruct()

sont appelés lorsque l'instance est créée/détruite et peuvent transmettre 0 ou plusieurs paramètres.

class A
 {
  function A()
  {
   echo "build A";
  }
 
  function __destruct()
  {
   echo "destroy A";
  }
 }
 
 $obj = new A();
 //unset($obj);
Copier après la connexion

Remarque : La méthode destructeur sera appelée dès qu'il n'y aura plus d'autres références à un objet particulier, ou dans n'importe quel ordre pendant la séquence d'arrêt .

Concernant les constructeurs, à partir de PHP 5.3.3, une méthode nommée avec le nom de la classe dans une classe définie dans un espace de noms spécifique ne sera plus considérée comme un constructeur. Dans une classe sans espace de noms, c'est toujours un constructeur comme avant. Par exemple :

namespace Foo;
class Bar {
  public function Bar() {
    // treated as constructor in PHP 5.3.0-5.3.2
    // treated as regular method as of PHP 5.3.3
  }
}
Copier après la connexion

S'il n'y a pas d'espace de noms Foo alors Bar() sera également utilisé comme constructeur. De plus, si la situation suivante existe :

function __construct()
  {
   echo "construct A";
  }
 
  function A()
  {
   echo "build A";
  }
 
  function __destruct()
  {
   echo "destroy A";
  }
 }
Copier après la connexion

c'est-à-dire qu'elle contient à la fois __construct() et une fonction portant le même nom que le nom de la classe , alors seul _ sera appelé _construct().

2. __call() et __callStatic()

Appelés lors de la tentative d'appel d'une méthode qui n'existe pas. Deux paramètres, l'un est le nom de la méthode et l'autre est le tableau de paramètres de la méthode appelée.

class MethodTest
{
  public function __call($name, $arguments)
  {
    // Note: value of $name is case sensitive.
    echo "Calling object method '$name' "
       . implode(&#39; &#39;, $arguments). "<br>";
  }
 
  public static function __callStatic($name, $arguments)
  {
    // Note: value of $name is case sensitive.
    echo "Calling static method &#39;$name&#39; "
       . implode(&#39; &#39;, $arguments). "<br>";
  }
}
 
$obj = new MethodTest;
$obj->runTest(&#39;in&#39;,&#39;object&#39;,&#39;context&#39;);
MethodTest::runTest(&#39;in&#39;,&#39;static&#39;,&#39;context&#39;);
Copier après la connexion

Parmi eux, $arguments est transmis sous forme de tableau. Résultats d'exécution :

Appel de la méthode objet 'runTest' dans un contexte d'objet
Appel de la méthode statique 'runTest' dans un contexte statique

Faites également attention à la portée de la fonction protected et private :

class TestMagicCallMethod {
  public function foo()
  {
    echo __METHOD__.PHP_EOL."<br>";
  }
 
  public function __call($method, $args)
  {
    echo __METHOD__.PHP_EOL."<br>";
    if(method_exists($this, $method))
    {
      $this->$method();
    }
  }
   
  protected function bar()
  {
    echo __METHOD__.PHP_EOL."<br>";
  }
 
  private function baz()
  {
    echo __METHOD__.PHP_EOL."<br>";
  }
}
 
$test  =  new TestMagicCallMethod();
$test->foo();
/**
 * Outputs:
 * TestMagicCallMethod::foo
 */
 
$test->bar();
/**
 * Outputs:
 * TestMagicCallMethod::__call
 * TestMagicCallMethod::bar
 */
 
$test->baz();
/**
 * Outputs:
 * TestMagicCallMethod::__call
 * TestMagicCallMethod::baz
 */
Copier après la connexion

3.__get() et __set()

sont appelés lors de la tentative de lecture des propriétés d'un objet qui n'existent pas.

Remarque : Nous pouvons utiliser cette fonction pour implémenter diverses opérations similaires à la réflexion en Java.

class Test
{
  public function __get($key)
  {
   echo $key . " not exists";
  }
  public function __set($key,$value)
  {
   echo $key . " = ".$value;
  }
}
 
$t = new Test();
echo $t->name."<br>";
$t->name = "abc";
Copier après la connexion

Sortie :
le nom n'existe pas
name = abc

4. 🎜> Cette méthode est similaire à la méthode toString() de Java. Lorsque nous imprimons directement l'objet, nous appelons cette fonction. La fonction doit renvoyer une chaîne.

class Test
{
  private $name = "abc";
  private $age = 12;
 
  public function __toString()
  {
    return "name : $this->name, age : $this->age";
  }
}
 
$t = new Test();
echo $t;
Copier après la connexion

Sortie :

nom : abc, âge : 12

Plus de méthodes magiques dans les classes PHP (Magic Méthode) Pour un résumé concis des articles connexes, veuillez faire attention au site Web PHP chinois !

Étiquettes associées:
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