用反射重构旧 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是否符合你的要求,我认为这是一个很好的解决方案
($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
所以我正在重构一些别人写的旧代码。我遇到过这个:
$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是否符合你的要求,我认为这是一个很好的解决方案
($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