zoukankan      html  css  js  c++  java
  • 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();
    

      

  • 相关阅读:
    移动端rem屏幕设置
    封装ajax库,post请求
    获取浏览器url参数
    身份证验证
    jq封装插件
    页面分享功能,分享好友、朋友圈判断,用share_type做标记 这里用的是jweixin-1.3.2.js
    @RequestParam和@RequestBody区别
    400报错
    IDEA中用Maven构建SSM项目环境入门
    Eclipse搭建Spring开发环境
  • 原文地址:https://www.cnblogs.com/jinshao/p/13339066.html
Copyright © 2011-2022 走看看