魏长东

weichangdong

东邪

获取php类下有哪些方法,以及方法参数

有时候,php只知道某个类,但是类里面有啥方法却不得而知,常见的是别人写的php扩展,你通过php -m或者phpinfo可以看到类名,但是不知道下面有哪些可用的方法。进一步知道了方法名,但是不知道方法怎么用,需要传什么参数。下面的代码,完美的解决了这些顾虑。

print_r(get_loaded_extensions());//打印出所有加载的扩展,和命令行执行php -m差不多
$cache = new constcache();// 公司自己写的扩展
$cache->add('wcd','swordman');
echo $cache->get('wcd');
var_dump($cache);
$ext = 'cashbox';//公司自己写的扩展
print_r(get_extension_funcs($ext)); // 打印出cashbox这个扩展有哪些方法
$dom = new ReflectionExtension($ext);
$aMethods=$dom->getFunctions();//打印出这个类有哪些方法,作用和get_extension_funcs($ext)一样
//print_R(get_defined_functions());//打印出所有的方法,和php手册列出来的差不多,还包括自己写的方法
$class = get_class_methods($cache);//获取这个类下所有的方法,和get_extension_funcs($ext)作用一样
$methods='dosign';
// 以下的代码的作用是,找出所有的方法或者指定的某一个方法的参数的信息
foreach($aMethods as $param){
        $name = $param->name;//方法名
	echo $name;
        $args = array();
        if($methods){
            if(strtolower($name) !== strtolower($methods))
                continue;
        }
        foreach ($param->getParameters() as $param) {
            $tmparg = '';
            if ($param->isPassedByReference()) $tmparg = '&';
             
            if ($param->isOptional()) {
                try {
                    $DefaultValue = $param->getDefaultValue();
                    if(is_null($DefaultValue))
                        $DefaultValue = 'null';
                         
                    $tmparg = '[' . $tmparg . '$' . $param->getName() . ' = ' .
 $DefaultValue . ']';
                } catch( Exception $e ) {
                    $tmparg = '['.$tmparg . '$' . $param->getName().']';
                }
            } else {
                $tmparg .= '$'.$param->getName();
            }
            $args[] = $tmparg;
            unset ($tmparg);
        }
        $functions_list[$name] = 'function ' . $name. '(' . strtr(implode(', ', $args),
array('], ['=>', ')) . ')' . PHP_EOL;
    }
print_r($functions_list);
//和以下的代码差不多,
function fun_info($funName=null){
    static $func = array();
    !$func && $func = get_defined_functions();
    if(!$funName){
       $flist = array();
       $flist['internal'] = fun_info('fun_info');
       return $flist;
    }else{
        if($func[$funName]){
            $funcs = $func[$funName];
        }else{
            $funName = strtolower($funName);
            $funcs = array($funName); //
        }
    }
    foreach ($funcs as $func_val){
        $f = new ReflectionFunction($func_val);
        $args = array();
        $isUserDefined = $f->isUserDefined(); // 是否为用户自己定义的函数
	$isUserDefined = $isUserDefined ? 'yes' : 'no';
        // $f->export('error_reporting'); // 
        foreach ($f->getParameters() as $param) {
                $tmparg = '';
                if ($param->isPassedByReference()) $tmparg = '&';
                if ($param->isOptional()) {
                    try {
                        $DefaultValue = $param->getDefaultValue();
                        if(is_null($DefaultValue))
                            $DefaultValue = 'null';
                        $tmparg = '[' . $tmparg . '$' . $param->getName() . ' = ' .
 $DefaultValue . ']';
                    } catch( Exception $e ) {
                        $tmparg = '['.$tmparg . '$' . $param->getName().']';
                    }
                } else {
                    $tmparg .= '$'.$param->getName();
                }
                $args[] = $tmparg;
                unset ($tmparg);
        }
        $functions_list[$func_val] = 'function ' . $func_val . '(' .
 strtr(implode(', ', $args),
array('], ['=>', ')). ')' .$isUserDefined.PHP_EOL;
    }
    return $functions_list;
}
//测试是否能判断出这个方法是我自己定义的
function wcd(){
}
print_r(fun_info('wcd'));

运行部分结果:

Array
(
    [0] => dosign
)
dosignArray
(
    [dosign] => function dosign($url, $unixtime)

)
Array
(
    [wcd] => function wcd()yes

)