【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」を渡して呼び出している
ということとなる。