tohokuaikiのチラシの裏

技術的ネタとか。

VSCodeでLaravelを使っているとintelephenseが"Undefined method 'xxxxx'.(P1013)"のWarningを出して困っている

たとえばこんなコードで

<?php
        $sanctum_user = Auth::guard('sanctum')->user();
        if (in_array(HasApiTokens::class, class_uses($sanctum_user))){
            // @phpcs:ignore
            $sanctum_user->tokens()->delete();
        }

Undefined method 'tokens'.intelephense(P1013) とか出る。ChatGPTに聞いて // @phpcs:ignore とか入れたが勿論こんなのは屁のツッパリにもならない。

ググっても、WarningをOFFにするんだよとか「それ違うだろ。力技はいやなんだよ。」って回答しか目につかない。

力技との誹りは免れないが call_user_funcを使う

call_user_funcとはこんなんな。もはや古のPHPerしか知らない関数かもしれないが。

<?php
class Foo {
    function foo($param = [1,2,3]){
        var_dump($param); 
        return $this;
    }
    
    function bar() {
        echo "bar\n";
    }
}

$f = new Foo;
call_user_func([$f, 'foo'])->bar();

ということで、さっきのコードは

<?php
        $sanctum_user = Auth::guard('sanctum')->user();
        if (in_array(HasApiTokens::class, class_uses($sanctum_user))){
            // @phpcs:ignore
            call_user_func([$sanctum_user, 'tokens'])->delete();
        }

となる。これでWarningが出ない。むしろ可読性下がっとるやないか!!!との意見はその通りである!!