ここ四日ほど止まっている原因、laravel入門のEloquentのグローバルスコープのところで、Personクラスのbootメソッド内に
static::addGlobalScope(){};
を記述する指示があり、この「static::」が何なのか。を考えていた。
PHPを愛する試み 〜self:: parent:: static:: および遅延静的束縛〜
おそらくだが、↑のstatic::部分の最初のサンプルコードの
C <———->Model
CC <———>Person
の対応関係で例えられるような気がする。↑の画像の通り。
ということで、入門本(p243)にある通り、Person.phpのbootメソッド中に
static::addGlobalScope(なんたらかんたら);
と書くことで、グローバルスコープが設定できる、ということ。
Personクラスの__constructは用意していないので、Personクラス生成時にModelクラスの__constructが呼び出される。
間に別のメソッドが入るが大まかに言うと、呼び出された__constructの中で
static::boot();
が実行されるのだが、この「static::」が何を指すか?ここで遅延静的束縛が使われていると思われる。
ここがselfでなくstaticなのでPersonクラスのbootメソッドが呼び出されるので、p243で加えたaddGlobalScopeによりグローバルスコープが設定される、的なことだと思われる。
selfを使うとselfが書かれているクラス、つまりModelクラスのbootメソッドが実行される、つまり期待する動きと違う、と。
static・遅延静的束縛を使えば期待通りの動きになりますね、みたいなことだと思う。違ったらもうわからん、知りません。
多分bootの中ある
static::addGlobalScope(なんたら);
のstaticもやはりPersonクラスを指す(間にあるstatic::boot()などはすっ飛ばして、直近の非転送コールはPersonの__construct呼び出し)ので、p243で記述したコードによりグローバルスコープが設定される、ということかと思われる。
…