2002-12-27 [長年日記]
_ Eclipseいじり 3 (13:48)
やっぱりすごくいい。これからはほとんどの開発環境はこれに移行しよう。Java関連はもちろん充実しているし(携帯Java関連もできるかな?)、PHPもWebStudio for Phpをベースに環境構築すればちゃんとデバッグまで出来る。ついでにC#も結構まともに開発環境が構築できた(けど、これはまあVisualStudioの方が今のところは使いやすいかな)。あとPerlとHTML/CSS関連の環境があれば完璧なんだけどなー。なぜPerlのPlug-inは見あたらないんだろう。まあ単にコーディング+実行だけだったら現状の環境でも出来そうだけど。HTML/CSS関連も純粋にそれ用というのではなく、JSP作成の補助的な意味合いのものしか見あたらないし。
そういやWiki(英語のみ)の環境なんかもあったりするみたいだから、がんばればemacsみたいにエディタ機能をコアにがんがんいろんなアプリケーション的機能を取り込んでいくアプローチで、統合開発環境機能をコアにいろんなアプリケーション的機能も取り込んでいけるのかな。コアの機能がemacsなんかよりも強力な分、よりすごいものが出来てきそうだ。
たぶんこれでJBuilderとはさよならすることになりそうだな。ついでにDelphiともさよならしようかな。旧VBとDelphi(Object Pascal)を比較して、言語仕様的な優劣でDelphiを選んで好んで使ってきたわけだけど、現在のVB.NETはDelphiよりもできがいい。これならばWindows系アプリはDelphiよりもVB.NETを使った方が作りやすそうだ。本当ならばC#に行きたいところだけど、あれはJavaに似すぎていて気色悪いし、仕事の都合上VB.NETの方が使い回しが効く。それにVB.NET単体は1万円くらいで売っているから個人で買うのもそれほどつらくないし。Delphi 5 Professionalは5万円くらいしたんじゃなかったっけ。
もうちょっといろいろいじって自分なりの納得いく環境を構築できたら、そのうち情報のまとめを書いておこう。現在の懸案事項は、ApacheとかPerlとかの環境をCygwin環境をベースに構築するのと、Win32用のインストールパッケージ(ActivePerlとか)をベースに構築するのとどちらがEclipseとの相性がいいのか、という問題。最初Win32用パッケージをインストールして構築していったんだけど、あまりWin32パッケージが提供されないツール関連を使いたいとなるとCygwin環境をベースに全部構築した方が良さそうなんだよなー。
_ PHPのオブジェクトとリファレンス (13:48)
PHPのオブジェクトとリファレンス周りの仕様は大嫌いなんだけど、それを何とか使いこなすために試行錯誤中。問題なのは、
- インスタンスの変数への代入=インスタンスのコピーの作成であること
- インスタンスを返す関数に直接続けてインスタンスの機能を呼び出すコードが書けないこと
たとえば、
class ClassA{
var $value;
function Set($newvalue){
$this->value=$newvalue;
}
function Get(){
return $this->value;
}
}
なんて値を保持する簡単なクラスがある。で、そのクラスのインスタンスをグローバルに一つ生成しておいて、あちこちで手軽にそれを使い回したいと思う。
global $a; $a=new ClassA();
なんてすることで、グローバル変数$aにClassAのインスタンスが生成される。あとはカレントスコープがグローバルな場所ならば、
$a->Set("newvalue");
なんて感じで$aにアクセスできる。でも、スコープがローカルな場所ならば、
function func(){
global $a;
$a->Set("newvalue");
}
なんて感じで、いちいち$aがglobalであることを宣言しないといけない。それがいやなんで、どこからでも同じ表現でアクセスできるようなインターフェースを用意してみようかと思った。たとえば、
function &IA(){
global $a;
return $a;
}
なんて関数を用意すれば、カレントのスコープがグローバルだろうがローカルだろうが、IA()でグローバルな$aへの参照が返される。しかし、PHPでは関数が返したインスタンス変数への参照を使って、直接そのインスタンス変数の機能を呼び出すことは許されていないらしい。たとえば、
IA()->Set("newvalue");
なんて書くとタイムアウトまで固まってしまう。
$b=&IA();
$b->Set("newvalue");
というように、いったんローカル変数にインスタンスの参照を受け取ってからSetすると、きちんとグローバルな$aに値がセットされるのだが、これならばいちいちglobal $a;を記述するのと大差ないだろう。
ちなみに余談だが、
$b=IA();
$b->Set("newvalue");
は間違い。これはグローバルな$aのコピーである$bに対して値をセットしているだけなので、グローバルな$aには値はセットされない。
このあたりはとてもわかりにくい仕様だ。出来れば代入処理は、stringやintegerみたいな型に対して行った場合はコピーになり、その他オブジェクト型に対して行った場合は参照の代入になるといいんだけど。
ちなみにグローバルなインスタンス変数に対して、どのスコープからでも一意な表現でアクセスする手段としては、
$GLOBALS["a"];
を使うという方法もある。でも$GLOBALSを使った表現は見た目が美しくないので使いたくない。あと、
define("a",new ClassA());
なんてやったらどこでも、
a->Set("newvalue");
なんて出来るようになるんじゃないかと思ったら、あいにく定数にはオブジェクト型は入れられないそうな。
というわけで、現在手詰まり状態(動くことは動くけどね)。グローバルなインスタンス変数に対して、どのスコープからも手軽にアクセスできるような手段はないものかのー。

