Heim > Backend-Entwicklung > PHP-Tutorial > 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
Freigeben: 2023-04-09 10:46:01
nach vorne
2690 Leute haben es durchsucht

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();
  }
}
Nach dem Login kopieren

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);
}
Nach dem Login kopieren

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();
}
Nach dem Login kopieren

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();
}
Nach dem Login kopieren

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();
  }
}
Nach dem Login kopieren

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();
}
Nach dem Login kopieren

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!

Verwandte Etiketten:
Quelle:jb51.net
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage