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

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

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

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

PHP

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

Laravel 5

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

Q&A

解決済

2回答

448閲覧

collectionクラスのインスタンスが持つメソッドについて

toll_tree

総合スコア199

Laravel

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

PHP

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

Laravel 5

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

1グッド

0クリップ

投稿2019/05/24 06:57

laravelを学習中なのですが、下記のコードに関して、お聞きしたいことがあります。
以下は、テーブル「people」のモデルクラス「person.php」です。

<?php namespace App; use Illuminate\Database\Eloquent\Model; class Person extends Model { public function getData() { return $this->id . ':' . $this->name . '(' . $this->age . ')'; } }

以下は、Contorollerクラス「personController.php」です。

php

1<?php 2 3namespace App\Http\Controllers; 4use App\Person; 5use Illuminate\Http\Request; 6 7class PersonController extends Controller 8{ 9 public function index(Request $request) 10 { 11 $items = Person::all(); 12 // var_dump($items); 13 // exit(); 14 return view('person.index',['items' => $items]); 15 16 } 17} 18

以下はルート情報を記載した「web.php」です

php

1<?php 2 3/* 4|-------------------------------------------------------------------------- 5| Web Routes 6|-------------------------------------------------------------------------- 7| 8| Here is where you can register web routes for your application. These 9| routes are loaded by the RouteServiceProvider within a group which 10| contains the "web" middleware group. Now create something great! 11| 12*/ 13 14 15// Route::post('hello','HelloContoroller@post'); 16 17//use App\Http\Middleware\HelloMiddleware; 18 19Route::get('hello/add','HelloController@add'); 20Route::post('hello/add','HelloController@create'); 21 22Route::get('hello','HelloController@index'); 23 24Route::get('hello/edit','HelloController@edit'); 25Route::post('hello/edit','HelloController@update'); 26 27Route::get('hello/del','HelloController@del'); 28Route::post('hello/del','HelloController@remove'); 29Route::get('hello/show','HelloController@show'); 30Route::get('person','PersonController@index'); 31 32

以下は、ビューファイルのindex.blade.phpです

php

1@extends('layouts.helloapp') 2 3@section('title','Person.index') 4 5@section('menubar') 6 @parent 7 インデックスページ 8 9@endsection 10 11@section('content') 12 <table> 13 <tr><th>Data</th></tr> 14 @foreach ($items as $item) 15 16 <tr> 17 18 <td>{{$item->getData()}}</td> 19 </tr> 20 @endforeach 21 </table> 22@endsection 23 24@section('footer') 25copyright 2017 tuyano. 26@endsection

上記コードにおきまして、「http:localhost/person」にアクセスすると、index.blade.phpの「$item->getData()」こちらの部分が処理され、テーブルに設定されたフィールドの値が表示されます。ここで疑問点なのですが、コントローラの「personController.php」内のコードで、「 $items = Person::all();」ここの後に、「 var_dump($items);」とし、$itemsの中身をみてみたのですが、getDataメソッドは存在していませんでした。
何故、getDataメソッドをindex.blade.phpの{{$item->getData()}}ここの部分で呼ぶことができるのでしょうか?

bochan2👍を押しています

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

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

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

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

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

guest

回答2

0

getDataメソッドをindex.blade.phpの{{$item->getData()}}ここの部分で呼ぶことができるのでしょうか?

A:生成されたインスタンスがきちんと渡されているから


「 var_dump($items);」とし、$itemsの中身をみてみたのですが、getDataメソッドは存在していませんでした。

Laravel利用していてdd()やdump()を利用しないのはなぜか疑問ですが、
var_dump()が出力できるのは「変数に関するデータ」だけだからです。

PHPマニュアルそのまま抜粋:変数に関する情報をダンプする

php

1<?php 2class hoge{ 3 private $bb = ''; 4 public $aa = ''; 5 public function fuga(){ 6 7 8 } 9} 10 11var_dump(new hoge); 12/* 13object(hoge)#1 (2) { 14 ["bb":"hoge":private]=> 15 string(0) "" 16 ["aa"]=> 17 string(0) "" 18} 19*/

クラスが持つメソッドを確認したいのならまた別の機能

php

1<?php 2class hoge{ 3 private $bb = ''; 4 public $aa = ''; 5 public function fuga(){ 6 7 8 } 9} 10 11var_dump(get_class_methods(new hoge)); 12/* 13array(1) { 14 [0]=> 15 string(4) "fuga" 16} 17*/

PHPマニュアル確認してちゃんと検索すればわかる話なので、質問前に必ずPHPマニュアル確認してミニマムコードで検証してから質問してください。

クラスのメソッドなら「php クラス メソッド確認」とかでもヒットします。

今回の概念も含めて、クラスの基礎をきちんとおさえておかないと根本的な理解とは程遠くなるばかりになります。急がば回れと言います。

投稿2019/05/24 07:14

編集2019/05/25 02:13
m.ts10806

総合スコア80850

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

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

toll_tree

2019/05/24 07:28

personController.phpのvar_dumpした位置で、var_dump(get_class_methods($items));及び、dd($items)とし、確認したのですが、getDataメソッドは入っていませんでした
m.ts10806

2019/05/24 07:36

get_class_methods()の引数は「クラス名」(またはクラスの実体)です。 >パラメータ class_name オブジェクトのインスタンスのクラス名。 PHPマニュアルをきちんと読んでいたのなら間違った引数を入れることもないと思いますが。。。 $itemsはPerson::all()を実行した結果であってクラス名でもクラスの実体でもありません。 all()が何を返しているかはLaravelの本体コードを見ればわかりますよ。
m.ts10806

2019/05/24 07:38

「間違った引数を入れないために」と思って「クラスの基礎」のPHPマニュアルページを提示したのですが、無駄になりましたね。 急ぎすぎです。クラスの基礎を理解していなくてはまともに使いこなせるフレームワークではありません。
toll_tree

2019/05/24 07:41

クラスの基礎読んでおきます。
m.ts10806

2019/05/24 07:44 編集

Laravelの学習は完全にここでとめてくださいね。 質問を見たところクラス以外も必要なところが抜けているので 何も問題が出てないところにわざわざ問題があると思い込んで質問しているようなので、 自身にとっても時間の無駄になっていると思います。
toll_tree

2019/05/24 07:48

laravelは一通りはやっておこうかなとは思ってます。完全なる理解ではなくとも、一通り仕組みは知っておきたいので。
toll_tree

2019/05/24 07:49

一通りというのは、今学習している書籍を一通りやってみるといった意味ですね
m.ts10806

2019/05/24 08:03

フレームワークってクラスの基礎を一通りおさめた人が前提なので そもそもまだ手を付けるべきではないという話をしています。 特にLaravelはその中でも求められるレベルが高いのが一般的な認識です。 それに実際にLaravelでやっていっている人はお持ちの書籍の環境ではやらないので、 書籍から離れて、更にレベルの高いアドバイスが来て質問者さんがもっと混乱してしまうことになります。 おそらく同様のことを何名かに言われていると思いますが、「ここで引き返すのも勇気」です。 ここで強引に推し進めても自身の理解度がいまいちなままなので、Laravelにもクラスにも関係のない 基礎の基礎の基礎のところでつまずいている(または問題がないのに問題だと思っている)という指摘を受け続けることになります。 で、あれば、ここで本当に基礎に戻って、PHPマニュアルから基礎をきちんとおさえたほうが結果的に「早く」「確実に」理解できるようになります。 書籍を読まずともLaravelのマニュアルだけでも進んでいけるようになります。 マニュアルで不明な点はLaravelの本体コードから読み取って、適切に調査・検証を行って自分で解決できるようになってきます。 質問を作ってる時間がなくなるわけです。 むしろ、余裕ができて今のご自身のように悩んでいる初心者にアドバイスもできるようになるということになります。
m.ts10806

2019/05/25 01:04 編集

誰とは言わないですけど、わざわざ毎日きっちり私に低評価つける必要ないんじゃないですかね。同じ人でしょうけど。 好き嫌いじゃなく正しく評価を使って欲しいものです。 低評価するなら技術的な観点で回答をご指摘ください。 できないなら出ていってください。有益な情報が埋もれるだけなので邪魔です。 (当該質問者は丸投げしている自覚がないようなのでその質問が有益かどうかはまた別として)
toll_tree

2019/05/25 01:05

いっておきますが、僕ではないので。 推測で批判するのはやめてくださいね
m.ts10806

2019/05/25 01:09

「誰とは言わないですけど」と書いています。 まあそれなりに高評価がついていることもあるあなたの質問に対する回答とその直後の回答に連続で低評価がつくので、疑われても仕方はないですね。昨日の最後のコメントから半日放置されててそのあとのコメントですぐコメントされてますし。 ひとまず、文句を言うなら不当な低評価の使い方をしているその人に言ってください。 例えあなたではなくともあなたと同種の人であるのは間違いないです。
toll_tree

2019/05/25 01:38

疑うのは自由ですけどなんの確証もないのに、疑われても仕方がないと、相手にいうのはどうかと思いますけど。
m.ts10806

2019/05/25 01:45

疑われるような言動、タイミングは避けられたほうが良いです。気を付けてくださいね。という意味で捉えてください。まともな人が見たら真っ先に疑うのはあなたです。今回に限ったことではないので。 私は単に低評価の技術的な理由が知りたいだけなので、どの低評価であっても、ですけど、 低評価の理由、この質問、回答に関係のないことをコメントされるのでしたらやめてもらいたいですし、(本人的には)解決している質問者が出てくるのはいささか変ですね。
toll_tree

2019/05/25 02:03

まともな人というか、あなたとはなんどもコメント欄で言い合ってるのでそれを見ていた人からすると、私怨で入れているだろうと、思うかもしれません。 「疑われても仕方がない」というのは暗にお前がやっただろうと言われてる気持ちになります。 確証もないのに、書くべきことではないです。
m.ts10806

2019/05/25 02:11

ごく一部に勘違いされている方がいるので補足しますと、別に低評価をつけた人を炙り出して説教しようとかそういうつもりはさらさらありません。 teratailはプログラミングに関する質問サイトなので、それから大きく外れるようなことはなるべく避けるべきと思っています。 もちろん学ぶ姿勢とか何度も同じ指摘されているような場合はエンジニアとしての姿勢を批判されて指摘されても当然と思っています。 不当な低評価も同様ですね。回答に不備があるならそこをきちんと指摘して欲しいわけです。不備があるということは間違いがあったり不足があったりで今後同じ問題を抱えた誰かが見たときに誤った知識で認識する可能性があるわけですから、解決後であっても不備を改善する必要があります。 まともな回答であれば尚更です。 今回の回答で適正な低評価をできる人は少なくとも私よりPHPに精通している人であると判断できます。 そういう人は間違った情報を嫌うはずなので必ずきちんと指摘のコメントをしてくれます。 何度かそういうコメントをいただいて回答を修正したこともあります。 きちんとした指摘のコメントができない人=回答への評価ではない、と判断できます。 その低評価が今回の質問者の質問でほとんどつく、それだけではなく次の回答へ連続で疑いの目を避けるようにつけている。 もしtoll_treeさんの仕業でないのでしたらtoll_treeさんを貶めようとしている悪い人なので、ぜひその人を探しだしてその人に苦情をつけてください。運営に確認しても良いですよ。なんせ疑いの目を向けられてるわけですから。(私はこの回答をした者としてさまざまな状況証拠から低評価したであろう候補の一人としては認識してます。それは悪いですが変えようがないです。犯人は現場に戻ってくるという言葉もありますね) まあ、toll_treeさんとしては解決したのですからこの質問は既に無用でしょう。それとも疑いを深めてもらいたいのですか? それとも、この回答に対して技術的な観点で指摘がありますか? ないのでしたらこの回答への関与も無用でしょう。私のアドバイスを無益と判断されたからスルーされたわけでしょうし。 あとは私とその低評価を実際にした人との問題なので、どうぞ次へいってください。
m.ts10806

2019/05/25 02:37

>そういう人は間違った情報を嫌うはずなので どういう人かというと好まれない実装を紹介している書籍を「その本の名前を教えて。使わないように広めないと」「今すぐ捨ててください」と言える人。 初心者に誤った認識をされて広められるとできないエンジニアが溢れて言語やフレームワークが死んでしまうと判断できるくらいの人のこと。 Laravel界隈の回答者でも何名か心当たりがあります。 今回、回答されてないのはLaravelの機能の話ではないからでしょうけどね(質問内容自体にも問題がないわけではないけどそこは既に質問者に指摘してあるので割愛)
guest

0

ベストアンサー

インスタンスがどのメソッドを呼べるかは、そのインスタンスのクラスによるので、
get_class等でクラス名を見つけて、それを手がかりにLaravelのソースコードを追いかけてみてください。

$items = Person::all(); dd(get_class($item[0]));

PHP マニュアル get_class

投稿2019/05/24 08:06

aro10

総合スコア4106

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

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

toll_tree

2019/05/24 08:55

そうですよね... 何のクラスに属しているか分かったら、そのクラスのメソッドを調べれば良いですもんね... 一つお聞きしたい部分があるのですが、「dd(get_class($item[0]));」こちらの結果は、「"App\Person"」となるのですが、「dd(get_class($item));」このようにした場合、「"Illuminate\Database\Eloquent\Collection"」とでるのですが、これはどういうことなのでしょうか....?
toll_tree

2019/05/24 09:00

$itemはcollectionクラスのインスタンスと認識しているのですが、配列になっているということでしょうか...? 知識不足で、うまく伝わっていなかったら申し訳ないです...
aro10

2019/05/24 09:46

$itemsがコレクションクラス(配列ではないが、ArrayAccessとIteratorAggregateインターフェイスを実装しているので配列のように扱えるクラス)です。 $itemはその中の一つ一つの要素です。ここでは、Personクラスですね。
aro10

2019/05/24 09:57

Laravelが何故配列でなくコレクションクラスを使っているかは、以下ドキュメントのように様々なコレクション処理メソッドがあるからです。 https://readouble.com/laravel/5.8/ja/collections.html これにより、配列操作が楽になります。
toll_tree

2019/05/24 13:49

>配列のように扱えるクラス そのようなものがあるのですね... 勉強になりました。 「ArrayAccessとIteratorAggregateインターフェイス」こちらに関しては、初めて聞きましたので、調べてみたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問