所以我有这个简单的代码:
<?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,如果这很重要。
答案 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())
{
}
}