何故CodeIgniterでは静的メソッドを使えないのか?

CodeIgniterの本家フォーラムで以下のような投稿がありました。

$this->input->post('username');

ではなく、以下のようにできないか?というものです。

Input::post('username');

CodeIgniterで静的メソッドを使う

それに対して以下のようなクラスを作ればできるという回答がありました(以下のInputクラスは私が少し変更したものですが、やってることは同じです)。

application/libraries/Input.php

<?php

class Input
{
    public static $instance = null;

    public static function get_instance()
    {
        if (self::$instance === null) {
            $CI =& get_instance();
            self::$instance = $CI->input;
        }

        return self::$instance;
    }

    public static function __callStatic($method, $params)
    {
        $obj = self::get_instance();
        return call_user_func_array(array($obj, $method), $params);
    }
}

これで、例えば以下のようにstaticにもコールできるようになりました。

<?php

require APPPATH . 'libraries/Input.php';

class Test extends CI_Controller
{
    public function instance()
    {
        // CodeIgniter流
        echo html_escape($this->input->get('username'));
    }

    public function static_call()
    {
        // staticおじさん風
        echo html_escape(Input::get('username'));
    }
}

なお、requireの部分は親クラスやフレームワークの初期に実行されるところに移動するなり、Composerでオートロードするなりすれば、いちいち記述しなくてよくなります。

まとめ

  • Proxyクラスを用意することで、CodeIgniterでも静的メソッドでのコーディングは可能になります。
  • それにどういう意味があるのかはわかりませんが。

もし、$this->input->post()よりもInput::post()の方がよい理由をご存じの方がいましたら、お教えください。

関連

Date: 2015/07/06

Tags: codeigniter