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

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

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

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

Laravel 5

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

Q&A

解決済

3回答

545閲覧

laravel のソースコード歩き

kazoogon

総合スコア281

PHP

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

Laravel 5

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

0グッド

1クリップ

投稿2018/02/03 14:19

編集2018/02/03 14:21

ただ今laravel5.5を使用し勉強中なのですが、その中で用意されているhelper関数などの中身がどうなっているのかも興味があったので見ていました。
まだまだこのぐらいのソースコードをすらすら読めるレベルでないので、自分なりに日本語でコメントをつけてみました。そこで皆様には
①この考え方(コメントの書き方)では間違っている、またはこう考えてコメントにこう書いたほうが良い
②関数をずっと追っていくとキリがないのですが、皆さんはどこをどのくらいまで読んで「あ~こういうこと中でやってるのね」と理解するのか
をお尋ねしたいです。今回はold関数を例にしてみました。よろしくお願いいたします。

src/illuminate/Foundation/Validation/helper.php function old($key = null, $default = null)//フォームのkey名(emailなど)を受け取る { return app('request')->old($key, $default); //app関数実行される } //上記のapp関数の中身 if (! function_exists('app')) { //app関数が定義されているか確認 /** * Get the available container instance. * * @param string $make * @param array $parameters * @return mixed|\Illuminate\Foundation\Application */ function app($make = null, $parameters = []) { if (is_null($make)) { //$makeはここではformで送られた情報 return Container::getInstance(); } return Container::getInstance()->make($make, $parameters);//getInstance関数,make関数実行される } } public static function getInstance() { if (is_null(static::$instance)) { //static関数の$instanceが存在していなければ? static::$instance = new static; //staticをinstance化 } return static::$instance;//static関数の$instance実行?? } (以下はilluminate/Container/Container.php) public function make($abstract, array $parameters = []) { return $this->resolve($abstract, $parameters);//resolve関数実行 } //正直ここらへんから「これおっていくとキリないな。。。」と思い始める。。。 protected function resolve($abstract, $parameters = []) { $abstract = $this->getAlias($abstract); $needsContextualBuild = ! empty($parameters) || ! is_null( $this->getContextualConcrete($abstract) ); // If an instance of the type is currently being managed as a singleton we'll // just return an existing instance instead of instantiating new instances // so the developer can keep using the same objects instance every time. if (isset($this->instances[$abstract]) && ! $needsContextualBuild) { return $this->instances[$abstract]; } $this->with[] = $parameters; $concrete = $this->getConcrete($abstract); // We're ready to instantiate an instance of the concrete type registered for // the binding. This will instantiate the types, as well as resolve any of // its "nested" dependencies recursively until all have gotten resolved. if ($this->isBuildable($concrete, $abstract)) { $object = $this->build($concrete); } else { $object = $this->make($concrete); } // If we defined any extenders for this type, we'll need to spin through them // and apply them to the object being built. This allows for the extension // of services, such as changing configuration or decorating the object. foreach ($this->getExtenders($abstract) as $extender) { $object = $extender($object, $this); } // If the requested type is registered as a singleton we'll want to cache off // the instances in "memory" so we can return it later without creating an // entirely new instance of an object on each subsequent request for it. if ($this->isShared($abstract) && ! $needsContextualBuild) { $this->instances[$abstract] = $object; } $this->fireResolvingCallbacks($abstract, $object); // Before returning, we will also set the resolved flag to "true" and pop off // the parameter overrides for this build. After those two things are done // we will be ready to return back the fully constructed class instance. $this->resolved[$abstract] = true; array_pop($this->with); return $object; }

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

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

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

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

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

guest

回答3

0

Laravelの仕組みは、リフレクション等を多用している関係から単純にソースコードを追いかけても参照関係が辿りにくいかと思うので、Xdebug等のIDE上でコード確認と共にステップ実行できるツールと組み合わせて検証すると捗ります。

投稿2018/02/05 03:42

aro10

総合スコア4106

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

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

kazoogon

2018/02/05 13:25

なるほど、コードをただ読むだけではなく、ある現象に応じてdebug機能を使用しながら見ていく。この考え方参考になります、ありがとうございました。
guest

0

ベストアンサー

ライブラリ側のコードを深追いしていくことは**「オブジェクト指向」**に反しています。オブジェクト指向とは「中身を知らなくても外側に見えている使い方さえ知っていれば便利に使える」という理念のもと作られたものなので、中身を知ることは重要ではないのです。なので、dala00さんの言うとおり、「必要なところまで見る」というのが境目ですかね。バグが起きたときにトレースログを見れば「どういう階層で処理が呼び出されているか」は一目瞭然になるありがたい機能がありますので。正直このコードに書かれているものは、私にとっては「別に知らなくてもいいかな」と判断するくらいのものです。

もちろん勉強のためや興味があって「どういう仕組で動いているのかを知りたい」というあなたの行為はプログラマにとって非常に重要な素質なので大切になさってください。仕組みを知らずに使う者と、仕組みを知っていて使う者とでは、応用力が違います。

投稿2018/02/05 02:18

masaya_ohashi

総合スコア9206

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

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

kazoogon

2018/02/05 13:23

回答ありがとうございます。 上級の方でもライブラリの中身まではそこまで見ていない、ということが分かっただけでも収穫でございます、ありがたいです。  仕組みには興味はありますので、余裕があったら見て見ようぐらいの感じにしようと思います
guest

0

自分の場合、やっぱり見るのは不具合が起きた時とか、設定方法がわからない時(もしくは隠された設定方法があるか探す時)ですね。
なのでどこまで見るかというとそれらが判明するところまでです。

投稿2018/02/03 14:32

dala00

総合スコア441

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

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

kazoogon

2018/02/03 14:50

早速の回答ありがとうございます。 なるほど、、、まだ自分のほうでは不具合が起きて見てもたぶんよくわかんないですね、、、なんかlaravelのコードを読みたいというよりは、このぐらいのコードをすらすら読めるようになるのがmustですね。。 何か参考になりそうなURLがありそうなら教えていただきたいです。
dala00

2018/02/03 14:55

いやー、でも人の書いたコード読むのは結構大変ですよ。特に最近のフレームワークはすらすら読むのは難しいと思います。 大量にクラス化されていてあっちいったりこっちいったりしますし、そもそもデータがどこに格納されているのかいくら探しても見つからなかったり、便利な機能を実装するために特殊なクラス構成になっていたり、そもそもベースのクラスが別のリポジトリのものだったり、等。 必要に応じて読むのが良いんじゃないかなと思います。練習だったら小さいライブラリとかフレームワークとかの方が良い気がします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問