2010年3月8日月曜日

PHP extractは$thisを上書きするように一瞬見える

$thisに直接代入するとエラーがおきる

Fatal error: Cannot re-assign $this

$this = 'aaa';なんてすると、致命的エラーが出ます。たぶん$thisにあたるものがある言語で、$thisを変更するのは自殺行為的。

extract関数だとエラーが起きずに上書きされるように見える

class PollutionTest{
  // $thisが上書きできちゃうかテスト
  // $thisは上書きされたらだめなんだけど...
  function polluteThis(){
    var_dump($this);
    $this->method();
    extract(array('this' => 'This has been polluted!!'));
    var_dump($this);
    $this->method();
    echo $this;
  }
  
  function method(){
    echo 'Method Called', PHP_EOL;
  }
}

$obj = new PollutionTest;
$obj->polluteThis();

//実行結果
object(PollutionTest)#1 (0) {
}
Method Called
string(24) "This has been polluted!!"
Method Called

$thisは文字列になったはずなのに、メソッド呼び出しができるという謎。実際は上書きはされない。おそらく文字列を入れた時は$thisという文字列を入れた変数が別に存在している(呼び出し方は不明)。その関係で?__toStringメソッドが呼び出されなくなる模様。実際上書きはされないけど、なんらかの影響があるのはまずいですね...

外部からのデータは直接extractしちゃだめ

戒律ですね。viewを呼び出すところでこんな風に書いてる場合もあると思うので、注意が必要です。

class View{
  public function render($locals) {
    unset($locals['this']);
    extract($locals);
    include($this->template_file);
  }
}

0 件のコメント: