PR

PHPの関数や言語構造は、バージョンが上がる毎により便利に扱えるように改 良されています。そのような変更の多くは以前のバージョンの関数を拡張した 形になるのですが、必ずしも下位互換性を持つものばかりではありません。 中には、スクリプトの挙動に大きく影響してくる変更点も含まれます。

顕著に動作に影響のある変更を施されてきたものにempty()があります。 empty()は、その引数に与えられた変数が「空であるか」の判定を行う関数(正 しくは言語構造)です。

この関数はPHP3からPHP4へのバージョンアップの際、"0"(文字列の0)を空であ ると見なすよう、挙動変更されました。

これによって、現在では以下のようなスクリプトにおいて、ユーザ側からの入 力値が0であった場合にはブロック内の処理が実行されるようになっています。

if (empty($_POST['var'])) {
    // 処理
}

また、これと共にisset()も挙動が変更され、PHP3までは空文字列""の代入され た変数に対してfalseを返していましたが、PHP4ではtrueを返すようになりま した。

そのため以下のようなスクリプトでは、ユーザが値を入力したかどうかを判別 することはできません。

if (isset($_POST['var'])) {
    // 処理
}

PHP4からPHP5に変わる際にも、empty()に変更が加えられました。この時の変更は オブジェクトの判定にまつわるもので、PHP4では以下のように

class foo
{
    function bar () {
        // 処理
    }
}

$hoge = new foo();
if (empty($hoge)) {
        // 処理
}

プロパティを持たないオブジェクトは空であると判定されていましたが、PHP5で はこの問題が修正されて、上のようなオブジェクトでも空ではないと判定される ようになりました。

このように、以前から存在するチェック関数でもバージョンアップのたびに動 作への影響が大きい変更が加えられていることがあります。

バージョンの違うシステムを移植する際にはマニュアルを参考に、特にチェック 関数周りは十分に注意しましょう。

参考:

PHP 3 から PHP 4 への移行 - empty("0") :
http://www.phppro.jp/phpmanual/php/migration4.empty.html
PHP 4 から PHP 5 への移行 - 下位互換性のない変更点 :
http://www.phppro.jp/phpmanual/php/migration5.incompatible.html


(アシアル 亀本大地)


この記事は、アシアルが運営するPHP開発者のためのポータル&コミュニティサイト「PHPプロ!」で毎週配信しているPHP・TIPSメーリングリストを再録したものです。
同サイトでは、他にもPHP最新ニュースや、困ったときのQ&A掲示板、初心者向けのPHP講座など、PHP開発者をサポートする情報を掲載しています。