web-dev-qa-db-ja.com

PHPのクロージャーで$ thisを使用する方法

私はこのような機能を持っています:

class Service {
    function delete_user($username) {   
        ...
        $sessions = $this->config->sessions;
        $this->config->sessions = array_filter($sessions, function($session) use ($this){
            return $this->get_username($session->token) != $username;
        });
    }
}

use内で$thisを使用できないため、これは機能しません。コールバック内でServiceクラスのメンバーである関数を実行することは可能ですか?または、forまたはforeachループを使用する必要がありますか?

14
jcubic

$thisは、PHP 5.4以降、useする必要がないため、(非静的)クロージャーで常に使用できます。

class Service {
    function delete_user($username) {   
        ...
        $sessions = $this->config->sessions;
        $this->config->sessions = array_filter($sessions, function($session) {
            return $this->get_username($session->token) != $username;
        });
    }
}

参照 PHPマニュアル-匿名関数-$ thisの自動バインディング

21
ShiraNai7

あなたはそれを他のものにキャストすることができます:

$a = $this;
$this->config->sessions = array_filter($sessions, function($session) use ($a, $username){
   return $a->get_username($session->token) != $username;
});

また、$usernameを渡す必要があります。そうしないと、常にtrueになります。

0
sjdaws