PHPUnitをアップグレードしたら動作しなくなった

PHPUnit を何となくアップグレードしたら動かなくなってしまいました。

今回は pear upgrade で PHPUnit を 3.6.11 から 3.6.12 に 更新した後、phpunit コマンドを叩くと下記のようなエラーが出るようになりました。

# phpunit

Parse error: syntax error, unexpected T_FUNCTION, expecting ')' in /usr/local/lib/php/PHP/Timer/Autoload.php on line 47

Call Stack:
    0.0018      50328   1. {main}() /usr/local/bin/phpunit:0
    0.0030      87992   2. require('/usr/local/lib/php/PHPUnit/Autoload.php') /usr/local/bin/phpunit:43

修復に小一時間かかったので、直し方をメモしておきます。

原因

PHPUnit は PHP >= 5.3 での利用を強く推奨しており、PHP <= 5.2 のままだと動かない機能を盛り込んでくることがあります。

また、本体以外にも多数の依存パッケージがあり、どれかが急に >= 5.3 の機能を使い始めても動かなくなります。

私の環境は PHP 5.2.x だったため、今回のエラーに出くわしました。原因は phpunit/PHP_Timer がバージョンアップしたせいでした。

上記のソースからおわかりのように、1.0.4 から匿名関数を使っています。これは PHP >= 5.3 でしか動きません。5.2系ではパースエラーになります。

対策

PHP_Timer を再インストールすることで修正可能です。

アンインストールの時は依存関係を無視して削除するため「-n」オプションを付けています。

# pear uninstall -n phpunit/PHP_Timer
"phpunit/PHP_Timer" can be optionally used by installed package pear/PHP_CodeSniffer
warning: phpunit/PHP_Timer (version >= 1.0.2) is required by installed package "phpunit/phpcpd"
warning: phpunit/PHP_Timer (version >= 1.0.1, version <= 1.0.3) is required by installed package "phpunit/PHPUnit"
warning: phpunit/PHP_Timer should not be uninstalled, other installed packages depend on this package
uninstall ok: channel://pear.phpunit.de/PHP_Timer-1.0.4

#  pear install phpunit/PHP_Timer-1.0.3
downloading PHP_Timer-1.0.3.tgz ...
Starting to download PHP_Timer-1.0.3.tgz (3,743 bytes)
....done: 3,743 bytes
install ok: channel://pear.phpunit.de/PHP_Timer-1.0.3

以上で動作するようになりました。

PHP 5.2系の人はうかつに 「pear upgrade phpunit/phpunit」なんてコマンドを叩かないようにしましょう。

もしくはさっさと5.4系に移行しましょう。

参考