Maison  >  Article  >  développement back-end  >  Un aperçu direct de la réflexion PHP pour apprendre à instancier des opérations de classe sans utiliser la nouvelle méthode

Un aperçu direct de la réflexion PHP pour apprendre à instancier des opérations de classe sans utiliser la nouvelle méthode

coldplay.xixi
coldplay.xixiavant
2020-07-23 16:54:212598parcourir

Un aperçu direct de la réflexion PHP pour apprendre à instancier des opérations de classe sans utiliser la nouvelle méthode

L'exemple de cet article décrit l'utilisation de l'apprentissage par réflexion PHP pour instancier des opérations de classe sans utiliser la nouvelle méthode. Partagez-le avec tout le monde pour votre référence, les détails sont les suivants :

L'article précédent sur l'exemple de démarrage de PHP Reflection a brièvement présenté comment utiliser plusieurs classes courantes de réflexion PHP, mais vous ne pourrez peut-être toujours pas imaginer ce que vous pouvez faire avec la réflexion. Allez,

Ensuite, j'utiliserai la classe de réflexion pour faire quelque chose. Tout le monde sait que pour instancier une classe, vous devez utiliser le nouveau mot-clé Est-ce OK sans new. ? La réponse est oui, cela peut être obtenu par la réflexion :

Recommandations d'apprentissage associées : Programmation PHP de l'entrée à la maîtrise

Créez d'abord un fichier student .php:

<?php
class Student
{
  public $id;
  public $name;
  public function __construct($id,$name)
  {
    $this->id = $id;
    $this->name = $name;
  }
  public function study()
  {
    echo $this->name.&#39; is learning.....&#39;.PHP_EOL;
  }
  public function showBag(){
    echo "My bag have ".$this->bag->all();
  }
}

Créez un nouveau fichier run.php

<?php
require &#39;student.php&#39;;
function make($class, $vars = []) {
  $ref = new ReflectionClass($class);
  if(!$ref->isInstantiable()) {
    throw new Exception("类{$class} 不存在");
  }
  $constructor = $ref->getConstructor();
  if(is_null($constructor)) {
    return new $class;
  }
  $params = $constructor->getParameters();
  $resolveParams = [];
  foreach ($params as $key=>$value) {
    $name = $value->getName();
    if(isset($vars[$name])) {
      $resolveParams[] = $vars[$name];
    } else {
      $default = $value->isDefaultValueAvailable() ? $value->getDefaultValue() : null;
      if(is_null($default)) {
        if($value->getClass()) {
          $resolveParams[] = make($value->getClass()->getName(), $vars);
        } else {
          throw new Exception("{$name} 没有传值且没有默认值。");
        }
      } else {
        $resolveParams[] = $default;
      }
    }
  }
  return $ref->newInstanceArgs($resolveParams);
}

run.php La fonction make est la fonction que nous écrivons pour instancier la classe. name. le deuxième paramètre correspond aux données de paramètre qui doivent être transmises au constructeur de la classe.

Il existe plusieurs situations selon les paramètres du constructeur de Student : (Le code suivant, veuillez l'ajouter à run.php selon différentes situations)

Cas 1 : $ n'est pas fourni La valeur de name

try {
  $stu = make(&#39;Student&#39;, [&#39;id&#39; => 1]);
  print_r($stu);
  $stu->study();
} catch (Exception $e) {
  echo $e->getMessage();
}

Lorsque $name n'a pas de valeur par défaut dans le constructeur, une erreur sera signalée. Vous pouvez légèrement modifier la classe Student pour fournir une valeur par défaut pour $name, et puis ce ne sera pas le cas. Une erreur a été signalée.

Le cas 2 fournit la valeur de $name

try {
  $stu = make(&#39;Student&#39;, [&#39;id&#39; => 1, &#39;name&#39; => &#39;li&#39;]);
  print_r($stu);
  $stu->study();
} catch (Exception $e) {
  echo $e->getMessage();
}

Cas 3, changeons student.php

<?php
class Bag{
  public function name(){
    return "学生包".PHP_EOL;
  }
}
class Student
{
  public $id;
  public $name;
  public function __construct($id, $name="xxx", Bag $bag)
  {
    $this->id = $id;
    $this->name = $name;
    $this->bag = $bag;
  }
  public function study()
  {
    echo $this->name.&#39; is learning.....&#39;.PHP_EOL;
  }
  public function showBag(){
    echo "My bag is ".$this->bag->name();
  }
}

Comme vous Comme vous pouvez le voir, un paramètre $bag est ajouté à la classe Student. Le type est Bag

Exécutez maintenant

<?php
try {
  $stu = make(&#39;Student&#39;, [&#39;id&#39; => 1, &#39;name&#39; => &#39;li&#39;]);
  print_r($stu);
  $stu->study();
  $stu->showBag();
} catch (Exception $e) {
  echo $e->getMessage();
}

et vous pouvez voir que le troisième paramètre $bag du constructeur est automatiquement instancié. . ifié, puis transmis au constructeur de la classe Student. Cette partie est très critique. Cet endroit peut être utilisé pour implémenter l'injection de dépendances. Nous n'avons pas besoin d'instancier manuellement l'objet en fonction de l'objet correspondant. classe du paramètre. Cela réalise le découplage entre les classes. Si vous avez appris Laravel, vous devriez le connaître.

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:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer