如何将函数绑定到PHP中的另一个函数“事件状态”

时间:2014-06-29 13:38:00

标签: php debugging logging binding

为了简化我的类的debuging,我想将一个函数绑定到其他函数事件的状态。我目前的设置类似于遵循代码:

class config {

    function __construct($file) {

        $this->functions = array(); // The array with function run/succes information

        if (!empty($file)) {
            $this->checkFile($file);
        }
    }

    public function checkFile($file) {
         $this->functionStatus('run',true);

         if (file_exists($file)) {

            $this->functionStatus('succes',true);
            return true; 
        } else {
            $this->functionStatus('succes',true);
            return false;
        }
     }

    /* Simplified functionStatus function */
    private function functionStatus($name,$value) {

        /* - validations removed -*/

        // Get parent function name
        $callers = debug_backtrace();
        $function = $callers[1]['function'];

         /* - validations removed -*/


        $this->functions[$function][$name] = $value;
    }
}

使用原则的一个例子:

$config = new config('example.ini');
print var_dump($config->functions);
/* Results in:
array(1) { 
    ["checkFile"]=> array(2) { 
        ["run"]=> bool(true) 
        ["succes"]=> bool(true) 
    } 
} 
*/

虽然这个设置工作正常。我希望通过在每次创建函数时删除手动放置的$this->functionStatus('run',true)函数来改进它,以保持代码更清洁,并防止假设函数不运行,因为有人在forgat顶部定义了functionStatus。功能。返回事件的定义也是如此。

*注意,最好的解决方案也支持与其他类的绑定 有没有办法实现这个事件绑定'用PHP?

1 个答案:

答案 0 :(得分:0)

您可以使用__call魔术方法执行此操作。将所有公共函数更改为私有方法,并为名称添加前缀,例如

private function internal_checkFile($file) {
    ...
}

然后添加魔法:

public function __call($name, $arguments) {
    $this->functionStatus('run', true);
    return call_user_func_array(array($this, "internal_$name"), $arguments);
}