php调用外部函数作为内部方法

时间:2014-10-08 10:03:00

标签: php oop

我想在php中创建类似jquery的语法,我写了那个类:

class events{

    public function auth($user, $pass, $callback){
        $status = 0;
        if($user and $pass){
            $status = 1;
        }
        call_user_func($callback, $status);
    }

    public function login(){
        echo "Welcome!";
    }

}

$events = new events;
$user = "u";
$pass = "p";

这就是Jquery的语法:

/**
 * Jquery type callback function
 */
$events->auth($user, $pass, function($status){
    if($status){
        $this->login();
    }else{
        echo "Fail";
    }
});

一切都没关系,除了$ this变量我在外面使用了类方法,我不能使用回调函数作为内部函数将$ this用于该函数代码。 我可以通过改变班级中的某些内容来纠正错误吗?

3 个答案:

答案 0 :(得分:4)

您需要使用Closure::bind将匿名函数绑定到对象。


实施例

class events{

    public function auth($user, $pass, $callback){
        $status = 0;
        if($user and $pass){
            $status = 1;
        }
        call_user_func(Closure::bind($callback, $this), $status);
    }

    public function login(){
        echo "Welcome!";
    }

}

$events = new events;
$user = "u";
$pass = "p";

$events->auth($user, $pass, function($status){
    if($status){
        $this->login();
    }else{
        echo "Fail";
    }
});

输出:

Welcome!

另请注意,没有必要使用call_user_func(),如果您愿意,可以用以下内容替换该行:

$callback = $callback->bindTo($this);
$callback($status);

答案 1 :(得分:1)

您可以将类的实例传递给回调:

<?php
class events{

    public function auth($user, $pass, $callback){
        $status = 0;
        if($user and $pass){
            $status = 1;
        }
        $callback($status, $this);
    }

    public function login(){
        echo "Welcome!";
    }

}

$events = new events;
$user = "u";
$pass = "p";


/**
 * Jquery type callback function
 */
$events->auth($user, $pass, function($status, $self){
    if($status){
        $self->login();
    }else{
        echo "Fail";
    }
});

答案 2 :(得分:1)

没有办法&#34;绑定&#34;对JavaScript等特定对象的闭包。因此,$this关键字不能在类之外使用。但是,由于$events$this将引用的实例,因此您可以执行此操作:

$events->auth($user, $pass, function($status){
    if($status){
        $events->login();
    }else{
        echo "Fail";
    }
});

编辑:显然我错了,there is a way将闭包绑定到特定实例。见保罗的回答。