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

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

ただいまの
回答率

87.79%

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

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 1,546

score 35

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

namespace App\Http\Controllers;
use App\Person;
use Illuminate\Http\Request;

class PersonController extends Controller
{
    public function index(Request $request)
    {
        $items = Person::all();
        // var_dump($items);
        // exit();
        return view('person.index',['items' => $items]);

    }
}


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

<?php

/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/


// Route::post('hello','HelloContoroller@post');

//use App\Http\Middleware\HelloMiddleware;

Route::get('hello/add','HelloController@add');
Route::post('hello/add','HelloController@create');

Route::get('hello','HelloController@index');

Route::get('hello/edit','HelloController@edit');
Route::post('hello/edit','HelloController@update');

Route::get('hello/del','HelloController@del');
Route::post('hello/del','HelloController@remove');
Route::get('hello/show','HelloController@show');
Route::get('person','PersonController@index');


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

@extends('layouts.helloapp')

@section('title','Person.index')

@section('menubar')
  @parent
  インデックスページ

@endsection

@section('content')
  <table>
    <tr><th>Data</th></tr>
    @foreach ($items as $item)

      <tr>

        <td>{{$item->getData()}}</td>
      </tr>
    @endforeach
  </table>
@endsection

@section('footer')
copyright 2017 tuyano.
@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()}}ここの部分で呼ぶことができるのでしょうか?

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

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

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

PHP マニュアル get_class

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/05/24 18:46

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

    キャンセル

  • 2019/05/24 18:57

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

    キャンセル

  • 2019/05/24 22:49

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

    キャンセル

+1

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

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


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

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

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

<?php
class hoge{
    private $bb = '';
    public $aa = '';
    public function fuga(){


    }
}

var_dump(new hoge);
/*
object(hoge)#1 (2) {
  ["bb":"hoge":private]=>
  string(0) ""
  ["aa"]=>
  string(0) ""
}
*/

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

<?php
class hoge{
    private $bb = '';
    public $aa = '';
    public function fuga(){


    }
}

var_dump(get_class_methods(new hoge));
/*
array(1) {
  [0]=>
  string(4) "fuga"
}
*/

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

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/05/25 11:03

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

    キャンセル

  • 2019/05/25 11:11

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

    まあ、toll_treeさんとしては解決したのですからこの質問は既に無用でしょう。それとも疑いを深めてもらいたいのですか?
    それとも、この回答に対して技術的な観点で指摘がありますか?
    ないのでしたらこの回答への関与も無用でしょう。私のアドバイスを無益と判断されたからスルーされたわけでしょうし。
    あとは私とその低評価を実際にした人との問題なので、どうぞ次へいってください。

    キャンセル

  • 2019/05/25 11:37

    >そういう人は間違った情報を嫌うはずなので

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

    キャンセル

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

  • ただいまの回答率 87.79%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る