在回调中使用$this 参考回调class

Use $this in callback refer to callback class

所以,我有这样的东西:

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 或类似的东西,它将引用运行回调的 class (不是 class 如果说得通,它就在里面。

所以在我上面的例子中我想要 $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")returns一个数据库对象,has()是对象中的一个方法。我希望我可以使用 shorthand 方式访问 $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());
}

您可以通过ClassA的public接口。

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();

我明白了!我只需要在回调class中加上$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();
        });

    }

}