PHPの次期バージョン5.3.0のRelease Candidate 1が[PHP-QAT: Quality Assurance Team]にて公開されましたので、早速作業用のMacBookでビルドしてみました。とりあえずコマンドラインでの動作・検証が目的なのでSAPIモジュールはCGIのままで。
$ wget http://downloads.php.net/johannes/php-5.3.0RC1.tar.bz2
$ tar xvf php-5.3.0RC1.tar.bz2
$ cd php-5.3.0RC1
$ ./configure --prefix=/Users/ogura/apps/php-5.3.0RC1
--enable-mbstring
--with-gd
--with-jpeg-dir=/opt/local
--with-png-dir=/opt/local
--with-xpm-dir=/opt/local
--with-freetype-dir=/opt/local
--with-iconv=/opt/local
--with-zlib-dir=/opt/local
--with-pgsql=/usr/local/postgresql/current
--with-pdo-pgsql=/opt/local/lib/postgresql83
--with-pdo-sqlite=/opt/local
--with-xsl=/opt/local
--enable-sqlite-utf8
--enable-zend-multibyte
$ make
$ make test
=====================================================================
TEST RESULT SUMMARY
---------------------------------------------------------------------
Exts skipped : 45
Exts tested : 33
---------------------------------------------------------------------
Number of tests : 9699 7298
Tests skipped : 2401 ( 24.8%) --------
Tests warned : 5 ( 0.1%) ( 0.1%)
Tests failed : 151 ( 1.6%) ( 2.1%)
Expected fail : 5 ( 0.1%) ( 0.1%)
Tests passed : 7137 ( 73.6%) ( 97.8%)
---------------------------------------------------------------------
Time taken : 663 seconds
=====================================================================
$ make install
$ ~/apps/php-5.3.0RC1/bin/php -v
PHP 5.3.0RC1 (cli) (built: Mar 26 2009 19:08:14)
Copyright (c) 1997-2009 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2009 Zend Technologies
とりあえずテスト、インストールまでを確認。
今後、既存のシステムのPHP 5.3への対応も必要となってくるので、とりあえずPHP 5.3のアップグレード・ノートを翻訳しておきました。今回は、やはりネームスペースのサポートが一番の目玉といえそうですが、それ以外にも色々と大きな変更があるようなので充分な検証が必要そうです。
アップグレード・ノート - PHP 5.3
予約語とクラス名
- namespaceおよびgotoは予約語となりました
- Closureは予約されたクラス名となりました (ラムダとクロージャで使用)
既存の関数に対する変更点
- 配列関数natsort()、natcasesort()、usort()、uasort()、uksort()、array_flip()およびarray_unique()は、引数としてオブジェクトを受け付けなくなりました。オブジェクトのプロパティにアクセスする必要がある場合は、初めにオブジェクトの配列にキャストしてください
- var_dump()の出力にオブジェクトのプライベートなメンバが含まれるようになりました
- セッションの開始に失敗した場合にsession_start()がFALSEを返すようになりました
- デフォルトでは、clearstatcache()はリアルパス(realpath)キャッシュをクリアしないようになりました
- ファイルシステム関数opendir()、scandir()、dir()は、引数でコンテキストが指定されなかった場合、デフォルトコンテキストを使うようになりました
- 引数を参照渡しで受け取る関数に、値渡しで引数を渡した場合の振る舞いが変更されました。これまで値渡しの引数が許容されていた部分で警告が発生するようになり、すべての参照渡し引数はNULLにセットされます。
- 次の数学関数がネイティブサポートとなりました: asinh()、acosh()、atanh()、log1p()、expm1()
- GDエクステンションにおいて、imagefilter()関数によるピクセレーション(pixelation)がサポートされました
- crypt()がBlowfishとExtended DESをサポートしました。また、crypt()の機能は100%ポータブルなものとなり、システムでアルゴリズムがサポートされていない場合にPHPに含まれる実装が使われるようになりました
- get_cfg_var()は配列形式のINIオプションを返せるようになりました
- ストリーム・ラッパーをinclude_path()から使えるようになりました
- 以下の新しいパラメータが増えました:
- clearstatcache(): clear_realpath_cache と filename
- copy(): context
- fgetcsv(): escape
- ini_get_all(): details
- nl2br(): is_xhtml
- parse_ini_file(): scanner_mode
- round(): mode
- stream_context_create(): params
- strstr(), stristr(): before_needle
既存のメソッドに対する変更点
- マジックメソッド __get()、__set()、__isset()、__unset()、__call()は常にパブリックメソッドとして定義すべきとなり、またスタティックメソッドとしての定義はできなくなりました。メソッドシグネチャは強制です
- __toString()マジックメソッドは引数を受け取れなくなりました
- 新しいマジックメソッドとして__callStatic()が追加されました
- count()とcount_elements()ハンドラの適用ルールが変更されました(カスタムPHPエクステンションに問題を発生させる可能性があります)
- SplFileInfoおよび他のディレクトリクラスにおいて末尾のスラッシュが取り除かれるようになりました
- SplFileInfo::getpathinfo()がパス名に関する情報を返すようになりました
- 新しいパラメータ:
- Exception::__construct(): previous
既存のクラスに対する変更点
- SplObjectStorageがArrayAccessをサポートしました。SplObjectStorage内のオブジェクトにキーの関連付け情報を格納することができます
推奨されなくなったもの
- Ticks: 定義(ticks=N)とregister_tick_function()はどちらもE_DEPRECATED警告を発生させます
- define_syslog_variables()は非推奨となりました
- すべてのereg関数は非推奨となりました。代わりにPCRE(`preg_*())を使ってください
非推奨ではなくなったもの
- 多くの要望により、is_a()は非推奨ではなくなりました
エクステンション
- PECLに移動しメンテナンスが続けられているもの
- fpdf
- ming
- ncurses
- もうメンテナンスされていないもの
- dbase
- fbsql
- msql
- sybase (まだPHPコアに含まれているsybase_ctを使ってください)
- 振る舞いが変わったもの
- hash: SHA-224ハッシュアルゴリズムがサポートされました
- oci8a: 永続的な接続または永続的な接続を参照する変数に対するoci_close()の呼び出しは、コミットされていないトランザクションをロールバックするようになりました。必要に応じてコミットまたはロールバックを明示的に行う必要があります。従来の挙動に戻すには、php.iniをoci8.old_oci_close semantics=Onとします
- openssl: OpenSSLダイジェスト関数および暗号関数をサポートしました。DSA、RSA、DHキーの内部的な値にアクセスすることも可能です
- session: open_basedirによる制約が適用され、許可するパスに /tmp が明示的に追加されない限りセッションファイルは/tmpに格納されなくなりました。
- 無効にできなくなったもの
- PCRE
- Reflection
- SPL
SAPIサポートの変更点
- FastCGIサポートは常に有効となり、無効にはできなくなりました。詳細はsapi/cgi/CHANGESを参照してください
- 新しいCGI SAPIオプションとして-Tが追加されました。スクリプトの実行時間を計測することができます
- CGIとFastCGIが.htaccessスタイルの、ユーザー定義php.iniファイルをサポートしました
INIディレクティブの変更点
- zend.ze1_compatibility_modeは削除されました
- 新しいユーザー初期化メカニズムと設定変数が追加されました: user_ini.filenameとuser_ini.cache_ttl
- [PATH=/opt/httpd/www.example.com/]および[HOST=www.example.com]というスペシャルセクションのサポートが追加されました。これらのセクション内のディレクティブは、ユーザー定義のINIファイルによるオーバーライドおよび実行時のオーバーライドができません
- mbstring.http_output_conv_mimetypeが追加されました。このディレクティブは、mb_output_handler()が有効となるコンテンツタイプを正規表現で指定します
- extensionディレクティブでモジュールをロードする際にフルパスが使えるようになりました
- ini-variablesがphp.iniファイルのほとんどの場所で使えるようになりました
- iniオプション配列で英数字または変数インデックスが使えるようになりました
- 実行時にopen_basedir制約を厳しくすることができるようになりました
構文の追加
- シングルクォートを使ったヒアドキュメントのようなNOWDOC: <<<'LABEL' ...
通常のヒアドキュメントはスタティック変数の初期化およびクラスメンバや定数に対して使うことができます。
static $foo = <<<LABEL
ここに変数は無い...
LABEL;
- ?:演算子が追加されました:
var_dump(0 ?: 'Hello!');
Windowsサポート
- サポートするWindowsの最低バージョンがWindows 2000となりました(Windows 98とNT4はサポート外となりました)
- PHPのWindows版バイナリはi586以降をターゲットとします。i386とi486はサポートされません
- 次の関数にWindowsサポートが追加されました: getopt()、imagecolorclosesthwb()、mcrypt_create_iv()、inet_ntop()、inet_pton()
PHP 5.3の新機能
- 新しいライブラリ
- mysqlndはPHPに同梱される新しいコアライブラリです。libmysqlを置き換えるネイティブドライバです。
- 新しいエクステンション
- fileinfo
- intl
- Phar
- SQLite3
- 新しいストリーム・ラッパー
- glob://ストリームラッパー
- pharアーカイブ用のphar://ストリームラッパー
- 新しい関数
- コア:
- gc_collect_cycles()
- gc_enabled()
- gc_enable()
- gc_disable()
- class_alias()
- get_called_class()
- get_extension_funcs()
- forward_static_call()
- forward_static_call_array()
- str_getcsv()
- quoted_printable_encode()
- lcfirst()
- Array
- array_replace()
- array_replace_recursive()
- Date
- date_add()
- date_sub()
- date_diff()
- date_parse_from_format()
- date_create_from_format()
- date_get_last_errors()
- INI
- parse_ini_string()
- GMP
- gmp_testbit()
- Hash
- hash_copy()
- JSON
- json_last_error()
- MySQLi
- mysqli_fetch_all()
- mysqli_get_connection_stats()
- mysqli_poll()
- mysqli_reap_async_query()
- OpenSSL
- openssl_random_pseudo_bytes()
- PCNTL
- pcntl_signal_dispatch()
- pcntl_sigprocmask()
- pcntl_sigwaitinfo()
- pcntl_sigtimedwait()
- PCRE
- preg_filter()
- SHM
- msg_queue_exists()
- Streams
- stream_supports_lock()
- stream_context_set_default()
- コア:
- 新しいグローバル定数
- コア
- E_DEPRECATED
- E_USER_DEPRECATED
- DIR
- NAMESPACE
- INI
- INI_SCANNER_NORMAL
- INI_SCANNER_RAW
- GD
- IMG_FILTER_PIXELATE
- JSON
- JSON_ERROR_NONE
- JSON_ERROR_DEPTH
- JSON_ERROR_STATE_MISMATCH
- JSON_ERROR_CTRL_CHAR
- JSON_ERROR_SYNTAX
- LDAP
- LDAP_OPT_NETWORK_TIMEOUT
- PCRE
- PREG_BAD_UTF8_OFFSET_ERROR
- PCNTL
- SIG_BLOCK
- SIG_UNBLOCK
- SIG_SETMASK
- SI_USER
- SI_NOINFO
- SI_KERNEL
- SI_QUEUE
- SI_TIMER
- SI_MESGQ
- SI_ASYNCIO
- SI_SIGIO
- SI_TKILL
- CLD_EXITED
- CLD_KILLED
- CLD_DUMPED
- CLD_TRAPPED
- CLD_STOPPED
- CLD_CONTINUED
- TRAP_BRKPT
- TRAP_TRACE
- POLL_IN
- POLL_OUT
- POLL_MSG
- POLL_ERR
- POLL_PRI
- POLL_HUP
- ILL_ILLOPC
- ILL_ILLOPN
- ILL_ILLADR
- ILL_ILLTRP
- ILL_PRVOPC
- ILL_PRVREG
- ILL_COPROC
- ILL_BADSTK
- FPE_INTDIV
- FPE_INTOVF
- FPE_FLTDIV
- FPE_FLTOVF
- FPE_FLTUND
- FPE_FLTRES
- FPE_FLTINV
- FPE_FLTSUB
- SEGV_MAPERR
- SEGV_ACCERR
- BUS_ADRALN
- BUS_ADRERR
- BUS_OBJERR
- コア
- 新しいクラス
- Date
- DateInterval
- DatePeriod
- Phar
- Phar
- PharData
- PharFileInfo
- PharException
- SPL
- SplDoublyLinkedList
- SplStack
- SplQueue
- SplHeap
- SplMinHeap
- SplMaxHeap
- SplPriorityQueue
- SplFixedArray
- FilesystemIterator
- GlobIterator
- RecursiveTreeIterator
- MultipleIterator
- Date
- 新しいメソッド
- Date
- DateTime::diff()
- DateTime::add()
- DateTime::sub()
- DateTime::createFromFormat()
- DateTime::getLastErrors()
- PDO_Firebird
- PDO::setAttribute()
- Reflection
- ReflectionProperty::setAccessible()
- XSL
- XSLTProcessor::setProfiling()
- Date
- 新しいクラス定数
- PDO_Firebird
- PDO::FB_ATTR_DATE_FORMAT
- PDO::FB_ATTR_TIME_FORMAT
- PDO::FB_ATTR_TIMESTAMP_FORMAT
- PDO_Firebird