[英]php call foreign function as internal method
我想在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的內部函數。 我可以通過更改班級內容來糾正該錯誤嗎?
您需要使用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);
您可以將類的實例傳遞給回調:
<?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";
}
});
像JavaScript中那樣,無法將閉包“綁定”到特定對象。 因此,不能在類外部使用$this
關鍵字。 但是,由於$events
是$this
將引用的實例,因此您可以執行以下操作:
$events->auth($user, $pass, function($status){
if($status){
$events->login();
}else{
echo "Fail";
}
});
編輯:顯然我錯了, 有一種方法可以將閉包綁定到特定實例。 參見保羅的答案。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.