コネクト株式会社 技術情報コンテンツ | ||
2007年2月以前のポーティング事例(以下の記事は2008年2月以降に実施のVer4からVer5へのマイグレーションサービスとは無関係の記事です。予めご承知おきください。) PHP 5は、今までPHP 4で開発してきた資産を無駄にしないよう、互換性を重視して設計されている。 PHP 5で失われた互換性の大半は、PHP 5になって新設された関数や例外処理などであり、既存の関数に関しては、ほぼ互換性を保たれている。 しかし、実際にPHP 5へ移行した途端、エラーが発生してしまうケースは存在する。 コンパイラの仕様変更スクリプト中にクォート(シングルクォート、ダブルクォート)で囲われていないキーワードがあった場合、PHP 3およびPHP 4ではこれをクォートで囲った文字列として認識していた。 だが、PHP 5では厳密に文法を検査するようになったため、この場合は定数として判断する。 解決策PHP 5では、Undefined Constant(未定義の定数を使用した)として判定されてしまうが、これを逆手に取って解決する。 該当する文字列をdefine()で定数として定義してしまうのである。 <?php $a = ABC; ?> ABCというキーワードは、未定義の定数として扱われる。 <?php define('ABC', 'ABC'); $a = ABC; ?> 上記のように、define()を追記する事で、このスクリプトは正常に動作するようになる。 但し、require()やinclude()で読み込まれるスクリプトで、同じキーワードが使われる場合、二重に定数を定義してしまう事になる。 関数名のエイリアス*1廃止PHP 4では、mbstring系の関数の一部で、"mb_"から始まる関数に対し、"mb"から始まる関数名のエイリアスが用意されていたが、PHP 5ではこれが廃止された。 これにより、廃止されたエイリアスを利用していたスクリプトでUndefined function(未定義の関数)エラーが発生するようになった。 解決策未定義の関数と判断される事が原因なので、自分で関数を用意することで解決できる。 サンプル実際に、弊社でポーティング作業を担当した際の成果物の一部を紹介する。 このスクリプトを、i18n_convert()関数とi18n_ja_jp_hantozen()関数を、mbstring系関数に置き換えるための定義と、未定義のキーワードをdefine()で定数として定義している。
<?php このサンプルを見ていただければ、要点さえ抑えてしまえば比較的簡単にPHP 5に実現できる事がお分かり頂けるかと思う。 |