Maison > développement back-end > tutoriel php > 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
Libérer: 2023-04-09 10:46:01
avant
2689 Les gens l'ont consulté

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();
  }
}
Copier après la connexion

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);
}
Copier après la connexion

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();
}
Copier après la connexion

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();
}
Copier après la connexion

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();
  }
}
Copier après la connexion

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();
}
Copier après la connexion

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!

Étiquettes associées:
source:jb51.net
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