PHPStormというIDEを使っているのですが、LaravelのModelクラスを継承したクラスでcreateメソッドを使おうとすると、IDEでそんなメソッドはないという警告が表示されてしまいます。(Laravelのide-helperは導入済みです。)
警告の消し方自体はstackoverflowの記事(本ページ下部のリンク先を参照)を見て分かったのですが、処理の流れというか仕組みがいまいち理解出来ておりません!
AgenciesTableSeederクラス
<?php use Illuminate\Database\Seeder; use Illuminate\Database\Eloquent\Model; use App\Agency; use Carbon\Carbon; use Faker\Factory as Faker; class AgenciesTableSeeder extends Seeder { public function run() { DB::table("agencies")->delete(); $faker = Faker::create('ja_JP'); for ($i = 0; $i < 10; $i++) { Agency::create([ //createが無いって警告が出ます!!!!! 'agency_name' => $faker->name() ]); } } }
Agencyクラス
<?php namespace App; use Illuminate\Database\Eloquent\Model; class Agency extends Model { public $table = "agencies"; }
Agencyクラスには確かにcreateメソッドがないのですが、親クラスのModelクラスにcreateメソッドがあるのかなと思って、親クラスを見てみました。
↓
↓
↓
Modelクラス
public function __call($method, $parameters) { if (in_array($method, ['increment', 'decrement'])) { return $this->$method(...$parameters); } return $this->newQuery()->$method(...$parameters); } /** * Handle dynamic static method calls into the method. * * @param string $method * @param array $parameters * @return mixed */ public static function __callStatic($method, $parameters) { return (new static)->$method(...$parameters); }
Modelクラスにもcreateメソッドはないようで、たぶん、この辺のマジックメソッドで対応されているのかなと思いました。
ただ、「Agency::create()」メソッドって静的メソッドなので、__callStatic($method, $parameters)の方が呼ばれることになるのですよね??
どうして、この__callStatic()が呼ばれることで、agenciesテーブルにAgency::create()を実行して、引数に渡した
連想配列が登録されるのでしょうか?
__call($method, $parameters)の方が実行されるのでしたら、「return $this->newQuery()->$method(...$parameters);」とあるように、中でクエリを生成して実行っていう処理をされてるっぽいので納得はいくのですが!!
PHPは数日前に触り始めたばかりで知識が疎くて恐縮なのですが、ご教授よろしくお願いいたします。
#参考(Stackoverflow - 英語)
http://stackoverflow.com/questions/15634021/how-to-document-magic-call-and-callstatic-methods-for-ides




回答1件
あなたの回答
tips
プレビュー