我想在php中创建类似jquery的语法,我写了那个类:
class events{
public function auth($user, $pass, $callback){
$status = 0;
if($user and $pass){
$status = 1;
}
call_user_func($callback, $status);
}
public function login(){
echo "Welcome!";
}
}
$events = new events;
$user = "u";
$pass = "p";
这就是Jquery的语法:
/**
* Jquery type callback function
*/
$events->auth($user, $pass, function($status){
if($status){
$this->login();
}else{
echo "Fail";
}
});
一切都没关系,除了$ this变量我在外面使用了类方法,我不能使用回调函数作为内部函数将$ this用于该函数代码。 我可以通过改变班级中的某些内容来纠正错误吗?
答案 0 :(得分:4)
您需要使用Closure::bind
将匿名函数绑定到对象。
class events{
public function auth($user, $pass, $callback){
$status = 0;
if($user and $pass){
$status = 1;
}
call_user_func(Closure::bind($callback, $this), $status);
}
public function login(){
echo "Welcome!";
}
}
$events = new events;
$user = "u";
$pass = "p";
$events->auth($user, $pass, function($status){
if($status){
$this->login();
}else{
echo "Fail";
}
});
Welcome!
另请注意,没有必要使用call_user_func()
,如果您愿意,可以用以下内容替换该行:
$callback = $callback->bindTo($this);
$callback($status);
答案 1 :(得分:1)
您可以将类的实例传递给回调:
<?php
class events{
public function auth($user, $pass, $callback){
$status = 0;
if($user and $pass){
$status = 1;
}
$callback($status, $this);
}
public function login(){
echo "Welcome!";
}
}
$events = new events;
$user = "u";
$pass = "p";
/**
* Jquery type callback function
*/
$events->auth($user, $pass, function($status, $self){
if($status){
$self->login();
}else{
echo "Fail";
}
});
答案 2 :(得分:1)
没有办法&#34;绑定&#34;对JavaScript等特定对象的闭包。因此,$this
关键字不能在类之外使用。但是,由于$events
是$this
将引用的实例,因此您可以执行此操作:
$events->auth($user, $pass, function($status){
if($status){
$events->login();
}else{
echo "Fail";
}
});
编辑:显然我错了,there is a way将闭包绑定到特定实例。见保罗的回答。