首页 > Windows开发 > 详细

PHP 反射API 例子

时间:2020-07-19 14:38:59      阅读:60      评论:0      收藏:0      [点我收藏+]
学习了《深入PHP 面向对象、模式与实践》,根据自己理解也写了一个类似的反射类使用,以便加深理解

namespace ref\myExample;

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(‘\ref\myExample\module‘);
        static $c =0;
        foreach($this->configData as $moduleName=>$param){
            //print_r($param);
//            echo PHP_EOL;
            $moduleClass =new \ReflectionClass($moduleName);
            if(!$moduleClass->isSubclassOf(‘\ref\myExample\module‘)){
//                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();

  

PHP 反射API 例子

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

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!