PHP4の新機能
-
オブジェクトの実装がより強力になり、PHP 3.0 であった構文上の制約が
取り除かれました。
オブジェクトのネストは、配列として任意のレベルまで可能です。
また、逆に配列のネストも可能です。
-
リファレンスがサポートされました。$foo = &$a; により、
同じ変数に関して$foo と $a という2つの変数名が定義されます。
リファレンスは配列にも同様に使用可能です。
例えば、$foo = &$a[7]; により同じ変数に関して $foo と $a[7] という
2つの変数名が定義されます。片方の値に変更を加えた場合、もう片方の値も
変更されます。
-
オブジェクトのオーバーロードがサポートされました。
この機能により、様々なオブジェクト指向ライブラリにおいて固有の機能を
使用する際にオブジェクト指向的なPHPの記述が可能となります。
現在、この機能を使用して COM モジュールが実装されいます。
こちらに 簡単な例 を示します。
-
include() および eval() は命令ではなく関数として実装されました。
これにより、これらの関数から値が返されることになります。
include() および eval() からのデフォルトの返り値は 1 です。このため、
新規にコードを作成することなく if(include()) を実行可能です。
返り値は、インクルードされたファイルまたは評価された文字列の
グローバルスコープから値を返すことにより、変更することができます。
例えば、foo.inc のグローバルスコープで 'return 7;' を実行した場合、
include("foo.inc") の値は 7 となります。
-
自動的なリソースの領域解放。
PHP 3.0 は、被参照数の積算を考慮していないという批判が
複数の人から行われてきました。
では、リソースを含むシステムの全ての値に関する被参照数の積算を完全に
サポートが追加されます。
リソースがいかなる変数からも参照されない状態になった場合、
記憶領域およびリソースを節約するために直ちに自動的に破棄されます。
この動作に関する最も分かりやすい例としては、'$result = sql_query(...);'
のようなSQLクエリーを内部に有するループが考えられます。
PHP 3.0 では、反復毎に別のSQL結果セットが記憶領域に確保され、
それらはスクリプトの実行終了時まで破棄されませんでした。
では、古い結果セットが新規の結果セットで上書きされると、
参照されなくなった古い結果セットは直ちに破棄されます。
- 論理値型。
true および false は論理値型の定数となりました。
true および false を他の値と比較する場合、その値はまず論理値に
変換された後、比較が行われます。
これにより、例えば、5==true の値は true となります。
(PHP 3.0 では true は 1 という整数の値を有する定数であったため、
5==true は 5==1 と同じとなり、この式の値は false でした。)
-
実行時の関数名の割り付け。
この名前は難しいですが、説明は簡単です。
つまり、関数を宣言する前にコールできるようになったということです!
-
ヒア・ドキュメントのサポートが追加されました。
-
foreach が追加されました。以下の2つの構文がサポートされます。
foreach(配列式 as $val) 文
foreach(配列式 as $key => $val) 文
-
真の意味での unset() の実装が行われました。
unset() された変数または要素は完全に消去されるようになり、
記録は全く残らなくなりました。
-
出力のバッファリングがサポートされました!
出力のバッファリングを開始するには ob_start() 、
バッファリングを終了し、バッファの内容を送信するには ob_end_flush()、
バッファの内容を送信せずにバッファリングを終了するには ob_end_clean() 、
出力用バッファの現在の内容を取得するには ob_get_contents()
を使用します。
ヘッダ情報 (header(), content type, cookies) はバッファリングされません。
出力のバッファリングを有効にすることにより、
BODY部の出力の有無によらずヘッダ情報を効率的に送信することができます。
-
引用符付きの文字列内で変数全体を参照。
${式} - スカラー変数の間接参照を表す
{変数} - 変数全体を表す
例えば、
$foo[5]["bar"] = "foobar";
print "{$foo[5]["bar"]}"; // "foobar" が出力されます。
-
メンバー関数内またはグローバルスコープから
他のクラスのメンバー関数をコールする機能。
これにより、例えば、子関数の中から親関数を上書きし、
子関数から親関数をコールすることができるようになります。
-
クラスに関する実行時の情報 (クラス名、親クラス、利用可能な関数)
-
構文ハイライト機能の更なる効率化。速度の大幅な向上、
信頼性の向上、よりHTMLに即したコードの生成。
-
高機能なデバッガが言語に統合されました。
(ブレークポイント、式の評価、ステップイン/オ―バー、関数コールのバックトレース等がサポートされます。)