## 下位互換性のない変更点

既存の PHP5 のコードのほとんどは変更なしで動作するはずですが、 以下の下位互換性のない変更点については注意しましょう。

### Windows XP および 2003 のサポートの終了

Windows XP および 2003 はサポートされなくなります。 Windows 版の PHP は、Windows Vista 以降でしか動かなくなります。

### 大文字小文字を区別しない比較がロケールに依存しなくなる

関数名やクラス名そして定数名は大文字小文字を区別しませんが、 このマッチ方法が ASCII のルールに基づいたロケールに依存しない動きに変わります。 ラテンアルファベットを通常とは異なる照合規則で使っている言語 (トルコ語やアゼルバイジャン語など) にきちんと対応するようになりました。

これは、マルチバイト文字セット (UTF-8 も含む) で非 ASCII 文字に対して大文字小文字を区別しないマッチングをしているコードで問題になるかもしれません。 ヨーロッパ諸国語のアクセント記号などがこれにあてはまります。 英語以外の非 ASCII コードベースを使っている場合は、 無意識のうちにこの振る舞いに依存してしまっていないかどうかを確かめてから PHP 5.5 を実運用環境に投入するようにしましょう。

### pack() と unpack() の変更

pack() と unpack() が、より Perl との互換性を高めるように変更されました。

- pack() が書式文字 "Z" に対応しました。この文字の挙動は "a" とまったく同じです。
- unpack() も書式文字 "Z" に対応しました。これは NULL 埋めの文字列に使うもので、以前のバージョンの "a" と同じ挙動です。 最後の NULL バイトは切り捨てます。
- unpack() で書式文字 "a" を使ったときに、 最後の NULL バイトを維持するようになりました。
- unpack() で書式文字 "A" を使ったときに、 最後の ASCII 空白文字をすべて切り捨てるようになりました。

unpack() で "a" を使っているコードで過去のバージョンとの互換性を保つには、 version_compare() を使う必要があります。 過去との互換性が崩れてしまったからです。

たとえば、このようにします。

`<?php
// 古いコード
$data = unpack('a5', $packed);
// 新しいコード
if (version_compare(PHP_VERSION, '5.5.0-dev', '>=')) {
$data = unpack('Z5', $packed);
} else {
$data = unpack('a5', $packed);
}
?>`

### self や parent そして static が、どんな場合であっても大文字小文字を区別しないようになる

PHP 5.5 より前のバージョンでは、キーワード self、 parent そして static について大文字小文字を区別した扱いになる場合がありました。 この問題は解決し、PHP 5.5 からはどんな場合であっても大文字小文字を区別しないようになります。 つまり、SELF::CONSTANT と self::CONSTANT はまったく同じ扱いになるということです。

### PHP ロゴの GUID の削除

PHP でいろいろなロゴを出すために使われていた GUID が削除されました。 それに伴って、GUID を返す関数も削除されました。削除された関数は次のとおりです。

- php_logo_guid()
- php_egg_logo_guid()
- php_real_logo_guid()
- zend_logo_guid()

### 内部的な実行方法の変更

拡張モジュールの作者が注意すべきなのは、zend_execute() 関数がオーバーライドできなくなったということです。さらに、 execute_data 構造体やそれに関連する関数、 そしてオペコードを扱うメソッドにもさまざまな変更がありました。

この変更の影響を受ける拡張モジュールはほとんどないでしょう。 しかし、Zend Engine の内部に深く食い込んだ拡張モジュールを書いている人は、 変更点に関するメモ をしっかり読んでおきましょう。