残り一年! PHP4からPHP5への移行

第1回 移行前の基礎知識

この記事を読むのに必要な時間:およそ 4.5 分

PHPバージョンの判別

順次移行するために,PHP4とPHP5の両方でプログラムが同じように動作するようバージョンごとに違うコードを実行したい場合は,PHP_VERSION定数とversion_compare関数を利用します。システム定義定数のPHP_VERSIONにPHPのバージョン番号が定義されおり,version_compare関数で比較できます。

例:PHP 4.4またはPHP 5.2以上で実行

<?php
if (version_compare(PHP_VERSION, '4.4', '>') && version_compare(PHP_VERSION, '5.0', '<')) {
   require_once('code_for_php4.php');
} else if (version_compare(PHP_VERSION, '5.2', '>=')) {
   require_once('code_for_php5.php');
} else {
   // それ以外は実行停止
   die('You need PHP 5.2 or later');
}
?>

このようなコードをアプリケーションの初期化ファイルなどに入れておけば,誤って古いシステムで実行されることを防げます。

PHPのコマンドラインバイナリとCGIバイナリ

PHPのコマンドラインバイナリ(CLIバイナリ)とCGI実行用のCGIバイナリの名称は,CLIバイナリが導入された際の混乱で様々な名前がつけられています。PHPプロジェクトのソースディストリビューションをデフォルト状態でコンパイルすると,⁠php」バイナリはCLIバイナリ,⁠php-cgi」がCGIバイナリになるよう設定されています。しかし,PHP環境をコンパイルしてユーザに提供しているディストリビュータには,⁠php」バイナリがCGI,⁠php-cli」がCLIバイナリとなるように調整していることがあります※2⁠。

※2
Windows版とUNIX版で異なるバイナリ名になるなど,CLIバイナリが登場した際には名前付で大きく混乱しました。その影響が現在でも残っています。

PHP5パッケージは「php」がCLI,⁠php-cgi」がCGIバイナリとなるようにパッケージングしているディストリビュータが多いと思います。バッチ処理などをPHPで実行している場合,⁠php」バイナリが意図しているバイナリであるか確認する必要がある場合があります。

例:XAMPP for Windowsのphp.exeのバージョン確認

C:\xampp\php\php4>php.exe -v
PHP 4.4.7 (cgi-fcgi) (built: May  4 2007 13:30:00)
Copyright (c) 1997-2007 The PHP Group
Zend Engine v1.3.0, Copyright (c) 1998-2004 Zend Technologies
    with Zend Extension Manager v1.2.0, Copyright (c) 2003-2007, by Zend Technologies
    with Zend Optimizer v3.2.4, Copyright (c) 1998-2007, by Zend Technologies

この実行例では

PHP 4.4.7 (cgi-fcgi)

と,php.exeがPHP4のCGIバイナリであることが分かります。

新しい予約語

PHP4と比べると,PHP5には以下の予約語が追加されました。予約語は関数名や定数名に利用できません。利用されている場合はParse Errorが発生します。エラーが発生する場所は定義された場所ではなく,利用された場所で発生します。

例:予約語の定数名

<?php
define('interface', 123);
echo interface; // ここでエラーが発生
?>
PHP5からの予約語一覧

exception final php_user_filter interface implements public private protected abstract clone try catch

予約語を定数名・関数名に利用している場合,名前を変えるしか方法はありません。

定義済み定数

PHP5には新しい定義済み定数が追加されています。モジュールも定数を定義します。定義済み定数の種類や数は読み込まれたモジュールの種類や数によって異なります。ここでは一部のPHP4とPHP5の定義済み定数を紹介します。実際にどのような定数が定義されているかは自分の環境で確かめてください。ここで利用しているphp4/php5コマンドは,それぞれPHP4,PHP5のCLI(コマンドラインバイナリ)を呼び出すシェルスクリプトになっています。

PHP4

[yohgaki@dev php4-php5-migration]$ ./php4 -r "print_r(get_defined_constants());"
Array
(
    [E_ERROR] => 1
    [E_WARNING] => 2
    [E_PARSE] => 4
    [E_NOTICE] => 8
    [E_CORE_ERROR] => 16
    [E_CORE_WARNING] => 32
    [E_COMPILE_ERROR] => 64
    [E_COMPILE_WARNING] => 128
    [E_USER_ERROR] => 256
    [E_USER_WARNING] => 512
    [E_USER_NOTICE] => 1024
    [E_ALL] => 2047
以下省略

PHP5

[yohgaki@dev php4-php5-migration]$ ./php5 -r "print_r(get_defined_constants());"
Array
(
    [E_ERROR] => 1
    [E_RECOVERABLE_ERROR] => 4096 ←新しい定数
    [E_WARNING] => 2
    [E_PARSE] => 4
    [E_NOTICE] => 8
    [E_STRICT] => 2048 ←新しい定数
    [E_CORE_ERROR] => 16
    [E_CORE_WARNING] => 32
    [E_COMPILE_ERROR] => 64
    [E_COMPILE_WARNING] => 128
    [E_USER_ERROR] => 256
    [E_USER_WARNING] => 512
    [E_USER_NOTICE] => 1024
    [E_ALL] => 6143
以下省略

定数名の衝突はまれとは思いますが,もし同じ名前を利用している場合,プログラム中の定数名を変更しなければなりません。

この例でもPHP5には新しくE_RECOVERBLE_ERRORが追加され,E_ALLの値が変更され,エラー処理関連で重要な変更が行われていることがわかります。これは後の項目で詳しく解説します。

著者プロフィール

大垣靖男(おおがきやすお)

University of Denver卒。同校にてコンピュータサイエンスとビジネスを学ぶ。株式会社シーエーシーを経て,エレクトロニック・サービス・イニシアチブ有限会社を設立。
オープンソース製品は比較的古くから利用し,Linuxは0.9xのころから利用している。オープンソースシステム開発への参加はエレクトロニック・サービス・イニシアチブ設立後から。PHPプロジェクトでは,PostgreSQLモジュールのメンテナンスを担当している。

URLhttp://blog.ohgaki.net/

著書