開発者の備忘

「起」と「結」しか書かないので詳細はご自分でお調べください

【PHP】"$this"->モデル名->find('all');"が理解できない問題

↓前回の続き
phen1208.hatenablog.com


"$this"は理解できたけど、以降の構文が理解できなかった。

$this->モデル名->find('all');


モデル名ってなんぞや。
findメソッドってどこに定義されてるんじゃ。

◆前提条件

まず、phpを勉強するにあたり、
モデル、ビュー、コントローラーの3つのクラスを作成した。
それぞれ、以下のクラス名(ファイル名)とする。

・PostsTable.php
・PostsController.php
・index.ctp


また、以下に各クラスの冒頭に記載されているコードを示す。
ビューについては今回は不要かつ知識不足のため省略する。

・PostsController.php

use Cake\ORM\Table;

class PostsTable extends Table {
   public function index() {
    $posts = $this->Posts->find('all');
  ...
 }
}

・PostsTable.php

class PostsController extends AppController {
...
}


問題となっている構文はコントローラーに記載されている。
つまり、モデルからデータを取得しようとしている構文である。

◆解説

まず引っかかったのは"find"メソッドの定義箇所。


$thisは自分自身のオブジェクトを指している。

ということは、
自分のクラス内のメソッドを呼び出しているんだ!

と思ったけど、継承元の「AppController」クラスにはそれらしきものはない。

さらに、「AppController」クラスの継承元の「Controller」クラスを見たけど、
"find"メソッドなんてものはない。

念のために「AppController」クラスで使用している「Event」クラスを見たけど、
同様に"find"メソッドが見つからない。


しかも、Javaではお世話になってるAPIリファレンスが
phpの場合はネットでいくら探しても出てこないというトラブルが。


じゃあどこに定義されてんのよ、
ていうと、モデルクラス。

前提条件のソースでいうところの
「PostsTable」クラス。
の、継承元の「Table」クラスに"find"メソッドが定義されている。


しかし、ここで疑問が。


僕が作ったモデルは"PostsTable"って名前。
"Posts"ではない。


さらに気づいた。
「AppController」ってCakePHPフレームワークのクラスであるということ、
CakePHPには命名規則が細かく指定されているということ。


要は、モデル名と言ってるのは「PostsTable」の「Posts」の部分。
こはちゃんと調べてないから言い切ることはできないけど、
たぶんあってるはず。
詳しくはCakePHPの公式サイトを参照。
そんな感じのことが書いてあった。



これが正しいのであれば、コントローラー名も「Posts」になると思われる。


◆結論

と、いうわけで、掲題の構文は

$this->:自分自身のオブジェクトの
Posts->:モデルクラス「Posts(PostsTableクラス)」に定義されている
find('all')::"find"メソッドに引数「all」を渡して呼び出している


ということとなる。