PHP FrameworkにCodeIgniter3を採用したプロジェクトをPhpStorm(ver.9.0.2)で編集している。PhpStormのメソッド・プロパティ補完機能(autocomplete機能)はとても便利で、コード記述を強力にサポートしてくれる。また、定義にジャンプする機能もコードの実装を追うのにとても有益だ。
参考:PhpStorm 9.0.0 Help Basic Code Completion. Completing Names and Keywords

しかしCodeIgniterの機能を使ったソースコードは思うように補完機能が働かない。
CodeIgniterではModelやContorollerでクラスを利用する時にローダーを利用するが、$this->loadするとインスタンスは$this->xxxにセットされ、$this->xxx->funcのように利用する。このとき「$this->xxx」が何者なのかPhpStormは分からないのだろう。
autocomplete not working no suggestions

PhpStormでCodeIgniterのautocompleteを有効にする方法がないか調べてみた。

ClassのPHPDocコメントを追加する

幸いPhpStormはソースコード中のPHPDocコメントから変数の型を取得する機能がある。
ClassのPHPDocコメントに@property でメンバの型を追加すればよい。
以下の例ではPhpStormは $this->blog_model をClass Blog_model と認識してくれる。


/**
 * Class Welcome
 *
 * @property Blog_model $blog_model
 */
class Welcome extends CI_Controller {

    public function __construct()
    {
        parent::__construct();
        $this->load->model('blog_model');

    }

    public function index()
    {
        $this->blog_model->               // ココで補完ができる。
        $this->load->view('welcome_message');
    }
}

add phpdoc comment @property Blog_model $blog_model

参考:PhpStorm 9.0.0 Help/Creating PHP Documentation Comments

PHPDocを追加した後であれば、定義にジャンプ( Go To | Declaration )可能だ。COMMAND(CTRL)+Bが便利になる。
Navigating to Declaration or Type Declaration of a Symbol

局所的な変数にPHPDocコメントを付与する

次のような書き方でも補完することができた。局所的で良ければ、これもありかも知れない。


public function index()
    {
        /**
          * @var Blog_model $blog_model
         */
        $blog_model =& $this->blog_model;
        $blog_model->                      // ココで補完ができる。

        $this->load->view('welcome_message');
    }

$this->db の型

CodeIgniterでは$this->load->database(); で$this->dbがセットされるが、このdbの型は何だろう?
CodeIgniterのソースコードを追ってみたが、動的にCI_DBが宣言されていたりして分かりにくい。
なので飛び道具的だが、PhpStormのデバッグセッションでステップ実行し、CodeIgniterのSingletonの中身を見てみた。


    $ci =& get_instance();

db_class_debug_inspection


$ci = {Welcome} [15]
 *CI_Controller*instance = null
 benchmark    = {CI_Benchmark} [1]
 blog_model   = {Blog_model} [3]
 config       = {CI_Config} [3]
 db           = {CI_DB_mysqli_driver} [73]
 hooks        = {CI_Hooks} [4]
 input        = {CI_Input} [10]
 lang         = {CI_Lang} [2]
 load         = {CI_Loader} [10]
 log          = {CI_Log} [8]
 output       = {CI_Output} [10]
 router       = {CI_Router} [9]
 security     = {CI_Security} [9]
 uri          = {CI_URI} [6]
 utf8         = {CI_Utf8} [0]

すると、どうやら、$this->db は CI_DB_mysqli_driver のようだ。ただし、application/conf/database.php のdbdriverの設定に依存するだろう。
CI_DB_mysqli_driver の継承はこんな感じだ。


CI_DB_driver  
 CI_DB_query_builder 
  CI_DB 
   CI_DB_mysqli_driver

というわけで、これもPHPDocに追加。


/**
 * Class Blog_model
 *
 * @property CI_DB_mysqli_driver $db
 */
class Blog_model extends CI_Model {

    public $title;
    public $content;
    public $date;

    public function __construct()
    {
        // Call the CI_Model constructor
        parent::__construct();
        $this->load->database();
        
    }

    public function get_last_ten_entries()
    {
        $query = $this->db->        // ココで補完ができる。
        
    }

PhpStorm CodeIgniter3 $this->db  autocomplete

ちゃんと候補が表示された。

プロジェクト全体のcontroller、modelで有効にする

Controller、Modelに毎回PHPDocコメントを追加するのは手間である。
調べてみると、autocomplete.php を配置して全体に有効にする方法があった。

Stunt/Codeigniter-autocomplete
ここのconfig/autocomplete.php を自分のプロジェクトに入れると、プロジェクト全体のControllerやModelで$this->xxxが解決されている。
ただし、いくつか注意点が必要だ。

  • 自分で作成したModelやLibraryは@property Your_lib $your_lib に追記必要
  • CodeIngter3用に少し書き直しが必要。
    参考:Upgrading from 2.2.x to 3.0.x

    
    <?php
    // help IDE(s) support Codeigniter 2.0
    /**
    * @property CI_DB_active_record $db
    * @property CI_DB_mysqli_driver $db
    *     ・
    *     ・
    *     ・
    */
    

というわけで、使っているのはこちら。

追記 2015.10.26)もっとたくさん網羅しているのはこちらへ。
ah256/Codeigniter-autocomplete

追記 2015.10.26)dbがwhereなどを候補表示してくれない。CI_DB_mysqli_driverの派生関係を追加。


<?php

// help IDE(s) support Codeigniter 3.0

/**
 * @property CI_DB_mysqli_driver $db
 * @property CI_DB_forge         $dbforge
 * @property CI_Benchmark        $benchmark
 * @property CI_Calendar         $calendar
 * @property CI_Config           $config
 * @property CI_Controller       $controller
 * @property CI_Email            $email
 * @property CI_Encrypt          $encrypt
 * @property CI_Exceptions       $exceptions
 * @property CI_Ftp              $ftp
 * @property CI_Hooks            $hooks
 * @property CI_Image_lib        $image_lib
 * @property CI_Input            $input
 * @property CI_Lang             $lang
 * @property CI_Loader           $load
 * @property CI_Log              $log
 * @property CI_Model            $model
 * @property CI_Output           $output
 * @property CI_Pagination       $pagination
 * @property CI_Parser           $parser
 * @property CI_Profiler         $profiler
 * @property CI_Router           $router
 * @property CI_Session          $session
 * @property CI_Table            $table
 * @property CI_Typography       $typography
 * @property CI_Unit_test        $unit_test
 * @property CI_Upload           $upload
 * @property CI_URI              $uri
 * @property CI_User_agent       $user_agent
 * @property CI_Form_validation  $form_validation
 * @property CI_Zip              $zip
 *
 * @property Your_lib            $your_lib
 */
class CI_Controller{};
class MY_Controller extends CI_Controller{};
class CI_DB extends CI_DB_query_builder{};

/**
 * @property CI_DB_mysqli_driver $db
 * @property CI_DB_forge         $dbforge
 * @property CI_Config           $config
 * @property CI_Loader           $load
 * @property CI_Session          $session
 *
 * @property Your_lib            $your_lib
 */
class CI_Model{};

/* End of file autocomplete.php */
/* Location: ./application/config/autocomplete.php */

その他

PhpStormではコメント中の@property クラス名 $変数 のクラス名の部分でもクラス定義にジャンプ( Go To | Declaration )可能だった。
classjump

すべて完ぺきというわけではないけど、かなり便利になった!
未調査だが、PhpStorm以外のIDEでも有効な気がする。
Autocompleteを有効にする方法はほかにもあるようなので、そのうち調べてみたい。