dari88's diary

これから趣味にするプログラミング/PHP/javascript/kohana/CMS/web design/

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 を使っている」と文句を言われているようですが、初心者にはよく分かりません。

まあ初心者としては、コードを適当にいじくってエラーを発生させては何で?と考えて、勉強していきたいと思います。