永遠のビギナーのブログ -88ページ目

PHP Unit Bug?の続き

昨日の続き(混乱編)


PHPはおろかApacheまで動かなくなった件について。


とりあえず、1日たったので落ち着いて考える。

PHP v5.2.10をみてみる。(Webページね)PECLに対応していない、と書いてある。

あやしい。。。まずアンインストール。リブート。


これでApacheは立ち上がった。もう一度クリーンになったところで再インストール。

症状は元に戻った。Apacheすら立ち上がらない。

PECLはcで作ったPHPの拡張モジュールらしい。

PECLコマンドでインストールするらしいがいじった覚えはない。

とはいえ、それしか心当たりがないので今度はv5.2.9-2を持ってきて入れてみる。


今度はApacheは立ち上がった。ちゃんと認識している。

今度はコマンドラインでphpunitを動かしてみる。なんかDLLがない、と文句を言われる。

面倒だったので全部入れてみたのがいけなかったらしい。

というわけでいらなそうなものをインストールからはずす。今度は問題ない。

念のため確認するとphpinfo()も動作している。

とりあえずApacheとPHPの連携も問題ないようだ。


今回の教訓

設定ファイルはバックアップをとっておこう。あと、インストールするときは復元ポイントを作っておくこと。


PHPUnit bug?

PHPUnitの試用


とりあえずいろいろ試行してみたが、大丈夫なのかこれ?というのが正直な感想。

以下みたいなコードは動いた。


 /**

* @dataProvider provideXXX
*/
function testRegisterdXXX($XXXListArray) {
$counter = count($XXXListArray);
$field = new Field;
// print_r($XXXListArray);
foreach ($XXXListArray as $XXX) {
$this->assertTrue($field->Register($XXX));
}
$this->assertEquals($counter, $field->RegisterdXXX());
}
function provideXXX() {
$XXXList2 = array(new XXX, new XXX);
$XXXList3 = array(new XXX, new XXX, new XXX);
return array(
'count2' => array($XXXList2),
'count3' => array($XXXList3)
);
}


けど、本当にしたかったのはこんな感じ。


function testRegisterdXXX($XXXListArray) {
$counter = $XXXListArray['size];
$field = new Field;
foreach ($XXXListArray['data'] as $XXX) {
$this->assertTrue($field->Register($XXX));
}
$this->assertEquals($counter, $field->RegisterdXXX());
}
function provideXXX() {
$XXXList2 = array(new XXX, new XXX);
$XXXList3 = array(new XXX, new XXX, new XXX);
return array(
'count2' => array('data' => $XXXList2, 'size' => 2),
'count3' => array('data' => $XXXList3, 'size' => 3)
);
}


ところがこれだと、sizeなんか知らんといわれる。

PHPUnitのマニュアルを見ると、dataProviderが返すのが配列の配列で、

テスト関数に引き渡されるのがその要素だから引き渡されるのは

array('data' => $XXXList2, 'size' => 2),
のはず。実際Failureのメッセージもそう出ていた。

なのにどうして知らないなどといわれるのかいろいろやってみて最後にやってみたのが

コメントアウトした青字の部分。

みてみたら実際にわたっていたのは$XXXList2(or 3)だけだった。

PHPの配列は連想キーマップのkey-valueだから、正確には

array(0 => $XXXList2(or 3))のみ。

'count2' => array($XXXList2, 2),
と定義すると$XXXList2がわたるし、

'count2' => array(2, $XXXList2),

と定義すると2がわたる。

こんなあほなバグはさすがにないだろ、と思っていろいろ調べてみたが徒労に終わった。


だから、'size'や'data'は知らない、といわれるし、本来明示的に渡したいsizeもカウントすることでごまかした。

これじゃあ、ちゃんと引きわたっていない時のバグ検出に役に立たない。

ちなみにPHPUnitはv3.3.17で現時点の最新。PHPはv5.2.9-1で最新ではない。


現在、PHPをv3.2.10にあげたらPHPが起動しなくなりました。

ついでにApacheもです。混乱しているので今日はこれで終わりです。

だれか原因のわかる人がいたら教えてください。



追記:2009.8.19

さすがにこんなバグではないが、説明がちょっと不親切な気がする。

さすがにkeyにラベルが使えないのは本当のよう。

けど、array($XXXList2, 2)は引き渡せる。どうするかといえば、

testRegisterdXXX($XXXListArray, $count)

と定義すればよい。ようするに1番目の引数に配列の0番目の要素、2番目の引数に配列の1番目の要素、、、

と引きわたっている。どこかに書いていたわけではなくてふと思いついてやってみたらできた。

だから正確に言えば「dataProviderの返す配列の要素が引数にわたっている」のではなく、

「dataProviderの返す配列の配列の各要素が各引数にわたっている。」というのが正しいと思う。


とりあえず継続して試行中。

PHP Hacks―プロが教えるWebプログラミングテクニック/ジャック ヘリントン
¥3,780
Amazon.co.jp


初めてのPHP5/デイビッド スクラー
¥2,940
Amazon.co.jp


Vim for PHP in Windows #4

autocomplpop.vimの導入


いよいよ自動補完。

上記プラグインをvim.orgから持ってきて、$home/vimfiles/pluginに放り込むだけ。

これだけでVimの自動補完やら、PHPの自動補完をしてくれる。


(まあ、PHPは辞書設定を_vimrcにしている所為だけど。)


あとはPEARだ。ctagsというソフトを使うとできるらしい。

これもkaoriyaさんにあったので、拾ってくる。

Webをみると、どうもtagを作成してくれて、ソース上にkeywordがあると、その宣言部に行ってくれるらしい。

これVimのマニュアルのスタイルで、自動補完とどう関係するのか不明。

とりあえずやってみる。

とりあえずやってみる。

(大事なことなので2回言いました。)


ctagsを解凍して、適当なディレクトリ(フォルダのことね)に放り込み、pathを通す。

コマンドプロンプトを開いてPEARのディレクトリに移動し、

ctags -R --language=php[enter]

と打ち込んでやる。あっさりできた。結構でかい。17Mくらいかな。

ここら辺はPEARのどのモジュールを入れているかで変わるのでサイズは気にしないでください。


さて、これをどうすればいいのか。。。。


とりあえず普通に使うにはtag環境変数(vimのね)を設定すればいいようだ。

というわけで、phpの時しか使わないから、

$home/vimfiles/ftplugin/php/php.vimに

set tags=$home\\vimfiles\\ftplugin\\php\\pear_tags

と設定してやる。

あとは作成したタグをpear_tagsに名前変更して、指定したフォルダに入れてやる。


さてどうなることやら。

とりあえずphpファイルを作成してみる。

おお、もう補完が効いている。すばらしい。

でもちょっと反応遅くないか?全然キー入力に間に合ってないぞ。


vimの補完が残っているはずだからそれをはずせば早くなるかもしれないけれど、

(tag環境変数はバッファローカルみたいだから、他のファイルを同時編集しても問題ないはず)

あまり早くなるとも思えない。(どうせpear_tagsの方がでかすぎる)

単一ファイルに対する検索だからどうせCPU入れ替えてコア数増やしても

なんの解決にもならないだろうし。


あと気になるのは、'>'の色が他のと違う。どうもHTMLの設定が効いているようだ。

phpファイルの時にこれをはずすかどうかは悩ましいところ。

混在することもあるだろう。うーーーん、どうすべきか。


今気がついた。補完のことに気をとられて、<?phpを入れてなかった。

試しに入れてみると問題ない。すばらしい、きちんと領域を認識している。


もう少しいろいろやってみて環境が整理できたら_voimrcを公開してもいいかもしれない。

今のところは程度が低くて迷惑なだけだろうし。


他に興味のあるプラグインは今のところsorround.vimとmatched.vim(名前合ってるかな?うろ覚え)

まあ、ぼちぼちと。あまり環境オタクになって肝心の作業が進まなくては意味がないからね。

もう少し使ってみて問題なければエディタは乗り換えることにします。