在回调中使用$ this指的是回调类

时间:2015-01-03 22:48:13

标签: php callback this

所以,我有这样的事情:

class ClassA{

    public function doCallback($callback){
        call_user_func_array($callback, array());
    }

    public function doSomething(){
        return 12345;
    }

}


class ClassB{

    public function runMe(){
        $classA = new ClassA();

        $classA->doCallback(function(){
            $this->doSomething();
        });

    }

}

我试图弄清楚如果可能的话,我可以在回调函数中使用$this或类似的东西,它将引用运行回调的类(不是它所在的类)有道理。

因此,在上面的示例中,我希望$this->doSomething(); $this表示ClassA而非ClassB。目前$this指的是ClassB。有什么我可以用来说我想要ClassA吗?

修改

以下是我使用的实际方法

public function save(){
    $id    = (int)$this->input->post("id");
    $title = $this->input->post("title");
    $uid   = (int)$this->session->get("id");

    $this->db->getTable("content")
    ->has(array("user_id" => $uid, "name" => $title), function(){
        echo json_encode(array("error" => "Name already exists."));
    }, function() use($id, $uid, $title){
        //$this->db->getTable("content")
        $this->update(array("name" => $title), array(
            "user_id"    => $uid,
            "content_id" => $id), function($rows){
            if($rows > 0){
                $error = "";
            }else{
                $error = "Unknown error occurred";
            }
            echo json_encode(array("error" => $error));
        });
    });
}

$this->db->getTable("content")返回数据库对象,has()是对象中的方法。我希望我可以使用简写方式访问$this->db->getTable("content"),而无需在回调中再次调用它,或者将其作为参数传递给call_user_func_array或不使用use()

方法has()
https://github.com/ZingPHP/Zing/blob/master/Zing/src/Modules/Database/DBOTable.php#L311

修改

我认为在我的回调函数中我需要做这样的事情,但我认为它不起作用:

public function myFunc(callback $callback){
    $callback->bindTo($this, $this);
    return call_user_func_array($callback, array());
}

2 个答案:

答案 0 :(得分:0)

您可以浏览ClassA

的公共界面
class ClassA
{
    public function doCallback($callback)
    {
        call_user_func_array($callback, array());
    }

    public function doSomething()
    {
        echo "Doing something...\n";
    }

}


class ClassB
{
    private $_oSubject;

    public function __construct(ClassA $oSubject)
    {
        $this->_oSubject = $oSubject;
    }

    public function runMe()
    {
        $this->_oSubject->doCallback(function() {
            $this->_oSubject->doSomething();
        });
    }
}

$oA = new ClassA();
$oB = new ClassB($oA);
$oB->runMe();

答案 1 :(得分:0)

我明白了!我只需要在回调类中添加$newCallback = $callback->bindTo($this, $this);,然后在ClassB中我可以使用$this来引用ClassA

class ClassA{

    public function doCallback($callback){
        $callback = $callback->bindTo($this, $this);
        call_user_func_array($callback, array());
    }

    public function doSomething(){
        return 12345;
    }

}


class ClassB{

    public function runMe(){
        $classA = new ClassA();

        $classA->doCallback(function(){
            $this->doSomething();
        });

    }

}