在PHP中创建一个方法会在被调用后自动运行一些代码。可能?

时间:2012-03-11 02:11:41

标签: php class methods automation

我不确定我要找的是否有名字,所以我搜索有点困难,所以如果我之前已经回答过我的问题,我很抱歉。

情况是我有一个抽象类,当然还有很多其他扩展它的类。

抽象类中的抽象方法称为run(),所有扩展类都定义了此方法。

我的问题是我想在调用run()方法后调用一些公共代码,但我想知道是否有更好的方法来执行此操作。

我当然可以将我的公共代码粘贴到每个扩展类的run()方法中,但如果我这样做,那么从那时起进行简单的更改对我来说将是很多工作。< / p>

我还可以将我的公共代码放入父类的方法中,然后使用run()从扩展类的$this方法调用if。

但我的问题是,有更好的方法可以做到这一点,还是我必须使用$this关键字或将代码粘贴到每个类中?

以下是我想用现有想法做的一个小例子:

abstract class Parent_Class {
    public abstract function run();

    protected function common_code() {
        // Common code here
    }
}

class Child_Class {
    public function run() {
        // Code here
        // I want some common code to run after the run method has been called

        $this->common_code(); // Is this the best way to do it?
    }
}

或者是否有可能以某种方式告诉班级何时调用run()方法自动运行common_code()方法?

3 个答案:

答案 0 :(得分:2)

更简单的方法是简单地使用第三种方法调用run(),然后调用common_code()。然后,子类可以覆盖run()所需的全部内容。

abstract class Parent_Class {
    public abstract function run();

    protected function common_code() {
        // Common code here
    }

    protected function start() {
        $this->run();
        $this->common_code();
    }

}

class Child_Class {
    public function run() {
        // Code here
    }
}

答案 1 :(得分:1)

Amber给出的答案很简单。但是,您需要将数据放入run(),但请致电start()。这是一个替代方案,允许您在所有脚本中使用代码$a->run(),并使用公共代码$a->run(),但封装在命名空间中。

文件hooks.php

<?php
// File: hooks.php
namespace hook;

class processHooks {
    public function __construct() { /* Fatal Error without constructor */ }

    protected function processHooks($_c, $method, $args) {
        /* Swap the next two callbacks to run your custom code after */
        call_user_func_array("\hook\\{$_c}::{$method}", $args);
        return call_user_func_array(array($_c,$method), $args);
    }
}

class A {
    public function foo() {
        echo 'Doing code stuff BEFORE calling child function....<br>';
    }
}

文件regular_file.php

<?php
// File: regular_file.php
include "hooks.php";

class A extends \hook\processHooks {

    /* All that is required is this function
     * and the function with common code to be protected
     */
    public function __call($method, $args) {
        self::processHooks(__CLASS__, $method, $args);
    }

    protected function foo() {
        echo 'Method is called....<br>';
    }
}

$a = new A();
$a->foo();

这是因为 regular_file.php 中的 f 类的方法 foo 受到保护,因此它不能在类外调用,所以调用它触发PHP魔术方法__call

  在对象上下文中调用不可访问的方法时会触发

__ call()。

答案 2 :(得分:1)

根据Bradley Forster的回答,您可以将方法定义为受保护,因此当从类外部调用它时,您可以使用php magic __call metod拦截事件,因为

  在对象上下文中调用不可访问的方法时会触发

__ call()。

然后你可以从__call函数

执行该方法
class A {

  public function __call($method, $args){

     if(!method_exists($this, $method))
       throw new Exception("Call to undefined method ".__CLASS__."::$method()");

     echo "doing something BEFORE function 'run' execution\n";

     $retval = call_user_func_array(array($this, $method), $args);

     echo "doing something AFTER function 'run' execution\n";

     return $retval;
  }

  protected function run() {
      echo "function 'run' executed\n" ;
  }
}

$a = new A;
$a->run();