用反射重构旧 php

refactoring old php with reflection

所以我正在重构一些别人写的旧代码。我遇到过这个:

$r = new \ReflectionClass($className);
$args = (is_subclass_of($className, 'ClassA')) ? [$arg1, $arg2] : [$arg2];
$classInstance = $r->newInstanceArgs($args);

我的问题是,为什么这个人会这样做?这不也是一样吗?

$args = (is_subclass_of($className, 'ClassA')) ? [$arg1, $arg2] : [$arg2];
$classInstance = new $className($args);

该代码已有数年历史 - 原因可能与旧的 PHP 版本功能有关。我只是在寻找原因和确认第二种方式是"better"。谢谢

是的,为此不需要 ReflectionClass。

在删除它之前,您需要确保代码的其他部分没有使用 $r。

仅供参考:

  • is_subclass_of 自 PHP 4
  • 可用
  • ReflectionClass::isSubclassOf 自 PHP 5
  • 起可用

你应该检查instanceof是否符合你的要求,我认为这是一个很好的解决方案

http://php.net/instanceof

($a instanceof MyClass)

答案是因为 "dynamic argument list." 所以第二个版本必须看起来像这样 正确:

if (is_subclass_of($className, 'ClassA')) {
    $classInstance = new $className($arg1, $arg2);
} else {
    $classInstance = new $className($arg2);
}

array 传递给任一构造函数都不起作用:

class ClassA
{
    public $arg1;
    public $arg2;

    public function __construct($arg1, $arg2)
    {
        $this->arg1 = $arg1;
        $this->arg2 = $arg2;
    }
}

$className = 'ClassA';

$args = (is_subclass_of($className, 'ClassA')) ? [1, 2] : [2];
$classInstance = new $className($args);

var_dump($classInstance);

// object(ClassA)[1]
//  public 'arg1' => 
//    array (size=1)
//      0 => int 2
//  public 'arg2' => null