PHP 3.0 は 1 から書き直されました。これには 2.0 のパーサに比べて より堅牢で一貫性のある適切なパーサが内蔵されています。3.0 はまた、 劇的に速くなり、メモリ消費量も少なくなっています。しかしながら、 これらの改善事項のうちのいくつかは、書式と機能の両面において 互換性を欠いた変更になってしまっています。
加えて、PHP の開発者は、PHP 3.0 における書式と意味の双方をきれいに し直そうとしましたが、これも互換性を欠く要因となっています。長い目 で見れば、これらの変更はより良いものであると私たちは信じています。
この章では、あなたが PHP/FI 2.0 から PHP 3.0 へ移行する際に遭遇 するであろう非互換性と、それらへの解決策についてのガイドを提供 しようと思います。必要でない限り、新しい機能については述べられて いません。
あなたの古い PHP/FI 2.0 スクリプトを自動的に変換できる変換プログラム があります。これは PHP 3.0 ディストリビューションの convertor サブディレクトリ にあります。このプログラムは文法的な変更を捕らえるだけですので、 どちらにしてもこの章を注意深く読む必要があるでしょう。
PHP の開始と終了のタグが変わっていることに、おそらく最初に気付かれる でしょう。古い <? > 形式は、3 つの新しい 形式に置き換えられました。
if(); elseif(); else; endif; を使って if/elseif/else ステートメントを 記述するための '選択肢' については、3.0 パーサに対してかなり複雑な処理 を追加してやらないと、効率的な実装を行うことができません。このため、 文法が変更されました。
if..endif と同様に、while..endwhile の文法も変更されました。
警告 |
PHP 3.0 で古い形式の while..endwhile を使った場合は、無限ループ になってしまいます。 |
PHP/FI 2.0 では、結果の型を決めるのに左辺式を使っていました。 PHP 3.0 では、結果の型を決めるのに両辺を使うようになったので、 3.0 環境の元で 2.0 のスクリプトを実行すると、予期しない結果になる 場合があります。
以下の例を考えてみましょう。
PHP/FI 2.0 では、この例は $a の 2 つのインデックス双方を表示します。 一方、PHP 3.0 ではなにも表示されません。この理由は、PHP 2.0 では、 左側の引数が文字列なので文字列の比較が行われますが、もちろん "" は "0" とは等しくならない ためです。一方 PHP 3.0 では、文字列が数字と比較されると、(文字列 が数字に変換され、)数字による比較が行われます。0 は atoi("") で比較され、さらに変数リスト の方も 0 と評価され、0==0 なので、その結果ループは 1 度も実行されないということに なります。これを解決するのは簡単です。while ステートメントを以下のように変更 します。
PHP 3.0 のエラーメッセージは、2.0 よりも通常の場合正確になりました。 しかし、もはやソースコードのうちエラー原因となった部分は表示されません。 そのかわり、エラーの原因となったファイル名と行番号が表示されるので、 驚くかもしれません。
PHP 3.0 におけるブール評価は短絡的です。というのは、 (1 || test_me()) のような評価式があるとすると、関数 test_me() は実行されないということです。これは、 1 を評価した後は、最終的な評価結果を変えることは できないと分かっているからです。
これは互換性の問題としては些細なことかもしれませんが、思わぬ副作用 があるかもしれません。
ほとんどの内部関数が書き直されたのに伴い、PHP/FI 2.0 では成功時に 0 、失敗時に -1 を返していたのが、それぞれ TRUE と FALSE を返す ように変更されました。この新しい振る舞いにより、 $fp = fopen("/your/file") だとか fail("darn!"); のような より論理的なコードを書く事ができるようになりました。PHP/FI 2.0 には、関数がその実行に失敗した時に何を返すべきかという明瞭な ルールがなかったので、そのようなスクリプトのほとんどは、2.0 から 3.0 のコンバータを使った後に、手作業でチェックしなければならないと 思います。
PHP 3.0 の Apache モジュールは、もはや バージョン 1.2 以前の Apache をサポートしません。Apache 1.2 以降が必要となります。
PHP/FI 2.0 では、実装面に起因する副作用として、$foo[0] が $foo と同じ値になるということ がありました。これは PHP 3.0 では等しくなくなりました。
$array[] で配列を読み込む機能は、もはや サポートされません。
すなわち、$data = $array[] といったループで 配列の中身を取り出すことはできないということです。この代わりに current() と next() を 使って下さい。
また、$array1[] = $array2 では $array2 の値を $array1 に追加すること にはならず、$array1 の最後のエントリに $array2 を追加することになってしまいます。 多次元配列のサポートを参照してください。
"+" は、もはや文字列の連結演算子にはならず、 その代わりにその引数を数値に変換して数値の加算を行ってしまいます。 "." を使用してください。