kohanaのエラーメッセージは素晴らしい!・・・PHPのスコープ定義演算子を使ってみる
PHP のコードを読んでいると Model_Test2::getData2() みたいにクラス名とメソッド名を (::) で連結した記述を見かけます。これって何なんだ?と調べようとすると結構大変です。PHP :: なんて書いてネットで検索しても見付からないし、PHP のマニュアルを :: で検索しても話にならないし・・・。
で、何かの拍子に偶然見つけました。「スコープ定義演算子」と言うみたいですね。クラスのメソッドに直接アクセスできるようで、便利な感じです。今回は kohana のテスト2のサンプルコードでスコープ定義演算子の実験をしてみます。
・昨日の日記の application/classes/controller/test2 を次のように書き換えてみます。
// $dat = new Model_Test2; // $result = $dat->Getdata2();
$result = Model_Test2::getData2();
すると、kohana から次のようなエラーメッセージが返ってきます。
ErrorException [ Strict ]: Non-static method Model_Test2::getData2() should not be called statically, assuming $this from incompatible context
APPPATH\classes\controller\test2.php [ 10 ]
10 $result = Model_Test2::getData2();
分かりやすいでね。メソッド getData2() が static ではないと文句を言っています。
・そこで application/classes/model/test2 を次のように書き換えます。
public static function getData2() {
すると正常動作してくれます。
この状態で、application/classes/controller/test2 を次のように元に戻すとどうなるでしょうか。
$dat = new Model_Test2; $result = $dat->Getdata2();
// $result = Model_Test2::getData2();
正常動作します。
次にメソッド getData() の方を試験します。
・application/classes/controller/test2 を次のように書き換えてみます。
// $dat = new Model_Test2; // $result = $dat->Getdata();
$result = Model_Test2::getData();
やはり「Non-static method Model_Test2::getData()」と文句を言われます。
そこで getData() の方も static 属性を追加してみます。すると、何と正常動作しません。kohana から次のように文句を言われます。
ErrorException [ Fatal Error ]: Using $this when not in object context
APPPATH\classes\model\test2.php [ 13 ]13 $result = $this->_db->query(Database::SELECT, $sql, true);
何で? 「オブジェクトのコンテキストじゃない所で $this を使っている」と文句を言われているようですが、初心者にはよく分かりません。
まあ初心者としては、コードを適当にいじくってエラーを発生させては何で?と考えて、勉強していきたいと思います。