为什么ReflectionParameter :: isArray总是返回false?

时间:2014-03-06 20:20:11

标签: php oop reflection

所以我有这个简单的代码:

<?php

class TestClass {

    public function test_function($id, $values = array()) 
    {

        $ref_met = new ReflectionMethod(__METHOD__);
        foreach($ref_met->getParameters() as $param) {
            if($param->isArray()) {
                echo "$param->name is an array\n";
            } else {
                echo "$param->name is NOT an array\n";
            }
        }       
    }

}

$t = new TestClass();
$t->test_function(5, array());

$values方法参数是一个数组,你可以在函数定义中告诉我,如果我使用反射来获取它们总是返回的方法参数信息而不是数组。

我甚至可以尝试将反射相关代码提取到另一个单独的函数,这样它就不会在方法本身上执行,但无济于事:

<?php

class TestClass {

    public function test_function($id, $values = array()) 
    {

    }

}

function test_reflection() 
{
    $ref_met = new ReflectionMethod('TestClass::test_function');
    foreach($ref_met->getParameters() as $param) {
        if($param->isArray()) {
            echo "$param->name is an array\n";
        } else {
            echo "$param->name is NOT an array\n";
        }
    }
}


test_reflection();

有什么我不了解PHP的反思吗?我已阅读并重新阅读documentation,但我找不到任何告诉我我做错事的内容。

我正在使用PHP 5.4.20,如果这很重要。

1 个答案:

答案 0 :(得分:2)

因为RelectionParameter :: isArray()检查方法是否期望参数是否为数组。如果方法默认为数组,则不会。它正在检查类型提示而不是默认参数。如果没有提示,参数可以是任何内容,因此isArray检查将为false。如果没有为参数提供任何内容,则该值仅默认为空数组,但由于您的签名现在可能是任何内容。

http://se2.php.net/manual/en/reflectionparameter.isarray.php

  

如果需要数组,则为TRUE,否则为FALSE。

让你的班级成为这样,这将是真的:

class TestClass {

    public function test_function($id, array $values = array()) 
    {

    }

}