July 10, 2008

PHP4 がおかしい件

今、仕事で PHP4 を使ってます。
実は僕は本格的に PHP を使うのは初めてなので、言語仕様とか気になった部分から今いろいろ調べ始めているんですけど、いやー、PHP って、かなりおかしな言語ですね。
まず、コンテキストに対する考え方がどうかしてるんじゃないかと。

例えば、以下のプログラムを PHP4 で動かすと興味深い結果が得られます。

<?php
class foo {
  function bar() {
    echo "class name => " . get_class($this);
  }
}

class hoge {
  function huga() {
    foo::bar();
  }
}

$h = new hoge();
$h->huga();
?>

プログラムを実行すると以下のように出力されます(PHP 4.4.8 で動かしてます)。

class name => hoge

意味わかりますか?
わかりますよね。
foo のクラスメソッド bar() 内で $this を参照できて(!)、かつその $this の型(クラス)が hoge なんです!
処理としては、hoge クラスのインスタンス $h のメソッド huga() の中で foo クラスのメソッド bar() をクラスメソッドとして(PHP4 ではクラスメソッドとインスタンスメソッドの区別はない!)呼び出しているんだけど、このときのメソッド bar() における $this ってのが呼び出し元である $h を指してると。
なので get_class() 関数で得られるクラス名が「hoge」になる。
もしかして、huga() と bar() とでコンテキストが共有されているってこと?!
正確なところはソースコードを追わないとなんとも言えないけど、まあなんにせよ言語仕様的に狂ってるよね!
まさか PHP がここまでひどいとは思わなかった。

ごめん、言い過ぎた。

ま、PHPer にとってはこの程度のことは周知の事実なんだろうな。
こういった罠にはまらないように日々細心の注意を払ってプログラミングしてるんだろうな。
偉いなぁ。

PHP5 でどうなってるのかは知らないけど。

参考:
Diary?::2007-06-03

No Comments »

TrackBack URI

Leave a comment

※上の項目は入力してもしなくてもよいです。