覆盖一个保持原始类名和文件的类方法(更干净的方式? - PHP / Joomla)

时间:2017-05-29 13:59:54

标签: php class joomla override

我知道这种方法远非干净,但经过多次研究后,这是唯一有效的方法。问题是我无法修改原始文件,我希望该类更改方法(不是实例,整个类定义)。为了使用Joomla和我正在使用的插件,类名不得更改。

此覆盖是使用自定义插件进行的。这意味着如果我愿意,我可以覆盖整个原始文件。但我想只覆盖一个方法,以获得与下一个插件升级的最佳兼容性。它将保留原始类的所有其他方法。

由于这个类还扩展了另一个类,它必须保留在其他地方的其他扩展名的全局命名空间中,这个问题有点变硬了。

我发现的方法,它有效,但真的很难看:

文件1 - 主替换文件替换为:

//kept from original file, because its class must stay global
require_once(PLG_ROOT . '/parentClass.php');
//import the original class wrapped in a namespace
require_once(dirname(__FILE__) . '/wrappedClass.php');

//overriding the method with inheritance from wrapped class
class FixedName extends \theSpace\FixedName
{
    public function iAmOverriden() { }
}

文件2 - 在命名空间中以脏方式导入的原始文件:

eval("namespace theSpace {
    //making the global parent class available in the space
    use \ParentName as ParentName;
    ?>" . file_get_contents(PLG_ROOT . '/originalClass.php') . '}');

这样,来自originalClass.php的文件内容能够创建具有父级继承的类,并且我没有名称冲突。但是,好吧,丑陋,不是吗?还有另一种方法可以在PHP中执行此操作吗?

0 个答案:

没有答案