PHP利用反射获取class method 和function的源码

  • 反射获取function源码 

继承ReflectionFunction,扩展getSource方法:

<?php

/*
    ___        __                   _        ____   ____ 
   /   |  ____/ /____ _ ____ ___   (_)____  / __ \ / __ \
  / /| | / __  // __ `// __ `__ \ / // __ \/ /_/ // / / /
 / ___ |/ /_/ // /_/ // / / / / // // / / /\__, // /_/ / 
/_/  |_|\__,_/ \__,_//_/ /_/ /_//_//_/ /_//____/ \____/  
                                                        
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                 做一款产品       愉悦自己                
****************Powered by Adamin90********************
* @email: 14846869@qq.com
* Date: 2018/12/27
* Time: 20:00
* @link: https://www.lixiaopeng.top
*******************************************************
*/

namespace app\common\logic;


class FunctionExtract  extends \ReflectionFunction
{
    /**
     * @return bool|string
     * @author Adam
     * Time: 2018/12/27 20:30
     * Description:获取function源码 
     */
    public function  getSource(){
        if(!file_exists($this->getFileName())){
            return false;
        }
        $startoffset=$this->getStartLine()-1;
        $endoffset=$this->getEndLine()-$this->getStartLine()+1;
        //   return $this->getFileName();
        return join('',array_slice(file($this->getFileName()),$startoffset,$endoffset));
    }

    public function index(){
        echo $this->getSource('id_decode');
    }

}

使用方法:

实例化 FunctionExtract类,构造器传入funtion名称即可

$fc = new FunctionExtract("get_avatar");
echo $fc->getSource();

输出结果:

function get_avatar($uid) { $avatar = Db::name('user')->where('id', $uid)->value('avatar'); if (!empty($avatar)) { $path = get_file_path($avatar); if($path !== false) { return $path; } } //默认头像地址 return '/static/mobile/images/avatar.jpg'; }
  • 反射获取Method源码 

继承ReflectionMethod,自定义getSource方法

class MethodExtract  extends \ReflectionMethod
{
    /**
     * @return bool|string
     * @author Adam
     * Time: 2018/12/27 20:35
     * Description:利用反射提取Mechod方法 
     */
    public function getSource(){
        if(!file_exists($this->getFileName())){
            return false;
        }
        $startoffset=$this->getStartLine()-1;
        $endoffset=$this->getEndLine()-$this->getStartLine()+1;
        return join('',array_slice(file($this->getFileName()),$startoffset,$endoffset));
    }

}

使用:

$tm = new MethodExtract('app\mobile\controller\Area', 'citylist');
echo $tm->getSource();
  • 反射获取class源码

继承ReflectionClass类,自定义getSource方法

class ClassExtract extends \ReflectionClass
{
    /**
     * @return bool|string
     * @author Adam
     * Time: 2018/12/27 20:36
     * Description:反射获取类源码 
     */
    public function getSource()
    {
        if (!file_exists($this->getFileName())) {
            return false;
        }
        $startoffset = $this->getStartLine() - 1;
        $endoffset = $this->getEndLine() - $this->getStartLine() + 1;
        return join('', array_slice(file($this->getFileName()), $startoffset, $endoffset));
    }
}


使用:

$ce = new ClassExtract('app\mobile\controller\Area');
echo $ce->getSource();


完美

Adam博客
请先登录后发表评论
  • 最新评论
  • 总共0条评论
  • Powered by bjyblog modified by Adam © 2014-2019 www.lixiaopeng.com 版权所有 ICP证:鲁ICP备15039297号
  • 联系邮箱:14846869@qq.com