PHP:更改方法行为

时间:2016-08-03 13:03:48

标签: php oop

我有一个带有一些受保护字段的对象和一个使用它们的方法。该方法并不完全符合我的要求,但由于我正在编写附加组件,因此无法更改原始代码。 是否有可能扩展类并重写方法,以便我可以在原始类的预定义对象上调用它?我想过猴子补丁,但显然它没有在php中实现。

4 个答案:

答案 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所以首先检查您使用的框架是否具有本机支持。