PHP 5.3の新機能と変更点

第3回PHP 5.3の追加機能と仕様変更 (1)

PHP 5.3では、目玉機能として説明した仕様の追加以外にも多くの変更が行われています。PHP 5.2とPHP 5.3の互換性はかなり高いですが注意が必要な変更もあります。

互換性に注意が必用な変更

  • モジュール関数のパラメータに互換性の無いデータ型を渡すと、NULLを返します。以前のPHPではFALSEを返していました。一部に例外があり、get_class()等ではFALSEを返します。

  • clearstatcache関数がデフォルトでrealpathキャッシュをクリアしなくなりました。

  • realpath関数がプラットフォームに依存しなくなりました。

  • call_user_func関数が親クラスからの呼び出しでも$thisが渡されるようになりました。

  • 配列関数(natsort、natcaserot、usort、uksort、array_flip、array_unique)がオブジェクトを引数として受け付けなくなりました(古いPHPとの互換性のためにオブジェクトも配列として扱っていた関数が、ほかの新しい配列関数と同じ動作になった⁠⁠。

  • mysqlndライブラリはMySQL 4.1の41バイトパスワードを利用しています。古い16バイトパスワードの場合は接続できません。

  • ディレクトリクラスとSplFileInfoのディレクトリ名から最後の⁠/⁠が取り除かれます。

  • __toStringメソッドがパラメータを受け付けなくなりました。

  • __get、__set、__isset、__unset、__callは常にpublicとなりstaticとして定義出来なくなり、必ず既定の引数が必用です。

  • private、protecedのメンバー変数へのアクセスには__callメソッドが呼び出されるようになりました。

  • gotoとnamespaceが予約語に追加されました(関数、クラス等の名前に利用できません⁠⁠。

PHP 5.3の新機能

目玉機能として紹介した機能は名前空間、レイトスタティックバインディング、クロージャ、goto文のサポートでした。

このほかにも様々な機能が追加されています。

  • php.iniの強化
  • __callStaticと__invokeマジックメソッドの追加
  • Nowdoc構文の追加
  • Heredoc構文の書式の追加
  • 定数定義の方法
  • 3項演算子の省略形
  • HTTPストリームラッパーのステータス処理
  • 入れ子の例外
  • ガーベッジコレクタの追加
  • E_DEPRECIATEDの導入
  • Windowsサポートの強化
  • 新しいモジュール

php.iniの強化

php.iniにセクション機能が追加され、2種類のセクションが使えるようになりました。この機能により同じphp.iniで開発環境と運用環境で異なる動作をさせたり、特定のパスで異なる動作をさせることが可能になります。

CGI(FastCGI⁠⁠ SAPIの場合に利用できるようになっています。

HOSTセクション

HOSTセクションはホスト名でアクセスした場合に有効になる設定です。

[HOST=development.example.jp]
error_reporting = E_ALL | E_STRICT
display_errors = On

Aapche/Apache2 SAPIの場合に、httpd.confなどの仮想ホスト設定で記述する、php_value/php_flagに相当する設定です。

PATHセクション

PATHセクションは特定のパスの場合に読み込まれるphp.ini設定です。.htaccessでのディレクトリ単位の設定に相当する設定が可能です(INI_PER_DIRで変更可能と設定されているphp.ini設定に限る⁠⁠。

[PATH=/www/public/old_app/]
auto_prepend_file=/www/lib/security_check.php

マジックメソッドの追加

オブジェクトの動作を制御するための特殊メソッド__callStaticと__invokeの2つが追加されました。

__callStatic

以前のPHPはstaticな呼び出し時に__call相当のマジックメソッドがありませんでした。__callStaticメソッドは__callメソッドど類似していますが、staticメソッドとして呼ばれた時に利用されます。

<?php
class Test {
    public function __call($name, $arguments) {
        echo "NORMAL".PHP_EOL;
    }

    public static function __callStatic($name, $arguments) {
        echo "STATIC".PHP_EOL;
    }
}

$obj = new Test;
$obj->foo('in object context');
Test::foo('in static context');
?>
出力
NORMAL
STATIC

__invoke

__invokeメソッドはオブジェクトを関数として呼び出した場合に呼び出されるメソッドです。次のようなコードを可能にします。

<?php
$obj = new Foo;
$obj('Hello World');
?>

例えば、Fooクラスが以下のように定義してあれば、上のコードは⁠Hello World⁠を出力します。

<?php
class Foo {
  function __invoke($msg) {
    echo $msg;
  }
}
?>

このようなオブジェクトの呼び出しをサポートしている言語もあります。ポートする場合等には便利でしょう。

Nowdoc構文の追加

Heredoc構文を利用した場合、⁠"」⁠ダブルクオート)で囲まれた文字列と同様にパースされ変数が展開されました。NowdocはHeredocの「'」⁠シングルクオート)版といえます。Nowdoc構文で記述されたブロックはパースされます。

Nowdoc構文を利用する場合、文字列の終端を表すラベルをシングルクオートで囲みます。

:Nowdoc
<?php
$var = 'FOO';
echo <<< 'EOD'
$var is not parsed
EOD
?>
出力
$var is not parsed

Heredocを利用した場合、$varはFOOに展開されます。Nowdocは文字列中の変数を展開しない分、高速に動作します。

Heredoc構文の書式の追加

Nowdocの導入により、文字列の終端ラベルをシングルクオートで囲めるようになりました。構文の対称性を保つため、Heredocのラベルはダブルクオートで囲めるようになりました。

: Heredoc
<?php
$var = 'FOO';
echo <<< "EOD"
$var is parsed
EOD
?>
出力
FOO is parsed

定数定義の方法

これまでのPHPはdefine文によって定数を定義しました。クラスの中ではconst文で定義できました。

PHP 5.3からconst文がクラスの外でも利用できるようになりました。この仕様変更は単純にdefine文が置き換えられる以上の意味があります。

define文は定数定義をランタイムに行っています。次のような単純な定数定義でも実行時に評価されています。

define('VAR', 'XYZ');

ランタイムに評価するため、変数や関数を利用して定数を定義することが出来ました。

define('VAR', somefunction());

関数型言語でよく見られる、一旦バインドしたら値が変更できない変数のような動作をしていたのがdefine文で定義された定数でした。

一方、クラスの内部で使えたconst文による定数はコンパイル時に評価できなければならない定数です。クラスの外で使えるようになったconst文も同じ仕様です。

const VAR=somefunction();

のような場合、コンパイル時に評価できないのでエラーになります。

PHPはスクリプト型言語なので普段はコンパイル時の評価と実行時の評価を区別して気にする必用はありません。しかし、負荷の高いWebサーバなどでバイトコードキャッシュを行っている場合、大量のdefine文による定数定義はパフォーマンスに影響していました。const文を利用することにより、以前より良いパフォーマンスが期待できます。

3項演算子の省略形

3項演算子のexpr1 ? expr2 : expr3に省略形がサポートされ、expr2(expr1がTUREの時に評価)が省略できます。expr2が省略された場合、expr1の評価結果が返されます。

echo 'abc' ?: 'xyz'; // abcを出力

様々な使い方が考えられますが、例えば戻り値がFALSEと評価される場合はエラーにしてしまうコードを簡略化するために利用できます。

<?php
function foo($param) {
   return --$param ?: trigger_error('$param cannot be 1');
}

foo(1);
?>
出力
Notice: $param cannot be 1 in /home/yohgaki/ext/src/php/php-5.3.0/- on line 3

HTTPストリームラッパーのステータス処理

HTTPラッパーはステータスが200から399まで値の場合、リクエストが成功したと処理するようになりました。この変更によりステータスコードを使用して、様々な成功状態を適切に処理できるようになりました。

入れ子の例外

入れ子の例外処理が記述できるようなり、より柔軟な例外処理が可能になりました(tryブロックの中にtryブロックを記述できるようなった⁠⁠。

<?php
class MyException extends Exception { }

class Test {
    public function exceptionTest() {
        try {
            try {
                throw new MyException('FOO');
            } catch (MyException $e) {
                /* もう一度throwすると上レベルのcatchでcatch */
                throw $e;
            }
        } catch (Exception $e) {
            var_dump($e->getMessage());
        }
    }
}

$foo = new Test;
$foo->exceptionTest();
?>
出力
string(3) "FOO"

ガーベッジコレクタの追加

ガーベッジコレクタが実装され、デフォルトで有効になっています。PHPプログラマは意識する必用がありませんが、循環参照されている場合にプログラムの実行が終了するまでメモリが解放されない問題が解決します。

E_DEPRECIATEDの導入

廃止予定の機能を利用した場合に、E_DEPRECIATEDエラーが発生するようになりました。PHP 6へ移行しやすいコードを書くには便利な機能です。

また、ユーザレベルのE_USER_DEPRECIATEDエラーレベルもサポートされるようになりました。ライブラリ等で廃止予定の機能を利用していることを、ユーザに知らせるために利用できます。

Windowsサポートの変更箇所

Windowsサポートが大幅に向上しました。WindowsではDNS関数がサポートされなかったり、シンボリックリンクがサポートされていなかったため、UNIX系システムと互換のスクリプトを書くことが困難でした。PHP 5.3ではこれらの関数がサポートされたため、Windows系、UNIX系OSの両方で動作するスクリプトの作成が容易になりました。

IISのISAPIモジュールとして動作するPHPは削除されました。これはマルチスレッドサーバ上のモジュールとして動作させた場合、PHPの安定動作に問題があったからです。PHP自体はマルチスレッドに対応していましたが、モジュール等が利用するライブラリがマルチスレッドに対応していないと正しく動作しない問題がありました。

以前よりISAPIの利用よりFastCGI SAPIの利用が勧められていました。ISAPIを利用していた方は、高速かつ安定して動作するFastCGI SAPIを利用することになります。

Windows版の互換性

PHP 5.3よりサポートするプラットフォームが変更されています。

  • Windows 2000以降のWindows(Windows 98、ME、NT4サポートの廃止)
  • i586以上のCPU(バイナリ配布版)
  • 64bit版Windowsサポート
  • Virual C++ 9サポート
  • PDOのOracleドライバがOracle10/Oracle11用ライブラリを使用(バイナリ配布版)
  • OCI8モジュールに複数バージョンをサポート(バイナリ配布版)

新しくWindows版でサポートされた関数

DNS関連関数

  • checkdnsrr()
  • dns_get_record()
  • fnmatch()
  • getmxrr()

パラメータのパース

  • getopt()

イメージ関数

  • imagecolorclosesthwb()

インターネットアドレス関数

  • inet_ntop()
  • inet_pton()

ファイル関数

  • link()
  • linkinfo()
  • readlink()
  • symlink()

暗号関数

  • mcrypt_create_iv()

ソケット関数

  • socket_create_pair()
  • stream_socket_pair()

スリープ関数

  • time_nanosleep()
  • time_sleep_until()

Windows版のその他の変更と注意点

ファイル関数、stat関数、touch関数、filemtime関数、filesize関数と関連する関数の、ほかのプラットフォームとの互換性が向上(現状では、ほぼ100%の互換性)しました。

symlink関数はWindows Vista以降で利用できます。当然ですが、ファイルシステムがハードリンク、シンボリックリンクをサポートしていないと利用できません。リンクを利用する場合はNTFSが必用です。

Windows版のPHPではWindowsのバージョンや実行環境を定義した定数が利用可能になりました。

定数説明
PHP_WINDOWS_VERSION_MAJOR5(XP/2003 R2/2003/2000⁠⁠、6(Vista/2008)
PHP_WINDOWS_VERSION_MINORマイナーバージョン
PHP_WINDOWS_VERSION_BUILDビルド番号
PHP_WINDOWS_VERSION_PLATFORM2(Vista/XP/2000/NT4⁠⁠、1(Server 2008/2003)
PHP_WINDOWS_VERSION_SP_MAJORサービスパック番号
PHP_WINDOWS_VERSION_SP_MINORサービスパックマイナー番号
PHP_WINDOWS_VERSION_SUITEMASKインストールされている機能
PHP_WINDOWS_VERSION_PRODUCTTYPE製品タイプ
PHP_WINDOWS_NT_DOMAIN_CONTROLLERドメインコントローラ
PHP_WINDOWS_NT_SERVERSERVERシステム(Windows Server製品)
PHP_WINDOWS_NT_WORKSTATIONWORKSTATIONシステム(Vista/XP/2000)

php.ini設定の変更

全てでは無いと思いますが、調査した範囲でのphp.ini設定の変更箇所です。PHPマニュアルではPHP 6での変更となっているものなどもありますが、実際にPHP 5.3から変更されているものは取り上げています。逆に既にPHP 5.2で取り込まれているものは削除しています。

追加されたphp.ini設定

設定名説明
cgi.dicard_pathCGIのパス情報を破棄(デフォルト:0)
mail.add_x_headermail()にX-HEADERを追加
mail.logmail()のログ設定
user_ini.cache_ttlini設定のキャッシュ時間(デフォルト:300)
user_ini.filenameuser.iniファイル名(デフォルト: .user.ini)
mysqli.cache_sizePHPクライアント側のキャッシュスロット数(2000)
mysqli.allow_local_infileロカールファイルに対するLOAD DATAの使用(デフォルト:On)

仕様変更されたphp.ini設定

設定名説明
short_open_tagスクリプトから設定変更が可能になった
open_basedirスクリプトから設定変更が可能になった

削除されたphp.ini設定

設定名説明
zend.ze1_compatibility_modeZendEngine1との互換モード
zend_extension_debug、zend_extension_debug_ts代わりにzend_extensionが利用可能

PHP 6で削除予定のphp.ini

  • allow_call_time_pass_reference
  • define_syslog_variables
  • register_globals
  • detect_unicode
  • magic_quotes_gpc
  • magic_quotes_runtime
  • magic_quotes_sybase
  • enable_dl(CGI/CLI/Embed以外は5.3から実質的に無効)
  • highlight.bg
  • safe_mode
  • safe_mode_allow_env_vars
  • safe_mode_exec_dir
  • safe_mode_gid
  • safe_mode_include_dir
  • safe_mode_proteced_env_vars
  • session.bug_compat_42
  • session.bug_compat_warn
参考文献
PHP マニュアル
PHP 5.2 to 5.3マイグレーションガイド
PHP 5.3ソース

おすすめ記事

記事・ニュース一覧