マルチリンガルの弊害
Web にかかわるとマルチリンガルになることが多いです。 といっても人間の言葉ではなくコンピュータ言語。
フロントは DHTML + CSS + JavaScript 、バックエンドは PHP とか。 これだけでも 4種類。 あと、SQL がはいってきたり、その他関連技術の言語がでてきたり…。
デザイナーとプログラマーの分業というのは良く聞きますが、やっぱりひとつだけ分かって、あとはまったく分からんと言うのは無理なので、結局全部かじる結果となります。
特に AJAX とかだと、上記の例は JavaScript と PHP が密になります。 で一人でいっしょに書いたりするわけですが、、いやコンピュータ言語なんかどれもいっしょなので大抵なんとかなるんですが、でも細かい仕様の差でハマることもあります。
あれ、エラーなぜかでる、、、あ変数名に $ ついてねーよ、うわ!メンバアクセスは -> かい、みたいな(笑)
まーシンタックスはいいとして、言語仕様でうっかりハマった話。
プログラム言語にはたいてい、関数という機能がついています。 関数に値を引数で渡すと答えが返ってくるという機能。 よく初心者に難しいと言われるのは、引数に”参照”を渡す場合。 オブジェクト(操作対象)を参照で渡して、関数(メソッド)に操作してもらうなんて使い方はよくやります。
PHP4 と PHP5 でこの部分の仕様が完全に違うのですが、とりあえず PHP4 で。
function hoge(&$object1) {
$object2 = new Object2();
$object1 = $object2;
}
こーすると、hoge に渡された $object1 は $object2 に入れ替わって戻ります。 こんなことはあんまりしないけど、サンプルってことで。
じゃー、JavaScript で同じことをかく。
function hoge(object1) {
object2 = new Object2();
object1 = object2;
}
しかし、JavaScript の場合これは正しく動作しません。(object1 はそのまんま)
あれー、参照渡しだからいいはずなんだけどなー、と悩む。。
実は Java 系の場合、引数の参照変数に対する代入は意味を持ちません。 ポインタアドレスはその変数に渡ってくるので、もちろん該当オブジェクトの操作はできるのですが、引数の変数自体は参照ではなく値渡しなのです。 逆に PHP で引数を受け取る部分で & をつけた場合は C のポインタ渡しと同じく “引数の変数も参照”(?) です。
ちなみに、PHP5 は & をつけなくてもオブジェクトは参照で渡るように変わりましたが、この場合は Java と同じ仕様、”引数の変数自体は参照ではなく値渡し” になるようです。 & をつけた場合は、PHP4 と同様の動作です。
PHP4 ばっかりいじってたから、、
なんでこんなことがおきたかというと JavaScript で、
function hoge(array) {
var tuika = new Array();
tuika.push("mogemoge");
tuika.push("hogehoge");
// tuika を結合
array = array.concat(tuika);
}
とかってやって、あれーー呼び元で array に tuika されん。。 って。 ハマったのです。
そもそも、concat (配列の結合) メソッドが array に対しての操作ではなく、結合された配列を “返す” って仕様が意味分からないのですが、、普通 array.concat(tuika); だけで array に追加されるだろーて。 😛
まぁまぁ文句を言ってもしょうがない。。 マルチリンガルな方は、似て非なるものにご注意ください。(こんなハマりかたするのはぼくだけか。。
From: aka - 2007/4/22 Sunday (Comment)
マルチリンガルで真っ先に思い浮かんだものが i18nとl10nな私は似非ローカライザー。:razz:
From: ひろまさ - 2007/4/24 Tuesday (Comment)
なるほど、人間インタープリタですね。