PHPUnitとob_start()

Laphroaig 1979 18yo (Blackadder)

PHPUnitでテストケースを作っていた。
画面周りはユニットテストするのが結構厄介なことが多い。HTMLのFormでPostされたデータを扱っている部分があって、ここはPHPUnitではできないかなと思っていた。しかし、$_POST変数は変更不可と思っていたところ、スクリプト内で設定ができることが分かった。

    $_POST['param1'] = 'value1';
    $_POST['param2'] = 'value2';
    
    ob_start();
    include('template.php');
    $output = ob_get_contents();
    ob_end_clean();
    
    $this->assertContains("HTML string to be asserted.", $output);

こんな感じで結構テストケースが書けてしまった。

PHP 4.3.10

PHP 4.3.10 で既存のプログラムが動かない危険性があるようだ。どうもChangeLogにある

Backported Marcus' foreach() speedup patch from PHP 5.x.

が結構危ないみたい。
私の環境でも 4.3.9 -> 4.3.10 にしたら、NuSOAP 1.67 が動作しなくなった。Zend studioをインストールしたときに、Zend Optimizer(2.1.0)が入ったのが原因らしい。(php.iniでZend Optimizerを外したら、NuSOAPは動作するようになった。)
その時、試しにデバッグしてみたら、やはりforeachの挙動がおかしかった。wsdlクラスのgetOperationData()というメソッドで、

foreach(array_keys($this->bindings[ $portData['binding'] ]['operations']) as $bOperation) {

というのがあって、array_keys()で返ってくるのはstringの配列なんだけど、$bOperationにはstringでなく、

array(2) {
  [0]=>
  string(9) "XXXXXXXXX"
  [1]=>
  int(0)
}

が入っていた。
なお上記はWindowsでの話で、SolarisPHP Acceleratorとの組み合わせについては試してないです。