簡體   English   中英

php調用外部函數作為內部方法

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM