エンジニアのひよこ_level10

毎日更新してた人。たまに記事書きます。

【PHP】traitでオーバーライド元の関数を使いたいとき【712日目】

traitを拡張したい

Laravelの中にあるtraitを拡張したいとか、traitをさらに継承するように使いたい。

use Illuminate\Foundation\Auth\AuthenticatesUsers as BaseAuthenticatesUsers;

trait AuthenticatesUsers {
    use BaseAuthenticatesUsers
}

こんな感じ。

でも、オーバーライドすると、元のコードが呼び出せない。だって継承じゃないから。
traitは継承が出来ないので悩むところ。さてどうするか。

use Illuminate\Foundation\Auth\AuthenticatesUsers as BaseAuthenticatesUsers;

trait AuthenticatesUsers
{
    use BaseAuthenticatesUsers

    public function login() {
        // 任意の処理

        // 元コードのloginをbase_loginって名前に書き換えるとかして書きたい
        // return base_login();
    }

traitの任意関数に名前をつける

    use BaseAuthenticatesUsers {
        BaseAuthenticatesUsers::login as base_login;
    }

この様に、対象となる クラス名::関数名 as 置換後の関数名で、関数名を置き換えることが出来る

use Illuminate\Foundation\Auth\AuthenticatesUsers as BaseAuthenticatesUsers;

/**
 * Captchaに対応した認証クラス
 * Class AuthenticatesUsers
 * @package App\Libraries\Auth
 */
trait AuthenticatesUsers
{
    use BaseAuthenticatesUsers {
        BaseAuthenticatesUsers::login as base_login;
    }

    public function login() {
        // 任意の処理

        return base_login();
    }

これで、元のコードの関数を動かす前に、任意の処理を書くことが出来るようになった。

公式ドキュメント

https://www.php.net/manual/ja/language.oop5.traits.php