質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

Laravel 4

Laravel 4 とはTaylor Otwellによって開発された、オープンソースなPHPwebアプリケーション開発フレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

PhpStorm

PhpStormは、JetBrains社が提供しているPHP向けのIDEです。同社の製品であるWebStormの機能を内包しており、優秀なコード補完やコード分析など多彩な機能を備えています。

Q&A

解決済

1回答

3573閲覧

LavaralでModelクラスの継承クラスにcreateメソッドが無いとIDEで警告が出る

退会済みユーザー

退会済みユーザー

総合スコア0

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

Laravel 4

Laravel 4 とはTaylor Otwellによって開発された、オープンソースなPHPwebアプリケーション開発フレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

PhpStorm

PhpStormは、JetBrains社が提供しているPHP向けのIDEです。同社の製品であるWebStormの機能を内包しており、優秀なコード補完やコード分析など多彩な機能を備えています。

0グッド

0クリップ

投稿2017/05/06 04:08

編集2017/05/06 04:37

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

http://stackoverflow.com/questions/29004347/phpstorm-9-eap-method-unique-not-found-in-class-illuminate-support-fluent

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shiroyuki

2017/05/06 04:35

AgenciesTableSeederのuseの部分を追記していただいてもよろしいでしょうか?
退会済みユーザー

退会済みユーザー

2017/05/06 04:37

ありがとうございます。追記いたしました!!
shiroyuki

2017/05/06 05:03 編集

一見問題なさそうに見えますが・・・seederの実行時にエラーが出るわけではなくIDEが正しく認識できずに警告がでているということでしょうか?
退会済みユーザー

退会済みユーザー

2017/05/06 05:33

はい、その通りです。マジックメソッドが親クラスで使われているので、IDEがcreateメソッドを認識出来ないようです。それは質問時に記述済なのですが、質問はなぜ、Agency::create()を実行すると、データベーステーブルに引数に渡した連想配列のデータが登録されるのかという処理の流れに関してです。
退会済みユーザー

退会済みユーザー

2017/05/06 05:34

実行自体は問題なく出来ております。
guest

回答1

0

ベストアンサー

解決しました。

マジックメソッド内の(new static)の部分は、呼び出し元クラスのインスタンスを生成しているのですね!

納得いきました!

投稿2017/05/06 05:53

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/05/06 06:04

Agency::createメソッドが実行されると、存在しないメソッドということで、内部で先に__callStatic()が呼ばれて呼び出し元クラスのインスタンスが生成され、それに対してcreateメソッドが再度実行されて、今度は__call()が呼ばれて、後の諸々の処理が続くという流れのようですね!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問