是否可以跟踪当前的PHP函数/方法?

时间:2018-08-17 05:52:19

标签: php

我有一个PHP Class方法,其中包含许多条件语句,如果某些条件为真,它将停止/返回。

对于调试,我想知道实际上是什么条件使函数返回了控件。

breakpoint

我无法控制调用它的函数/方法。

3 个答案:

答案 0 :(得分:3)

您可以对其进行日志处理

public function handle_request() {
        if ( ! $this->is_data_writable() ) {
            error_log("is_data_writable", 3, "/var/tmp/my-errors.log");
            return;
        }
        if ( ! $this->user_has_permissions() ) {
            error_log("user_has_permissions", 3, "/var/tmp/my-errors.log");
            return;
        }
        if ( 'active' != $this->object->status ) {
            error_log("not_active", 3, "/var/tmp/my-errors.log");
            return;
        }

        // do the stuff
}

您可以使用自己的错误处理程序自定义错误处理,以便在发生错误或警告或需要记录的任何内容时为您调用此功能。

https://www.w3schools.com/php/func_error_log.asp

答案 1 :(得分:0)

您可以执行debug_print_backspace函数以打印调用堆栈。 http://php.net/manual/en/function.debug-print-backtrace.php

答案 2 :(得分:0)

您可以使用以下方法: 创建一个包含所有步骤的数组,并使用全局变量来跟踪该步骤:

$request_error='';
public function handle_request(){
    $steps=['is_data_writable','user_has_permissions','active'];
    global $request_error;
    foreach($steps as $step){

        if($step!='active'){
            if(! $this->$step()){
                $request_error=$step;
                return;
            }
        }else{
            if($step!=$this->object->status){
                $request_error=$step;
                return;
            }
        }

    }
    //do the stuff
}

然后您可以根据需要使用$request_error

另一种非常相似的方法是: 创建一个包含所有步骤的数组,并使用引用来跟踪该步骤,但这将改变您的方法原型:

public function handle_request(&$request_error){
    $steps=['is_data_writable','user_has_permissions','active'];
    foreach($steps as $step){

        if($step!='active'){
            if(! $this->$step()){
                $request_error=$step;
                return;
            }
        }else{
            if($step!=$this->object->status){
                $request_error=$step;
                return;
            }
        }

    }
    //do the stuff
}

然后您可以根据需要使用分配的值。您可以通过这种方法为参数指定默认值以使其生效 可选的 请注意,您可以避免使用数组,但是会多写一些。