2007/
特に記述がない場合、
PHP4とPHP5の違い
PHP4とPHP5は言語仕様が異なる言語ですが、
主なPHP4とPHP5の違い
- オブジェクト変数がオブジェクトへのハンドルとなった
- オブジェクト指向プログラミングサポートが向上した
- XML関連モジュールが入れ替えられた
- PECL
[1] に移動されたり削除されたモジュールがある
基本的な違いで困る場合もあります。その一例が新しい予約語です。PHP5はオブジェクト思考プログラミング機能が拡張されたため、
最終回の
この記事はPHP4からPHP5への移行をテーマに記述していますが、
PHP4とPHP5のバージョン
執筆時点でメンテナンス中のPHP4のバージョンは4.
PHPのバージョンは最初のバージョン番号がメジャーバージョン番号です。このバージョン番号が変わると言語エンジンレベルでの仕様が大幅に変わります。
2つ目のバージョン番号はマイナーバージョン番号です。マイナーバージョンが変わると新しい機能や関数が追加されたり、
3つ目のバージョン番号はバグフィックスバージョン番号です。このバージョン番号が変わるとバグが修正されます。基本的には互換性がない変更は行わないことになっています。しかし、
PHPはPHP4、
筆者は新しいマイナーバージョンがリリースされた場合、
PHPのモジュールとバージョン間の互換性
PHPのモジュールは内部的にZendエンジン
PHPはモジュールをロードする場合、
ソースが公開されているPECLモジュールやサードパーティーモジュールでPHP5をサポートしていれば、
PHPをソースからビルドしてインストールしたり、
$ /path/to/phpize # phpizeコマンドは必ずターゲットとなるPHPバージョンに付属のphpizeコマンドを使用する $ ./configure # --with-module_name または --enable-module_nameなどのオプションが必要な場合もある。詳しくは./configure --helpで $ make # コンパイルする $ make install # モジュールディレクトリにインストールする
あとはphp.
PHPバージョンの判別
順次移行するために、
<?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のコマンドラインバイナリ
PHP5パッケージは
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)
と、
新しい予約語
PHP4と比べると、
<?php
define('interface', 123);
echo interface; // ここでエラーが発生
?>
PHP5からの予約語一覧
exception final php_
予約語を定数名・
定義済み定数
PHP5には新しい定義済み定数が追加されています。モジュールも定数を定義します。定義済み定数の種類や数は読み込まれたモジュールの種類や数によって異なります。ここでは一部のPHP4とPHP5の定義済み定数を紹介します。実際にどのような定数が定義されているかは自分の環境で確かめてください。ここで利用している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
以下省略
[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_
無効な文字列オフセットアクセス
PHP5から無効な文字列オフセットへのアクセスはE_
<?php
$str = 'abc';
unset( $str{1} );
echo $str;
?>
[yohgaki@dev php4-php5-migration]$ ./php5 invalid_str_offset.php Fatal error: Cannot unset string offsets in /home/yohgaki/php4-php5-migration/invalid_str_offset.php on line 3
PHP4では問題なく実行できていたスクリプトが途中で実行を停止する場合もあるので、
エラー処理
PHP5には新しくE_
E_
E_
新しいエラーレベルが追加されたと同時にE_
E_
error_reporting = E_ALL | E_STRICT
httpd.
php_admin_value error_reporting 6143
と設定しなければなりません。E_
php_admin_value error_reporting 8191
とします。
アプリケーションが動作するためにはエラーハンドラの書き換えは必要ないです。システムのポリシーとして全てのエラーは補足し記録している場合などは、
まとめ
今回はPHP5に移行に必要な基礎知識を解説しました。
次回はPHP4.