ホームページ  >  記事  >  バックエンド開発  >  PHPにおけるリフレクションとは何ですか?リフレクション使用例を詳しく解説

PHPにおけるリフレクションとは何ですか?リフレクション使用例を詳しく解説

伊谢尔伦
伊谢尔伦オリジナル
2017-07-01 10:33:481140ブラウズ

オブジェクト指向編集中のオブジェクトには内省する能力が与えられており、この内省プロセスは反映です

到着地に応じて出発点とソースを見つける必要があります。裸のオブジェクト、私はこのオブジェクトを通してそれが属しているクラスとそれがどのようなメソッドを持っているかを知ることができます

リフレクションとは、PHP の実行状態で PHP プログラムの分析を拡張し、クラス、メソッド、などの詳細情報をエクスポートまたは抽出することを指します。 アノテーションを含む、属性やパラメータなどの情報を動的に取得し、オブジェクトのメソッドを動的に呼び出す機能をリフレクションAPIといいます

リフレクションAPIの使い方

次のコードを例に挙げます

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;;

この学生オブジェクトのメソッドを取得し、属性リストを作成する方法は次のとおりです

$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;
}

リフレクション API を使用せずにクラス関数を使用して、オブジェクト属性の連想配列を返すこともできます。詳細: (パブリック属性と):

//返回对象属性的关联数组
var_dump(get_object_vars($boy));
//类属性
var_dump(get_class_vars(get_class($boy)));
//返回由类的属性的方法名组成的数组
var_dump(get_class_methods(get_class($boy)));

リフレクション API の機能は明らかにより強力で、メソッドのアクセス権を含むこのクラスのプロトタイプを復元することもできます。 以下は単にコードをカプセル化したものです。印刷クラスの

/**
 * @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";
}

それだけでなく、PHP マニュアルにはリフレクション API についていくつかの詳細が記載されています。リフレクションはクラスやオブジェクトのプロトタイプを完全に説明していると言えます。クラスとオブジェクトだけでなく、関数、拡張モジュール、例外なども対象です。

リフレクションの役割とは何ですか

リフレクションはドキュメントの生成に使用できるため、ファイル内のクラスをスキャンして、説明ドキュメントを 1 つずつ生成します。リフレクションはクラスの内部構造を検出できるため、プラグイン関数を実装するためのフックとして使用できますか? または、プロキシの場合はどうでしょうか?は簡単な例です

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

ここでの実際の動作クラスは mysql クラスですが、sqlproxy は実際のクラス動作の代わりにパラメータで動的に渡される実装を実装し、メソッドの実行前後にインターセプトして動的に変更します。これは単純な動的プロキシです

通常の開発ではリフレクションが使用される場所はあまりありません。1 つはオブジェクトのデバッグで、もう 1 つは MVC やプラグイン開発で使用されます。リフレクションを使用するのは非常に一般的ですが、リフレクションは非常に高価でもあります。代替手段が見つかった場合は乱用しないでください。

このメカニズムを通じていくつかのリフレクション機能を実現できます。ある観点からは、提供されているリフレクション API を使用することをお勧めします 多くの場合、リフレクションをうまく利用するとコードをエレガントで簡潔に保つことができますが、リフレクションはメソッドを作成する可能性があるため、クラスのカプセル化も破壊します。または公開すべきではないメソッド 属性は強制的に公開されますが、これは利点でもあり欠点でもあります。

以上がPHPにおけるリフレクションとは何ですか?リフレクション使用例を詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。