0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【laravel】スタティックメソッドでクラスを呼び出したのにコンストラクタを通ってる!!

Last updated at Posted at 2022-08-31

みなさんもこんな経験ないですか?
私はあります。

例えばこんな感じです

app/Model/

class UserMoel extends Model
{
  $table = 'user';

  $a = null;

  public __construct()
  {
    $this->a = 'かめはめ波';
  }

  public static function getUser($userId)
  {
    $user = self::query()->where('user_id', $userId)->first();
    dd($this->a);

    return $user;
   }

-----------------------------------

Http/Controller

class user extends Controller
{
  public function login()
  {
    $user = UserModel::getUser(2)
  }
}

//出力
かめはめ波

私のコンストラクタが通る認識としてはインスタンスを生成時、つまり
new UserModel
としたときでした。

今回はインスタンスを生成せずにスタティックメソッドを呼び出したにもかかわらず
コンストラクタを通ったのには理由があります。

UserModelのgetUserにある
query()の中でインスタンスを生成しているからです。

プログラムに慣れている人は当たり前に感じるかたもいらっしゃると思いますが
私にはずっと謎でした。

このqueryの中身を辿っていくとインスタンスを生成している箇所がわかります。

Modelのファイル内にてctl + fで
function queryと検索いただくと出てきます。
以下がインスタンスを生成している箇所になります。

public static function query()
{
  return (new static)->newQuery();
}

厳密に言えば違うと思うのですが
エンジニア1年目の私にはここまでの理解で限界でした。

もしlaravelのソースレベルで詳しくて優しい方がいらっしゃれば
ご教授いただけると幸いでございます!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?