NetBeansサイド
FuelBeans 24 : 徹底的にコンプリーション
このチュートリアルではありませんが、この数日、NetBeansでFuelPHPのコード補完を便利にしようと頑張っております。
普通のエディータではなく、IDEを利用する価値の一つは、コードコンプリート、コンプリーション、日本語でコード補完があります。
IDEがエディターで入力してる、その文脈で何を入力しようとしているのかを予測して、候補を示してくれるものです。まあ、日本語入力の予測変換と似たものがあります。
うる覚えの構文や、クラス名、関数、定数、変数名などを、ただ示すだけでなく、その文脈、つまり文法上で必要とされている候補を選んでくれるのです。
FuelPHPはコアクラス、つまり本体部分のコードを\Fuel\Coreという名前空間に閉じ込めています。その中のクラスを利用しようとすると、本来は\Fuel\Core\クラス名と記述するのですが、それは長いので、クラスをオートロードした際に、クラス名を一番上の名前空間、つまり\クラス名という別名を付けてくれます。これは、use Fuel\Core\クラス名; と書いた時と同じですね。
オートロードと別名の仕組みのお陰で、FuelPHPでは、クラスを利用したいときに、前準備もいらず、ただクラス名を記述すれば、あとはFuelPHPが面倒を見てくれます。
これは大変便利なのですが、一方でIDEに備わっているコード補完を働かさせなくしてしまいます。IDEの立場としては、名前空間中のクラスはuse文を使うか、名前空間で修飾されることを期待しています。ところが、FuelPHPの仕組みは、どちらも省略できますから、IDEは例えばViewがFuel\Core\Viewクラスであるとは認識できず、そのため関数名や定数、プロパティ(クラス変数)を、コード補完の候補として見つけられません。
FuelPHP、コード補完用コード生成コードに書きました。この中のFuelPHPのタスクをコマンドラインで実行するか、もしくは、最後にあるコードをわかり易い名前(保管時に表示されます。おすすめは大文字CCC.phpです)で、プロジェクトのソースコード下に作成してください。
NetBeans、もしくはPhpStormは自動的に、このファイルを読み込んで、短い名前を名前空間で修飾された長い名前に結びつけてくれます。(多分、完全ではないですが、ほぼ全部をサポートしています。)
このコードを置く前は、あるクラスを呼び出しても、関数名は補完されませんでした。例えば:
View::ここまでタイプしても、何も起きない
ホード補完のコードを作成した後は、View::とタイプすれば、その後に静的関数の候補名(設定によっては動的関数も表示される)がポップアップされるようになります。
ここで一回、補完のオプションを調整しましょう。
ツール→オプション→エディター→コード補完です。
言語は初めは、すべての言語にしましょう。
補完ウィンドウを自動ポップアップは通常チェックを入れましょう。チェックを外した場合、自動で候補が示されなくなります。チェックを外した場合、補完してもらいたい場所でコントロール+スペースを押すことで、補完リストが表示されるようになります。タイプが速い方、もしくは補完がうざったい、コードテンプレートをメインで利用したい方は、チェックを外すのも良い手です。
ドキュメントウィンドウを自動ポップアップは、そのクラスや関数などに、ドキュメントが存在する場合、もしくはPHPDocなどの記述に従い、コメントが入れてある場合、その内容を表示します。ただ、これも通常コメントは英語で入っているため、読まない人には無用の機能です。ならば、チェックを外しましょう。
候補の横にドキュメントを表示は表示されるドキュメントウィンドウを横、実際は候補のウィンドウの上もしくは下に表示する機能です。私の環境の場合、うまく働いていないようです。
大小文字を区別したコード補完はお好みでどうぞ。候補は絞られたほうが良い人はチェックを入れて、大文字小文字を意識してタイプしましょう。
コード補完に非推奨メンバーを表示はつけておきましょう。候補は出ないより、出すぎたほうが良いです。ただ、PHPの補完に関しては、余り関係ないようでもあります。
閉じ括弧を自動的に挿入は当然つけておきましょう。自動的に挿入され、そのまま続けて閉じカットをタイプしても、二重に入力されることはありません。
提案が1つだけの時は自動的に挿入は外しておきましょう。自動的に挿入されると、たいていはいらぬおせっかいになります。
ここで言語をPHPに切り替えてください。
補完ウィンドウの自動…は上をチェック、下は外しておきます。
クラスメソッド(または関数)のコード補完は、デフォルトでは上はチェック付き、下はチェックなしだったと思います。クラスのインスタンスから、静的関数は呼び出せます。(プロパティ、つまり静的クラス変数は呼び出せません。)逆に、非静的関数は静的に呼び出せません。
スマートパラメーター事前入力を使用はお好みでどうぞ。これは関数などの引数を、前後の文脈を読み取って、可能な場合は、自動的にセットしてくれるものです。例えば、$a=20;の次の行にvar_dump()を補完を利用して入力すると、var_dump($a)と自動的に引数がセットされます。
変数のコード補完はすべての変数を選びましょう。すべての変数を選択しても、闇雲に候補が表示されるのではなく、そのスコープで有効な変数のみが候補になります。
コード補完の種類は慣れるまで限定無しが使いやすいかと思います。これはクラスを補完候補から選択した際に、そのクラスの右側に表示されている名前空間を自動的に補うかどうかを決めるものです。
限定無しはこの名前空間による修飾を一切付けない設定です。FuelPHPの場合、先程から説明していますとおり、名前空間のトップレベルでクラスの別名を定義するため、必要有りません。
完全修飾はトップレベルから全部修飾名をつける補間方法、スマートはその編集している部分の名前空間を意識して、修飾してくれる方法です。
多分一番良い方法は、スマートに設定し、補完の候補リストからクラス名を選択する際、コード補完コードファイル名(CCC.php)が右側に表示されているクラス名を選択することです。例えば、名前空間がない箇所でViewクラスの入力補完する場合、コード補完ファイルのViewはView、Fuel\CoreクラスのViewですと、\Fuel\Core\Viewに展開、ParserクラスのViewでしたら\Parser\Viewと展開されます。
トップレベル以外の名前空間内で同様に補完する場合、補完ファイルのViewを選択すると、きちんと\Viewと展開されます。
クラスの実体は変数で表しますが、それも補完が聞いてくれると嬉しいですね。今まで説明したコード補完の方法では、FuelPHPクラス関数に含まれるforge()で作成したインスタンスは補完されません。
FuelPHPなどフレームワークを使用しない場合、インスタンスはnewで作成します。例えば、 $view = new View();となります。この構文で作成するのでしたら、IDEは$viewがViewクラスのインスタンスであると、解釈しますので、$view->とタイプすれば、Viewクラスの非静的関数が補完されます。
ところが、FuelPHPを始め、多くのフレームワークでは、生成するためのメソッド(関数)を用意し、クラスの生成にはそれを利用します。そうした生成のためのメソッドはフレームワークや設計をする人により、名前や方法が異なっていますので、IDEはそこまで面倒見きれません。
そのため、$viewがViewクラスのインスタンスであると理解できず、その結果補完されないことになります。
生成されるクラスのインスタンス名が予め決まっているCodeIgniterなどでしたら、予め関数名とクラスを結びつけておくことで、補完が可能です。FuelPHPの場合、フレームワークを使わない生のPHPと同様に、インスタンスを受ける名前はユーザーが決めますので、予め決めておくわけに行きません。
しかし、コードを書くあなたなら、変数とクラスを結びつけることは出来ます。/* @var 変数名 変数の型 :*/を利用するとIDEにその変数の型を、教えて上げることができます。例えばこのように使用します。
/* @var $view \Fuel\Core\View */
$view = View::forge();
$view->補完されます
問題はいちいちこれを記述するのが面倒な事です。そこで、NetBeansのコードテンプレートに手を加えましょう。
NetBeansのコードテンプレートはただのスニペット挿入プログラムではありません。もうちょっと、かしこいのでしたね。復習になります。新しい手法も利用しますよ。
まず、デフォルトで登録されている短縮名vdocを御覧ください。言語は当然PHPです。
/* @var $$${VARIABLE variableFromNextAssignmentName default="variable"} ${VAR_TYPE variableFromNextAssignmentType default="ClassName"} */
では、説明です。コードテンプレートの中で$はプレースホルダーつまり、何かの文字と入れ替わる部分を表す予約語になっていました。これはPHPの変数と一緒です。PHPの変数名を表すときに困ってしまうため、$文字を表したい場合は$$と二回続けて指定します。3つ目はプレースホルダーの目印ですね。
VARIABLE がプレースホルダー名になります。variableFromNextAssignmentNameは短縮名のある場所以降にある変数名を探せという指示です。見つからない場合や解決できない場合、defaultの値=variableになります。つまり全体で、コードを展開する場所以降の一番手近な変数名に置き換えるということです。
続いてVAR_TYPEがプレースホルダー名、variableFromNextAssignmentTypeは、これ以降の一番手近な変数を見つけ、その型と置き換えろです。defaultは見つからない場合の値です。forge()で生成したインスタンスは、IDEが型を見つけられませんので、たいてい見つからず、ClassNameに置き換わります。
では、どう使用するかですが、こんなコードを書いたとします。
$val = Validation::forge();
この行の前に、空行を作り、vdocとタイプし、続いてタブを押します。すると次のように展開されます。
/* @var $val ClassName */
$val = Validation::forge();
$valが置き換え可能状態ですが、変数名は自動的に入力されていますので、タブを叩き、ClassNameにあわせ、Validationと入力してEnterキーを叩きます。これで、IDEに$valがValidationクラスのインスタンスであると教えることが出来ました。
$val->ここで補完が利きますadd('field','Field Name')->ここでも補完が利きますadd_rule('required')....
こんなふうに補完が効くようになります。
私のコードテンプレートをインストールされている方なら、validという短縮名があります。このバリデーションのチュートリアルでも使用しました
展開されるコードに含まれている変数は$valです。これは、ドキュメントから取りましたが、大抵の人はいつも$valを使用するでしょう。ですから、このコードテンプレートに@varのコメントを予め書き込んでおくという手もあります。
また、後はビューなどを使用することが多い方は、@varとそれに続く$view=View::forge(${ビュー名});をコードテンプレートとして、登録しておくのも良い手です。
もしくは変数名とクラス名は少なくともタイプするのですから、varclassという短縮名で、/* @var $$${変数名} ${クラス名} */ $$${変数名} = ${クラス名}::forge();というコードテンプレートを作成するのもありですね。変数名とクラス名は一度タイプすれば、後ろの同じ名前は一緒に置き換わります。
やり方は様々です。ご自身にあった方法で活用ください。
| FuelBeans 19 : 整形。わっ私、やってませんから< 前 | 次 >FuelBeans 25 : もっとコード補完を |
|---|
| < 前 | 次 > |
|---|