Итак, у меня есть что-то вроде этого:
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());
}
Вы можете пройти через публичный интерфейс 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();
Я понял! Мне просто нужно добавить $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();
});
}
}