在回调中使用$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();
});
}
}
所以,我有这样的东西:
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();
});
}
}