在具有PHP 5.6运行时的项目中,我需要解决一些第三方代码。该代码不会被供应商更改,也不会从代码库中删除。
具体来说,第三方代码(我们将其称为命名空间\Theirs\BaseClass
)包含一个类(\Theirs\Detector
),该类的构造函数实例化了另一个类(<?php namespace Theirs;
class Detector {
public function __construct() {
print "Theirs\n";
}
}
class BaseClass {
public function __construct() {
$detector = new Detector();
}
}
)。
BaseClassTheirs.php :
BaseClass
我不希望\Theirs\Detector
实例化BaseClass
。相反,我希望Detector
实例化来自 命名空间(Mine
)之外的 BaseClass
类。第三方的控制权。
但是,在所有其他方面,我希望\Theirs\BaseClass
像第三方代码中那样运行,包括如果供应商以后向\Mine\BaseClass
添加了附加功能。 (我将此属性称为“ 非脆弱性”,而缺少该属性则称为“ 脆弱性”。)因此,对于我来说,创建自己的{{ 1}}作为\Theirs\BaseClass
的子代,继承了它的所有内容。
如果我采用将复制\Theirs\BaseClass
的构造函数复制到\Mine\BaseClass
的脆弱,非DRY方法,则 {{1 }}被实例化:
BaseClassMine.php :
\Mine\Detector
但是,如果我通过删除重复的代码将其更改为 DRY,非脆弱的方法,以便<?php namespace Mine;
include "BaseClassTheirs.php";
class Detector {
public function __construct() {
print "Mine\n";
}
}
class BaseClass extends \Theirs\BaseClass {
public function __construct() {
$detector = new Detector();
}
}
\\ Prints "Mine"
$obj = new BaseClass();
调用完全相同的构造函数,但从其父级继承而不是继承复制粘贴,然后调用 \Mine\BaseClass
,这不是我想要的:
BaseClassMine.php :
\Theirs\Detector
无论文件是否包含<?php namespace Mine;
include "BaseClassTheirs.php";
class Detector {
public function __construct() {
print "Mine\n";
}
}
use \Mine\Detector;
class BaseClass extends \Theirs\BaseClass {
}
\\ Prints "Theirs"
$obj = new BaseClass();
行,都会发生这种情况,如上所述。
我如何才能充分利用这两种方法?
即我如何从use \Mine\Detector;
的构造函数中调用\Theirs\Baseclass
的构造函数以使其调用\Mine\Baseclass
,就像\Mine\Detector
的构造函数只是被复制粘贴到\Theirs\Baseclass
的上下文,但实际上没有复制粘贴并引入相应的脆弱性?
例如,是否有很好的方法使用反射或其他自省技术动态读取父级的构造函数并将其在运行时“粘贴”到子类中?