所以,我有这样的事情:
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());
}
答案 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();
});
}
}