我有一个带有一些受保护字段的对象和一个使用它们的方法。该方法并不完全符合我的要求,但由于我正在编写附加组件,因此无法更改原始代码。 是否有可能扩展类并重写方法,以便我可以在原始类的预定义对象上调用它?我想过猴子补丁,但显然它没有在php中实现。
答案 0 :(得分:1)
您可以通过扩展父类来重写方法,启动新类而不是父类,并将方法命名与父方法完全相同,即调用子方法而不是父类
示例:
class Foo {
function sayFoo() {
echo "Foo";
}
}
class Bar extends Foo {
function sayFoo() {
echo "Bar";
}
}
$foo = new Foo();
$bar = new Bar();
$foo->sayFoo() //Outputs: Foo
$bar->sayFoo() //Outputs: Bar
答案 1 :(得分:0)
我希望下面的政治会有效。假设该类为Foo
且方法为bar()
。对于覆盖bar()
方法,您必须按照下面的说明进行customFoo
课程。
class CustomFoo extends Foo{
public function bar(){
parent::bar();
}
}
我实际上并不知道你需要什么,因为你没有详细解释过。我仍然尽我所能。 :)
答案 2 :(得分:0)
尝试创建扩展对象当前派生自的基类或父类的子类。 创建一个与Parent类中的方法完全相同的新方法,并将逻辑放在那里。 现在从新类中实例化您的对象,您将成功覆盖该特定方法,并仍然可以访问基类的方法和属性。
答案 3 :(得分:0)
问题是,一旦你加载了这个课程,你就无法正式卸载它,你需要加载它才能扩展它。所以它非常紧密。最好的办法是破解原始类(不理想)或将原始类定义复制粘贴到新文件中:
class ParentClass {
//Copy paste code and modify as you need to.
}
在框架引导后的某个地方:
spl_autoload_register(function ($class) {
if ($class == "ParentClass") { //Namespace is also included in the class name so adjust accordingly
include 'path/to/modified/ParentClass.php';
}
},true,true);
这样做是为了确保您自己的修改后的类将在原始类之前加载。 这非常hacky所以首先检查您使用的框架是否具有本机支持。