为了简化我的类的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?
答案 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);
}