反思或动态方法

时间:2018-03-06 21:46:46

标签: php

最佳做法是什么?

$method = 'setId';

带反射

$userClass = new ReflectionClass(User::class);
$userClass->getMethod($method)->invoke($user, [ 45 ]);

或动态

$user->$method(45);

在这种情况下,没有检查方法是否存在

1 个答案:

答案 0 :(得分:1)

PHP中存在一个错误,可以防止在使用Reflection API调用函数或方法时严格解释标量类型声明。

示例:

class C
{
    public function m(string $x)
    {
        var_dump($x);
    }
}

通过反思打电话(不要这样做!)

declare(strict_types=1);

$object = new C();
$arguments = [1];

$method = new ReflectionMethod($object, 'm');
$method->invokeArgs($object, $arguments);

结果:

string(1) "1"

结论:不要使用Reflection来调用方法。

Source