php有没有啥函数可以获取一个方法中的参数名和参数类型的

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了php有没有啥函数可以获取一个方法中的参数名和参数类型的相关的知识,希望对你有一定的参考价值。

/**
 * 获取一个函数的依赖
 * @param  string|callable $func
 * @param  array  $param 调用方法时所需参数 形参名就是key值
 * @return array  返回方法调用所需依赖
 */
function getFucntionParameter($func,$param=[]) 
    if(!is_array($param)) 
        $param = [$param];
    
    $ReflectionFunc = new \\ReflectionFunction($func);
    $depend = array();
    foreach($ReflectionFunc->getParameters() as $value) 
        if(isset($param[$value->name])) 
            $depend[] = $param[$value->name];
        elseif($value->isDefaultValueAvailable())
            $depend[] = $value->getDefaultValue();
        else
            $tmp = $value->getClass();
            if(is_null($tmp)) 
                throw new \\Exception("Function parameters can not be getClass $class");
            
            $depend[] = $this->get($tmp->getName());
        
    
    return $depend;



function test($a,$b=20) 
    echo $a,',',$b;


$depend = getFucntionParameter('test',['a'=>30,'b'=>40]);

call_user_func_array('test',$depend); // 30,40

上面的函数是我开发的框架的容器的方法。

php提供了很完整的反射机制。不但可以反射函数,还可以反射方法,反射类构造函数。

追问

看来是我没有问清楚,我想获取的是这个方法的参数变量,而不是这个方法的参数值,谢谢了

追答

上面的代码中 $value->name 就是参数名字,至于参数类型,因为是形参,所以参数类型是无法获取的。

追问

你好,是这样的,一开始我是不知道这个方法的参数名的,我是需要获取这个方法的参数名

追答function getFucntionParameterName($func) 
    $ReflectionFunc = new \\ReflectionFunction($func);
    $depend = array();
    foreach($ReflectionFunc->getParameters() as $value) 
        $depend[] = $value->name;
    
    return $depend;


function test($a,$b=20) 



$paramName = getFucntionParameterName('test');

print_r($paramName);

我只能帮你到这里了。:)

参考技术A 参数直接就可以获取了啊。
用gettype($参数) 获取变量的类型。

比如:
<?php
function say($a)
echo "参数是:".$a."<br>";
echo "类型是:".gettype($a);

say('hi');
?>追问

你误解我的问题了

参考技术B 没有吧,,可以定义一个static 静态变量 全局变量,,然后用gettype() 判读类型 参考技术C // 直接上代码,这是一个获取类方法和注释的方法
// 运行结果看:https://www.cnblogs.com/phonecom/p/11138672.html
public function generateMethod()

    $r = new \\ReflectionClass('\\think\\Build');
    $methods = $r->getMethods();

    $string = '';
    foreach ($methods as $m) 
        $limit = 'public';
        if ($m->isPrivate()) 
            $limit = 'private';
         elseif ($m->isProtected()) 
            $limit = 'protected';
        

        $methodDefinition = '### ' . $limit . ' function ' . $m->getName() . '(';
        $methodParam = $m->getParameters();
        foreach ($methodParam as $mp) 
            $type = '';
            if ($mp->hasType()) 
                    // 注意!!!注意!!!
                    // 获取参数类型
                $type = $mp->getType()->getName() . ' ';
            
            // 注意!!!注意!!!
            // 获取参数名
            $name = $mp->getName();

            $value = '';
            if ($mp->isDefaultValueAvailable()) 
                $defaultValue = $mp->getDefaultValue();
                if (is_array($defaultValue)) 
                    $value = ' = []';
                 elseif (is_bool($defaultValue)) 
                    $value = $defaultValue ? ' = true ' : ' = false ';
                 else 
                    $value = ' = \\'' . $mp->getDefaultValue() . '\\'';
                
            
            $methodDefinition .= $type . '$' . $name . $value . ',';
        
        $methodDefinition = rtrim($methodDefinition, ',');
        $methodDefinition .= ')';

        $methodDefinition .= PHP_EOL;
        $methodDefinition .= "\\t" . str_replace(['/', '*', '/'], '', $m->getDocComment());
        $methodDefinition .= PHP_EOL;
        $methodDefinition .= PHP_EOL;

        $string .= $methodDefinition;
    

    file_put_contents('./classMethodList.txt', $string);

参考技术D 这个好像没有吧

从 C++ 中的 PHP 扩展获取函数参数值

【中文标题】从 C++ 中的 PHP 扩展获取函数参数值【英文标题】:Getting function argument value from PHP extension in c++ 【发布时间】:2019-09-24 03:49:26 【问题描述】:

我已经在c++中创建了php扩展。在php 5.6版本中可以获取当前执行的函数细节。我得到的参数值如下,

if (real_execute_data->function_state.arguments)
    
        void **p = real_execute_data->function_state.arguments;
        int arg_count = (int)(zend_uintptr_t)* p;

        zval *argument_element;
        for (i = 0; i < arg_count; i++)
        
            argument_element = (zval*)*(p - (arg_count - i));
            // here can reads the value from argument_element 
        
    

在 PHP 7.2 版本中,我在 Zend_execute_data 中找不到 function_state 结构。我尝试使用 _zend_arg_info 结构,它给出了函数参数变量名称,而不是值。 如何在上面的 php 7 中获取函数参数值?

【问题讨论】:

你检查过wiki.php.net/phpng-upgrading 吗? 【参考方案1】:

是的。我得到了它。 在php 7及以上我们可以得到函数参数如下(zend_execute_data *real_execute_data),

 int arg_count = ZEND_CALL_NUM_ARGS(real_execute_data);
    int i;
    for (i = 1; i <= arg_count; i++)
    
        zval *argument_element = ZEND_CALL_ARG(real_execute_data, i);
        // we can reads the argument value from "argument_element".
    

【讨论】:

以上是关于php有没有啥函数可以获取一个方法中的参数名和参数类型的的主要内容,如果未能解决你的问题,请参考以下文章

使用反射获取方法名和参数

重载和重写有啥区别

php函数参数中的&符号是啥意思

如何查看DLL中的函数名及参数

将表名和列名定义为 plpgsql 函数中的参数?

PHP中函数的参数和参数有啥不同? [复制]