从子级调用父级构造函数,就好像它在子级范围内一样

时间:2018-07-27 15:17:27

标签: php oop inheritance constructor namespaces

背景

在具有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的上下文,但实际上没有复制粘贴并引入相应的脆弱性?

例如,是否有很好的方法使用反射或其他自省技术动态读取父级的构造函数并将其在运行时“粘贴”到子类中?

相关但不完全相同的问题

0 个答案:

没有答案