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セクションはホスト名でアクセスした場合に有効になる設定です。
Aapche/Apache2 SAPIの場合に、httpd.confなどの仮想ホスト設定で記述する、php_value/php_flagに相当する設定です。
PATHセクション
PATHセクションは特定のパスの場合に読み込まれるphp.ini設定です。.htaccessでのディレクトリ単位の設定に相当する設定が可能です(INI_PER_DIRで変更可能と設定されているphp.ini設定に限る)。
マジックメソッドの追加
オブジェクトの動作を制御するための特殊メソッド__callStaticと__invokeの2つが追加されました。
__callStatic
以前のPHPはstaticな呼び出し時に__call相当のマジックメソッドがありませんでした。__callStaticメソッドは__callメソッドど類似していますが、staticメソッドとして呼ばれた時に利用されます。
__invoke
__invokeメソッドはオブジェクトを関数として呼び出した場合に呼び出されるメソッドです。次のようなコードを可能にします。
例えば、Fooクラスが以下のように定義してあれば、上のコードは“Hello World”を出力します。
このようなオブジェクトの呼び出しをサポートしている言語もあります。ポートする場合等には便利でしょう。
Nowdoc構文の追加
Heredoc構文を利用した場合、「"」(ダブルクオート)で囲まれた文字列と同様にパースされ変数が展開されました。NowdocはHeredocの「'」(シングルクオート)版といえます。Nowdoc構文で記述されたブロックはパースされます。
Nowdoc構文を利用する場合、文字列の終端を表すラベルをシングルクオートで囲みます。
Heredocを利用した場合、$varはFOOに展開されます。Nowdocは文字列中の変数を展開しない分、高速に動作します。
Heredoc構文の書式の追加
Nowdocの導入により、文字列の終端ラベルをシングルクオートで囲めるようになりました。構文の対称性を保つため、Heredocのラベルはダブルクオートで囲めるようになりました。
定数定義の方法
これまでのPHPはdefine文によって定数を定義しました。クラスの中ではconst文で定義できました。
PHP 5.3からconst文がクラスの外でも利用できるようになりました。この仕様変更は単純にdefine文が置き換えられる以上の意味があります。
define文は定数定義をランタイムに行っています。次のような単純な定数定義でも実行時に評価されています。
ランタイムに評価するため、変数や関数を利用して定数を定義することが出来ました。
関数型言語でよく見られる、一旦バインドしたら値が変更できない変数のような動作をしていたのがdefine文で定義された定数でした。
一方、クラスの内部で使えたconst文による定数はコンパイル時に評価できなければならない定数です。クラスの外で使えるようになったconst文も同じ仕様です。
のような場合、コンパイル時に評価できないのでエラーになります。
PHPはスクリプト型言語なので普段はコンパイル時の評価と実行時の評価を区別して気にする必用はありません。しかし、負荷の高いWebサーバなどでバイトコードキャッシュを行っている場合、大量のdefine文による定数定義はパフォーマンスに影響していました。const文を利用することにより、以前より良いパフォーマンスが期待できます。
3項演算子の省略形
3項演算子の“expr1 ? expr2 : expr3”に省略形がサポートされ、expr2(expr1がTUREの時に評価)が省略できます。expr2が省略された場合、expr1の評価結果が返されます。
様々な使い方が考えられますが、例えば戻り値がFALSEと評価される場合はエラーにしてしまうコードを簡略化するために利用できます。
HTTPストリームラッパーのステータス処理
HTTPラッパーはステータスが200から399まで値の場合、リクエストが成功したと処理するようになりました。この変更によりステータスコードを使用して、様々な成功状態を適切に処理できるようになりました。
入れ子の例外
入れ子の例外処理が記述できるようなり、より柔軟な例外処理が可能になりました(tryブロックの中にtryブロックを記述できるようなった)。
ガーベッジコレクタの追加
ガーベッジコレクタが実装され、デフォルトで有効になっています。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()
パラメータのパース
イメージ関数
インターネットアドレス関数
ファイル関数
- link()
- linkinfo()
- readlink()
- symlink()
暗号関数
ソケット関数
- 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_MAJOR | 5(XP/2003 R2/2003/2000)、6(Vista/2008) |
PHP_WINDOWS_VERSION_MINOR | マイナーバージョン |
PHP_WINDOWS_VERSION_BUILD | ビルド番号 |
PHP_WINDOWS_VERSION_PLATFORM | 2(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_SERVER | SERVERシステム(Windows Server製品) |
PHP_WINDOWS_NT_WORKSTATION | WORKSTATIONシステム(Vista/XP/2000) |
php.ini設定の変更
全てでは無いと思いますが、調査した範囲でのphp.ini設定の変更箇所です。PHPマニュアルではPHP 6での変更となっているものなどもありますが、実際にPHP 5.3から変更されているものは取り上げています。逆に既にPHP 5.2で取り込まれているものは削除しています。
追加されたphp.ini設定
設定名 | 説明 |
cgi.dicard_path | CGIのパス情報を破棄(デフォルト:0) |
mail.add_x_header | mail()にX-HEADERを追加 |
mail.log | mail()のログ設定 |
user_ini.cache_ttl | ini設定のキャッシュ時間(デフォルト:300) |
user_ini.filename | user.iniファイル名(デフォルト: .user.ini) |
mysqli.cache_size | PHPクライアント側のキャッシュスロット数(2000) |
mysqli.allow_local_infile | ロカールファイルに対するLOAD DATAの使用(デフォルト:On) |
仕様変更されたphp.ini設定
設定名 | 説明 |
short_open_tag | スクリプトから設定変更が可能になった |
open_basedir | スクリプトから設定変更が可能になった |
削除されたphp.ini設定
設定名 | 説明 |
zend.ze1_compatibility_mode | ZendEngine1との互換モード |
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ソース