0

我想在 php 中检测方法的参数是否为空。我使用 ReflectionParameter 但它在检测参数类型时有奇怪的行为。这是我测试的代码:

 class myClass{

        public function test($param2=null,$param1,$param3='something'){
                echo  "it's $param1";

                if(!is_null($param2)){
                    echo "<br> it's $param2";
                }
        }

        public function reflection(){
            $reflection = new ReflectionMethod($this,'test');
            $params = $reflection->getParameters();

            echo '<pre> public function test($param2=null,$param1,$param3=\'something\'){}
            <hr>';
            #var_dump($params);
            #echo '<hr>';
            $this->reflection_parameter(0);
            echo '<hr>';
            $this->reflection_parameter(1);
            echo '<hr>';
            $this->reflection_parameter(2);
        }

        public function reflection_parameter($position){
            $p = new ReflectionParameter(array($this,'test'),$position);
            #var_dump($p->getPosition(),$p->getName(),$p->getDeclaringFunction());
            var_dump('allowsNull()',$p->allowsNull());
            var_dump('isOptional()',$p->isOptional());
            #var_dump('isArray()',$p->isArray());
            #var_dump('isCallable()',$p->isCallable());
            var_dump('isDefaultValueAvailable()',$p->isDefaultValueAvailable());
            #var_dump('getDefaultValue()',$p->getDefaultValue());
            #var_dump('class',$p->getDeclaringClass()->name);
        }

 }

 $refl= new myClass();
 $refl->reflection();

我附上了输出截图: http: //axgig.com/images/21110184497178611107.png

如你看到的

public function test($param2=null,$param1,$param3='something')

param2 可以为 null,但 isOptional 和 isDefaultValueAvailable 都为 false 与没有任何默认值的 param1 相同,但对于 param3 它返回 true

现在将测试函数的第一行更改为:

public function test($param1,$param2=null,$param3='something')

并查看输出: http : //axgig.com/images/85816853742428271329.png 现在 isOptional 和 isDefaultValueAvailable 对于 param2 是 true 而对于以前的使用是 false

4

1 回答 1

1

tl; dr:你不能不自己解析原始 php 文件。

是的。这是正常的,因为在 PHP 中调用函数时不能省略参数。直到最后一个没有默认值的参数之前的所有参数都不是可选的,并且它们的最终默认值将被忽略。

于 2013-06-30T12:24:16.693 回答