PHP 5.3の新機能と変更点

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

この記事を読むのに必要な時間:およそ 5 分

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;
  }
}
?>

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

著者プロフィール

大垣靖男(おおがきやすお)

University of Denver卒。同校にてコンピュータサイエンスとビジネスを学ぶ。株式会社シーエーシーを経て,エレクトロニック・サービス・イニシアチブ有限会社を設立。
オープンソース製品は比較的古くから利用し,Linuxは0.9xのころから利用している。オープンソースシステム開発への参加はエレクトロニック・サービス・イニシアチブ設立後から。PHPプロジェクトでは,PostgreSQLモジュールのメンテナンスを担当している。

URLhttp://blog.ohgaki.net/

著書

コメント

  • Re:

    例外のサンプルコードはPHP5.3以前でも実行できます。
    PHP5.3以降で可能になったのは例外の連結です。

    http://php.net/manual/language.exceptions.php
    http://php.net/manual/exception.getprevious.php

    Commented : #1  Masaki Kagaya (2009/07/27, 14:49)

コメントの記入