Использовать $ 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());
}

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

}

}
0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector