PHP 反射API 例子

学习了《深入PHP 面向对象、模式与实践》,根据自己理解也写了一个类似的反射类使用,以便加深理解

namespace refmyExample;

abstract class Capacity{

    public function show($skill)
    {
        echo static::class ." show skill:{$skill}";
    }
}

interface  module{

    public function execute();

}

class SupermanModule extends Capacity implements module
{

    public function execute(){

    }
    public function setName($name)
    {
        echo "Superman name:{$name}";
        echo PHP_EOL;
    }

    public function setAge($age)
    {
        echo "Superman age:{$age}";
        echo PHP_EOL;
    }

}

class RouterModule extends Capacity implements module
{


    protected $host;
    protected $username;
    public function execute(){

    }
    public function setHost($host)
    {
        $this->host = $host;

        echo "Router host:{$host}";
        echo PHP_EOL;
    }

    public function setUsername($username)
    {

        echo "Router username:{$username}";
        echo PHP_EOL;
    }

}

class runModule
{

    private $module = [];

    private $configData = [
        "\ref\myExample\SupermanModule"=>[
            'name'=>'amy',
            'age'=>36
        ],

        "\ref\myExample\RouterModule"  => [
            'host'=> 'rg.com',
            'username'=>'jim'
        ]
    ];

    public function init(){
        //$interface = new ReflectionClass('
efmyExamplemodule');
        static $c =0;
        foreach($this->configData as $moduleName=>$param){
            //print_r($param);
//            echo PHP_EOL;
            $moduleClass =new ReflectionClass($moduleName);
            if(!$moduleClass->isSubclassOf('
efmyExamplemodule')){
//                echo PHP_EOL;
                continue;
            }
            //print_r($moduleClass->getMethods());

            $this->handleMethod($moduleClass,$param);
        }
    }

    public function handleMethod(ReflectionClass $moduleClass ,$param){
        foreach($moduleClass->getMethods() as $method){
            $args = $method->getParameters();
            print_r($args[0]->getClass());
            print_r($args[0]);
            break;
            //print_r($args);continue;

            if(substr($method->name,0,3)!='set'  ){   //方法名不带有 set
//                echo substr($method->name,0,3);echo PHP_EOL;
                continue;
            }
            $property = strtolower(substr($method->name,3)); //取出如方法名setUsername的左起第三4位开始:Username 并转小写
            if(!isset($param[$property])){//找不到该配置
                //echo $property;echo PHP_EOL;
                continue;
            }
            $module = $moduleClass->newInstance();
            $method->invoke($module,$param[$property]);//调用方法,等同下面一行  $param['username'] = 'jim'
            //call_user_func_array([$module,$method->name],[$param[$property]]);
        }


    }
}

$run = new runModule();
$run->init();

  

原文地址:https://www.cnblogs.com/jinshao/p/13339066.html