FuelPHPはこれはこれでいいのですが、IDEで使用していると、どうもいけません。
FuelPHPに慣れてしまった人が、軽いエディターを利用し、エディターに付いているスニペットの挿入機能を利用して、コードを書く。そんなシチュエーションであれば、使いやすいのでしょう。
NetBeansには通常のスニペットの挿入を強化した、コードテンプレートがあります。ありますが、コアに含まれているクラスと関数全部にたいして利用するのは、無理ですね。第一、覚えきれません。
そこで、コードの補完に頼ることになります。FuelPHPの前はkohana、その前はCodeIgniterをいじっていました。その二つを使っているときには感じられなかった、もどかさを感じます。クラス名以外は補完されません。
補完されないため、慣れないとバリバリコードを書くというのは無理で、いちいち「あの関数は何だったっけ?」とドキュメントに頼ることになります。そして、コードテンプレートに登録していきます。
フレームワークの導入は、そのフレームワーク自体を学習するコストもありますが、IDEとの相性が良ければ、そのコストはかなり下がります。相性が悪ければ、普段IDEの機能に頼っている分だけ、余計にかかるように思えます。
フレームワークが提供する関数、クラスに含まれる関数のコード補完という点に注目して、色々なフレームワークを触り直して見ました。
コアの部分はクラスとヘルパーとして提供されています。
ヘルパーは、関数の集まりですので、そのままで補完されます。
クラスはそのままでは補完されません。クラスが入っているファイルを明示的にincludeしているわけでありませんので、NetBeansにはどのクラスを使っているのかわからないのです。load関数で読み込むお約束になっています。
読み込まれたクラスはインスタンスが決まった名前のプロパティ(クラス変数)として、保持されます。それを利用してコメントの中に"@property CI_クラス名 $プロパティ変数"を全クラス分用意し、それを利用して、補完をさせるテクニックがあります。
つまり、ロードしたクラスは$this->class->関数()となります。@propertyはプロパティ、つまりクラス変数の型を定義するものです。@property CI_Table $tableですと、$this->の部分でプロパティもコード補完の候補になりますので、tableが補完されます。それを選び、$this->table->とすれば、tableはCI_Tableクラスであると、NetBeansは認識していますので、CI_Tableクラス中で定義されているクラス変数、クラス定数、関数を補完の候補として表示してくれます。
実際の設定方法については、Codeigniter+Netbeans7でコード補完をどうぞ。
CakePHPも同じ仕組で、コード補完を行う方法が、アチラコチラで紹介されています。
コアで提供される関数には名前空間が利用されていません。クラスで定義されている関数の多くが静的関数ですからClass::の時点で補完されます。
さわり直し、IDEとの相性の良さを、再発見しました。楽です。
現在のところ、クラス名は名前空間が利用されていません。しかし、その中でダイナミックに作成されるクラス変数などは、さすがに無理です。
しかし、さすがに利用者の多いフレームワークです。調べたら、一発で保管方法のドキュメントを公式ページに見つけられました。
タイトル通り、コード補完の具体的な設定方法だけでなく、NetBeansを利用する場合のヒントが数多く乗っています。実際に行なっていませんし、Yiiはまともに使用したことがないため、どの程度の補完が可能なのか、わかりません。(こうしたドキュメントが利用者を増やすという考えは、多くのフレームワーク提供側が気づいていない点です。)
フレームワーク自体、名前空間を利用していない5.2用と使用している5.3用に分かれています。
名前空間を使用していない5.2はズラズラと候補がてんこ盛りになります。うざったく感じない方なら、大好物でしょう。
名前空間を利用する5.3用では、use文を利用する、ある意味真っ当なコーディングスタイルです。use文を利用しますから、指定されたクラスのプロパティや関数は補完として表示されます。普通のコーディング手法ですので、IDEとの相性も良いです。
このNetteフレームワーク用のNetBeansプラグインも開発されています。導入して調べて見ましたが、独自のテンプレート記述言語Latteのコードハイライトと補完、新規ファイル作成時の支援(テンプレートを高度にしたもの)でした。
コアのクラスは\Fuel\Coreの名前空間に閉じ込められています。それならば、use Fuel/Core/Formとか書けばいいのでしょうが、開発側はそれはうざったい、ロードするときにFormで別名作っておくから、それを使えばいいよという考えです。
つまり、他のフレームワークのようにuse使用したり、ロードを明示的に指定する手間がいらないのです。Viewクラスが使用したければ、何の準備もいらず、いきなりView:fore()と記述できます。後はフレームワークが面倒を見てくれます。
しかし、IDEの立場から見ると、コード中に利用されるViewというクラス名と\Fuel\Core\Viewが結びついていると、判断できません。ですから、クラス名は補完されても、クラスの中で定義されている関数、定数、変数がコード補完の候補としてリストに上がって来ません。
やるとしたら、この手でしょうか。
(追記:もっと良い手があります。Eclips、NetBeans)
use Fuel\Core\Cache_Handler_Driver;
use Fuel\Core\Cache_Handler_Json;
use Fuel\Core\Cache_Handler_Serialized;
use Fuel\Core\Cache_Handler_String;
use Fuel\Core\Cache_Storage_Apc;
use Fuel\Core\Cache_Storage_Driver;
use Fuel\Core\Cache_Storage_File;
use Fuel\Core\Cache_Storage_Memcached;
use Fuel\Core\Cache_Storage_Redis;
use Fuel\Core\Config_File;
use Fuel\Core\Config_Ini;
use Fuel\Core\Config_Interface;
use Fuel\Core\Config_Json;
use Fuel\Core\Config_Php;
use Fuel\Core\Config_Yml;
use Fuel\Core\Controller_Rest;
use Fuel\Core\Controller_Template;
use Fuel\Core\Database_Mysqli_Connection;
use Fuel\Core\Database_Mysqli_Result;
use Fuel\Core\Database_Mysql_Connection;
use Fuel\Core\Database_Mysql_Result;
use Fuel\Core\Database_Pdo_Connection;
use Fuel\Core\Database_Query_Builder_Delete;
use Fuel\Core\Database_Query_Builder_Insert;
use Fuel\Core\Database_Query_Builder_Join;
use Fuel\Core\Database_Query_Builder_Select;
use Fuel\Core\Database_Query_Builder_Update;
use Fuel\Core\Database_Query_Builder_Where;
use Fuel\Core\Database_Query_Builder;
use Fuel\Core\Database_Result_Cached;
use Fuel\Core\Database_Connection;
use Fuel\Core\Database_Exception;
use Fuel\Core\Database_Expression;
use Fuel\Core\Database_Query;
use Fuel\Core\Database_Result;
use Fuel\Core\Database_Transaction;
use Fuel\Core\Fieldset_Field;
use Fuel\Core\File_Handler_Directory;
use Fuel\Core\File_Handler_File;
use Fuel\Core\File_Area;
use Fuel\Core\Image_Driver;
use Fuel\Core\Image_Gd;
use Fuel\Core\Image_Imagemagick;
use Fuel\Core\Image_Imagick;
use Fuel\Core\Model_Crud;
use Fuel\Core\Mongo_Db;
use Fuel\Core\Request_Curl;
use Fuel\Core\Request_Driver;
use Fuel\Core\Request_Soap;
use Fuel\Core\Session_Cookie;
use Fuel\Core\Session_Db;
use Fuel\Core\Session_Driver;
use Fuel\Core\Session_Exception;
use Fuel\Core\Session_File;
use Fuel\Core\Session_Memcached;
use Fuel\Core\Session_Redis;
use Fuel\Core\Validation_Error;
use Fuel\Core\Agent;
use Fuel\Core\Arr;
use Fuel\Core\Asset;
use Fuel\Core\Autoloader;
use Fuel\Core\Cache;
use Fuel\Core\Cli;
use Fuel\Core\Config;
use Fuel\Core\Controller;
use Fuel\Core\Cookie;
use Fuel\Core\Crypt;
use Fuel\Core\Date;
use Fuel\Core\Db;
use Fuel\Core\Dbutil;
use Fuel\Core\Debug;
use Fuel\Core\Error;
use Fuel\Core\Event;
use Fuel\Core\Fieldset;
use Fuel\Core\File;
use Fuel\Core\Finder;
use Fuel\Core\Form;
use Fuel\Core\Format;
use Fuel\Core\Ftp;
use Fuel\Core\Fuel;
use Fuel\Core\Html;
use Fuel\Core\Httpexception;
use Fuel\Core\Image;
use Fuel\Core\Inflector;
use Fuel\Core\Input;
use Fuel\Core\Lang;
use Fuel\Core\Log;
use Fuel\Core\Markdown;
use Fuel\Core\Migrate;
use Fuel\Core\Model;
use Fuel\Core\Num;
use Fuel\Core\Package;
use Fuel\Core\Pagination;
use Fuel\Core\Profiler;
use Fuel\Core\Redis;
use Fuel\Core\Request;
use Fuel\Core\Response;
use Fuel\Core\Route;
use Fuel\Core\Router;
use Fuel\Core\Security;
use Fuel\Core\Session;
use Fuel\Core\Str;
use Fuel\Core\Testcase;
use Fuel\Core\Theme;
use Fuel\Core\Unzip;
use Fuel\Core\Upload;
use Fuel\Core\Uri;
use Fuel\Core\Validation;
use Fuel\Core\View;
use Fuel\Core\Viewmodel;
うーん、実行前のコンパイルの負担になるな。これは。
ちなみに、これを出力するタスクです。
<?php
namespace Fuel\Tasks;
class Usegen
{
public static function run()
{
$dir = \File::read_dir(COREPATH.'classes');
$str = '';
self::print_use($dir, $str);
}
private static function print_use($ary, $str)
{
foreach ($ary as $key => $val)
{
if (is_array($val))
{
self::print_use($val, $str.ucfirst(trim($key,'/\\').'_'));
}
else
{
echo 'use Fuel\\Core\\'.$str.ucfirst(str_replace('.php', '', $val)).';'.PHP_EOL;
}
}
}
}
| FuelPHP、関数名補完 on NetBeans< 前 | 次 >Elefant CMS 1.1.1 日本語ファイル |
|---|
| < 前 | 次 > |
|---|