Heim  >  Artikel  >  Backend-Entwicklung  >  Ein direkter Blick auf das PHP-Reflexionslernen zur Instanziierung von Klassenoperationen ohne Verwendung der neuen Methode

Ein direkter Blick auf das PHP-Reflexionslernen zur Instanziierung von Klassenoperationen ohne Verwendung der neuen Methode

coldplay.xixi
coldplay.xixinach vorne
2020-07-23 16:54:212598Durchsuche

Ein direkter Blick auf das PHP-Reflexionslernen zur Instanziierung von Klassenoperationen ohne Verwendung der neuen Methode

Das Beispiel in diesem Artikel beschreibt die Verwendung von PHP-Reflexionslernen, um Klassenoperationen ohne die neue Methode zu instanziieren. Teilen Sie es als Referenz mit allen. Die Details lauten wie folgt:

Im vorherigen Artikel zum Beispiel „Erste Schritte mit PHP Reflection“ wurde kurz die Verwendung mehrerer gängiger Klassen von PHP Reflection vorgestellt, aber Sie können sich das vielleicht immer noch nicht vorstellen Was Sie mit Reflection machen können.

Als nächstes werde ich die Reflection-Klasse verwenden, um etwas zu tun. Ist es in Ordnung, eine Klasse zu instanziieren? ? Die Antwort lautet: Ja, dies kann durch Reflexion erreicht werden: new

Verwandte Lernempfehlungen:

PHP-Programmierung vom Einstieg bis zur Beherrschung

Erstellen Sie zunächst eine Datei 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();
  }
}

Erstellen Sie eine neue Datei 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. Die Funktion „make“ ist die Funktion, die wir schreiben, um die Klasse zu instanziieren Name, der zweite Parameter sind die Parameterdaten, die an den Konstruktor der Klasse übergeben werden müssen.

Abhängig von den Parametern des Student-Konstruktors gibt es mehrere Situationen: (Fügen Sie den folgenden Code je nach Situation an run.php an.)

Fall 1: $ ist nicht vorhanden bereitgestellt Der Wert von name

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

Wenn $name keinen Standardwert im Konstruktor hat, wird ein Fehler gemeldet. Sie können die Student-Klasse leicht ändern, um einen Standardwert für $name bereitzustellen. und dann wird es nicht. Es wurde ein Fehler gemeldet.

Fall 2 liefert den Wert von $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();
}

Fall 3, ändern wir 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();
  }
}

Wie Sie Wie Sie sehen, wird der Student-Klasse ein Parameter $bag hinzugefügt. Der Typ ist Bag

. Führen Sie nun

<?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();
}

aus und Sie können sehen, dass der dritte Parameter $bag des Konstruktors automatisch instanziiert wird . und dann an den Konstruktor der Student-Klasse übergeben. Dieser Teil kann zum Implementieren der Abhängigkeitsinjektion verwendet werden. Wir können das Objekt nicht automatisch instanziieren Klasse des Parameters. Dadurch wird eine Entkopplung zwischen den Klassen erreicht. Wenn Sie Laravel gelernt haben, sollten Sie damit vertraut sein.

Das obige ist der detaillierte Inhalt vonEin direkter Blick auf das PHP-Reflexionslernen zur Instanziierung von Klassenoperationen ohne Verwendung der neuen Methode. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:jb51.net. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen