Was ist Reflexion in PHP? Ausführliche Erläuterung der Beispiele für die Verwendung von Reflexionen

伊谢尔伦
Freigeben: 2023-03-12 09:12:01
Original
1149 Leute haben es durchsucht

ObjektorientiertObjekte in der Bearbeitung erhalten die Fähigkeit zur Selbstbeobachtung, und dieser Selbstbeobachtungsprozess ist Reflexion

Reflexion, intuitives Verständnis soll den Ausgangspunkt und die Quelle entsprechend herausfinden Ankunftsort. Wenn ich Ihnen beispielsweise ein nacktes Objekt gebe, kann ich nur durch dieses Objekt erkennen, zu welcher Klasse es gehört.

Reflection bezieht sich auf die Erweiterung der Analyse des PHP-Programms Der PHP-Laufstatus und -Export Oder extrahieren Sie detaillierte Informationen zu Klassen, Methoden, Eigenschaften, Parametern usw., einschließlich Anmerkungen . Diese Funktion zum dynamischen Abrufen von Informationen und zum dynamischen Aufrufen von Objektmethoden wird als Reflexions-API

So verwenden Sie die Reflection API

Nehmen Sie den folgenden Code als Beispiel

class HandsonBoy
{
    public $name = 'chenqionghe';
    public $age = 18;
    public function set($name,$value)
    {
        echo &#39;您正在设置私有属性&#39;.$name.&#39;<br >值为&#39;.$value.&#39;<br>&#39;;
        $this->$name = $value;
    }
    public function get($name)
    {
        if(!isset($this->$name))
        {
            echo &#39;未设置&#39;.$name;
            $this->$name = "正在为你设置默认值".&#39;<br>&#39;;
        }
        return $this->$name;
    }
}
$boy = new HandsonBoy();
echo $boy->name.&#39;<br />&#39;;
$boy->hair = &#39;short&#39;;
Nach dem Login kopieren
Was sollten wir nun tun, um die Methoden- und Attributliste dafür zu erhalten? Student-Objekt? Dies kann mithilfe von Reflection erreicht werden.

$reflect = new ReflectionObject($boy);
$props = $reflect->getProperties();
//获取属性的名字
foreach($props as $prop)
{
    print $prop->getName().PHP_EOL;
}
//获取对象方法列表
$methos = $reflect->getMethods();
foreach($methos as $method)
{
    print $method->getName().PHP_EOL;
}
Nach dem Login kopieren
Sie können auch die Klassenfunktion anstelle der Reflection-API verwenden, um ein assoziatives Array von Objekteigenschaften und weiteren Informationen zurückzugeben: (für öffentliche Eigenschaften und):

//返回对象属性的关联数组
var_dump(get_object_vars($boy));
//类属性
var_dump(get_class_vars(get_class($boy)));
//返回由类的属性的方法名组成的数组
var_dump(get_class_methods(get_class($boy)));
Nach dem Login kopieren
Reflexion Die Funktion der API ist offensichtlich leistungsfähiger und kann sogar den Prototyp dieser Klasse wiederherstellen, einschließlich der Zugriffsberechtigungen der Methoden. Das Folgende kapselt einfach den Code einer Druckklasse

/**
 * @param $classObject 对象或者类名
 */
function getClass($classObject)
{
    $object = new ReflectionClass($classObject);
    $className = $object->getName();
    $Methods = $Properties = array();
    foreach($object->getProperties() as $v)
    {
        $Properties[$v->getName()] = $v;
    }
    foreach($object->getMethods() as $v)
    {
        $Methods[$v->getName()] = $v;
    }
    echo "class {$className}\n{\n";
    is_array($Properties) && ksort($Properties);
    foreach($Properties as $k=>$v)
    {
        echo "\t";
        echo $v->isPublic() ? &#39;public&#39; : &#39;&#39;,$v->isPrivate() ? &#39;private&#39; :&#39;&#39;,$v->isProtected() ? &#39;protected&#39; : &#39;&#39;;
        $v->isStatic() ? &#39;static&#39; : &#39;&#39;;
        echo "\t{$k}\n";
    }
    echo "\n";
    if(is_array($Methods)) ksort($Methods);
    foreach($Methods as $k=>$v)
    {
        echo "\tfunction {$k}()\n";
    }
    echo "}\n";
}
Nach dem Login kopieren
Nicht nur das,

PHP-Handbuch Es gibt Dutzende von Reflection-APIs. Man kann sagen, dass Reflection den Prototyp einer Klasse oder eines Objekts vollständig beschreibt. Reflection kann nicht nur für Klassen und Objekte verwendet werden, sondern auch für Funktionen, Erweiterungsmodule, Ausnahmen usw.

Welche Rolle spielt Reflection?

Reflection kann sein Wird für die Dokumentgenerierung verwendet, sodass damit die Klassen in der Datei gescannt und Beschreibungsdokumente einzeln generiert werden können.

Da Reflection die interne Struktur einer Klasse erkennen kann, kann es auch als Hook verwendet werden Um Plug-In-Funktionen zu implementieren? Oder als dynamischer Proxy? Der folgende Code ist ein einfaches Beispiel.

<?php
class mysql
{
    function connect($db)
    {
        echo "连接到数据库{$db[0]}".PHP_EOL;
    }
}
class sqlproxy
{
    private $target;
    public function construct($tar)
    {
        $this->target[] = new $tar;
    }
    public function call($name,$args)
    {
        foreach($this->target as $obj)
        {
            $r = new ReflectionClass($obj);
            if($method = $r->getMethod($name))
            {
                if($method->isPublic() && !$method->isAbstract())
                {
                    echo "方法前拦截记录LOG".PHP_EOL;
                    $method->invoke($obj,$args);
                    echo "方法后拦截".PHP_EOL;
                }
            }
        }
    }
}
$obj = new sqlproxy(&#39;mysql&#39;);
$obj->connect(&#39;chenqionghe&#39;);
Nach dem Login kopieren
Die eigentliche Betriebsklasse ist hier MySQL, aber SQLProxy implementiert die Ausführung der tatsächlichen Klasse auf dynamisch übergebenen Parametern, fängt vor und nach der Ausführung der Methode ab und ändert dynamisch die Methoden und Attribute in der Klasse.

Es gibt nicht viele Stellen, an denen Reflektion in der normalen Entwicklung verwendet wird : Eine dient zum Debuggen von Objekten

und die andere zum Abrufen von Klasseninformationen. In der MVC- und Plug-In-Entwicklung ist die Verwendung von Reflektion sehr verbreitet, aber Reflektion verschlingt viel Geld, also missbrauchen Sie sie nicht Wenn Sie eine Alternative finden können, ist es wünschenswert, dass PHP über die Token-Funktion einige Reflexionsfunktionen implementiert Oft kann eine gute Verwendung von Reflektion den Code elegant und prägnant halten, aber Reflektion kann auch die Kapselung der Klasse zerstören, da Reflektion die Offenlegung von Methoden oder Eigenschaften erzwingen kann, die nicht offengelegt werden sollten sowohl ein Vorteil als auch ein Nachteil.

Das obige ist der detaillierte Inhalt vonWas ist Reflexion in PHP? Ausführliche Erläuterung der Beispiele für die Verwendung von Reflexionen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
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