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;
}
}
?>
このようなオブジェクトの呼び出しをサポートしている言語もあります。ポートする場合等には便利でしょう。

