FuelPHPのクラスに対して関数名のコード補完がききません。NetBeansでもダメ、PhpStromでもダメ、多分他のIDEでも今のところはダメでしょう。
PHP5.3に導入された名前空間をもとにIDEは賢くコード補完をするようになっています。そのため、名前空間内のクラス内の関数は、それが特定できないと補完されないようになっています。
これは、PHPをそのまま利用したり、もしくはオートロードを使用しないフレームワークであれば、便利です。コード中にuse文を利用するか、名前空間でクラスが修飾された時だけ、特定されたクラスの関数をコード補完の候補として表示します。余計な関数が表示されません。
NetBeansですとJavaのimport文の挿入サポート機能のようなことを、PHPでもやろうよ、いいねえと一部で盛り上がっているようです。
ところが、PHPには名前空間より前にクラスのオートロード機能が取り込まれています。クラスが見つからない場合、エラーにしてしまうのではなくて、登録したオートローダーに「こうしたクラスあったら読み込んで」と依頼し、オートローダーは決められた規則に従ってクラスの入っているファイルを探し、ロードし、処理が続行される仕組みです。もちろん、オートローダーが見つけられなかったクラスは、エラーになります。オートローダーはユーザーが作成します。通常、フレームワークなどに含まれることになり、私たちはフレームワークに任せれば良いという事になります。
オートローダーと名前空間の付け方には直接的なルールはありません。つまり、オートローダーは何かの規則や、予め登録された内容に従い、ファイルを特定し、読み込みますが、その読み込んだファイルに中にどんな名前空間が指定されているかは、わかりません。
とはいえ名前空間が勝手に付けられては、ユーザーはどんな名前空間が使われているかコードを調べるしかありません。そうでなければ、空間中のクラスにアクセスすることもできません。それを避けるために、一定のネーミング規則が必要です。
だったら、名前空間がファイルの位置を表すように決めようと、PHPのフレームワークとかライブラリーを作っている、エライ人が一応の基準を作りました。
このルールは、大きなフレームワークでなら、整理されており、便利ですが、小さなフレームワークまでこのルールに従ったら、手軽さが無くなります。例えば、FuelPHPフレームワークに用意されているFormクラスにアクセスしたい場合、Form::とか書きたいか、それとも\fuel\core\classes\Form::と書きたいかですね。
実際、PHPのオートロードはオートロードを作成する人の考え方によって、色々なパターンが考えられます。ですから、IDE側でそれに合わせることは、無理でしょう。そのため、IDEのコード補完では、このようなオートロードされるクラスの補完は出来ません。(正確に言えば、名前空間を利用しない、関数がグローバルな名前空間に読み込まれるタイプのフレームワークであれば、オートロードであろうと、名前空間を使用していませんので、補完できるはずです。)
FuelPHPはユーザーの利便性を考え、独自のオートロードルールと名前空間の利用法を作成しています。
まず、コアのクラスは全部\fuel\coreの中に閉じ込められます。(パッケージは今のところ、パッケージ名が名前空間になっています。でも、これではユーザーの名前空間とバッティングすることが起きるでしょうから、本日フォーラムに、\fuel\package\パッケージ名のほうが良いのではないかと、意見を投げてみました。)
そして、あるクラスが使用され、存在していない場合、オートローダーに処理がわたり、それがコアクラスであれば、読み込んだあと、そのクラス名自体を名前空間を含めたクラスの別名として登録します。ですから、FuelPHPではViewクラスはView::だけで使用可能です。FormクラスはForm::だけで、オートロードされ、使用できるのです。もちろん、他のクラスも同様に、短い名前でロードされ、短い名前でクラスを使用出来ます。
こうした利便性のため、逆にIDEのエディターから、コードの補完ができません。もちろんuse \Fuel\Core\View;と記述し、IDEに対して、どの名前空間のクラスを利用するのか明らかにすればView::でViewクラスに含まれる静的関数が表示されます。しかし、これでは、利便性が失われてしまいます。
IDEのエディターで名前空間の考慮と無視を選べればいいのです。ですが、そんな機能は今のところありません。
どうしたものでしょうね。もし、これをうまく解決できる人がいらしたら、教えて下さい。
| Elefant CMS 1.1.1 日本語ファイル< 前 | 次 >NetBeans 7.1 PHPコード補完の怪 |
|---|
| < 前 | 次 > |
|---|