名前空間
PHP 5.3 の最大の変更点は間違いなく名前空間です (以前に関連する PHP 名前空間に関する FAQ がありました)。これは PHP 開発者に多くのメリットをもたらし、広く批判されていた関数の名前付けの問題も解決されました。
コードがより明確になりました
5.3 より前の共通コードでは、関数名とクラス名を区別するためにカスタム プレフィックスが必要ですプレーン
テキスト
コード:
function MY_wrapper() {}
クラス MY_DB { }
定義('MY_CONN_STR', '');
MY_wrapper();
新しいMY_DB();
MY_CONN_STR;
名前空間を使用すると、コードがよりきれいに見えます。
プレーンテキスト
コード:
名前空間 MY;
関数ラッパー() {}
クラス DB { }
const CONN_STR = '';
私を私として使用してください。
ラッパー();
新しい DB();
CONN_STR;
1 つのファイルで複数の名前空間が定義されている
1 つのファイルに複数の名前空間が定義されている場合はどうすればよいでしょうか?
プレーンテキスト
コード:
名前空間 LIB;
クラス MySQL {}
クラス SQLite {}
$b = 新しい SQLite();
名前空間 LIB_EXTRA;
クラス MScrypt {}
$a = 新しい MScrypt();
var_dump(
get_class($a)、
get_class($b)
);
上記のコードの出力は次のとおりです:
PLAIN TEXT
CODE:
string(18)"LIB_EXTRA::MScrypt"
文字列(11)"LIB::SQLite"
PHP は解釈と実行のための言語であり、上記の結果は妥当です。
名前空間の優先順位
名前空間で定義された関数、クラス、および定数が優先され、次にグローバルなものが続きます。
プレーンテキスト
コード:
名前空間 foo;
関数 strlen($foo) { 戻り値 htmlentities($foo) }
echo strlen("テスト");
echo ::strlen("テスト"); // 4
echo 名前空間::strlen("テスト"); // テスト
名前空間と自動ロードの関係
autoload は、名前空間名とクラス名に基づいてクラス ファイルの場所を解析します。Autoload は、名前空間でクラス定義が見つからない場合にのみトリガーされ、名前空間で定義された __autoload は自動的に呼び出されません。
プレーンテキスト
コード:
function __autoload($var) { var_dump($var) } // LIB::foo;
"./ns.php" が必要です。
<?php
名前空間LIB;
新しい foo();
*/
ネームスペース いくつかのアクセサリ
プレーンテキスト
コード:
名前空間 real::long::pointless::verbose::ns;
__NAMESPACE__; // 現在の名前空間名を表す新しいマジック定数
クラス a{}
get_class(new a()); // 本当に::long::pointless::verbose::ns::a
use really::long::pointless::verbose::ns::a AS b;// 名前空間からクラスを参照する 注: ここでの内容は pdf Introduction to PHP 5.3 Slides から抜粋したものであり、後では繰り返しません。
パフォーマンスの向上
php 5.3 の全体的なパフォーマンスは 5 ~ 15% 向上し
、md5() は 10 ~ 15% 速くなりました。
エンジン内のスタック実装の改善
定数は読み取り専用メモリに移動されました
例外処理プロセスの改善 (簡素化、オペコードの削減)
(require/include)_改善されたら、重複したオープンを削除します
gcc4 によるバイナリ サイズと起動サイズの縮小
新しい言語機能__DIR__
5.3 より前では、現在のスクリプトのディレクトリを取得するには、関数呼び出しが必要でした
。 PLAIN TEXT
CODE:
echo dirname(__FILE__); // < PHP 5.3
5.3 では、マジック定数 __DIR__ が 1 つだけ必要です。
プレーンテキスト
コード:
echo __DIR__; // >= PHP 5.3
?:演算子 便利な ?:演算子は、2 つの値/式から null 以外の値をすばやく取得できます。
プレーンテキスト
コード:
$a = true ?: false; //
$a = false ?: // true;
$a = "" ?: 1;
$a = 0 ?: 2;
$a = 配列() ?: 配列(1);
$a = strlen("") ?: strlen("a");
__callStatic()
新しいマジック メソッド __callStatic が追加されました。その機能は __call に似ていますが、静的メソッドに対してのみ有効です。
プレーンテキスト
コード:
クラスヘルパー {
静的関数 __callStatic($name, $args) {
echo $name.'('.implode(',', $args).')';
}
}
helper::test("foo","bar"); // テスト(foo,bar);
静的メソッドを動的に呼び出します。動と静の組み合わせ。
プレーンテキスト
コード:
クラスヘルパー {
静的関数 foo() { エコー __METHOD__ }
}
$a = "ヘルパー";
$b = "フー";
$a::$b(); // ヘルパー::foo
遅延静的バインディング
どう訳していいか分からないので、原文のままの方が分かりやすいかも知れません。静的メソッドのイベント処理タイミングが以前はコンパイル時に処理されていましたが、実行時に処理されるようになりました。
PHP 5.3 より前では、次のコードは A を出力していましたが、これは私たちが望んでいることではありません。whoami メソッドはクラス B で再定義されています。当然のことと考えられているものに準拠して B を出力する必要があります。
プレーンテキスト
コード:
クラス A {
パブリック静的関数 whoami() {
エコー __CLASS__;
}
パブリック静的関数identity() {
self::whoami();
}
}
クラス B は A を拡張します {
パブリック静的関数 whoami() {
エコー __CLASS__;
}
}
B::identity(); // A <-- PHP <5.3
次のコードは、static::whoami() を使用して静的メソッドを呼び出します。 PHP 5.3 以降では、実行中に __CLASS__ が処理されるため、この例ではクラス B を正常にキャッチできます。
プレーンテキスト
コード:
クラス A {
パブリック静的関数 whoami() {
エコー __CLASS__;
}
パブリック静的関数identity() {
静的::whoami();
}
}
クラス B は A を拡張します {
パブリック静的関数 whoami() {
エコー __CLASS__;
}
}
B::identity(); // B <-->= PHP 5.3
mysqlnd
mysqlnd が PHP 5.3 のデフォルトの mysql ドライバーになったことを確認してください
以前に導入された PHP 5.3 の新機能
を使用できます
。これらはすべて開発者にとって便利です。これは、Web ホスティングプロバイダーが非常に好む機能です。
強化されたiniファイルのサポート
CGI/FastCGI は、.htaccess と同様の INI 設定をサポートしています。ini のファイル名は php.ini の設定によって異なりますが、[PATH=/var/www/domain.com]、[HOST=www] になります。 .domain.com] セクションの設定はユーザーが変更できません。
強化されたエラー処理
変数と定数は ini ファイルで定義でき、プログラム内で直接呼び出すことができます。
ini ファイルの例を添付します。
プレーンテキスト
コード:
#ユーザー定義の php.ini ファイル名 (.htaccess) デフォルトは「.user.ini」です。
user_ini.filename=".user.ini"
#この機能を無効にする場合は、null 値に設定します。
user_ini.ファイル名=
#ユーザー定義のphp.iniファイルのTTL長(存続期間)、単位は秒で、キャッシュの有効期限として理解しています。デフォルトは300秒です
user_ini.cache_ttl=300
[PATH=/var/www/domain.com]
変数の順序 = GPC
セーフモード =1
[私の変数]
somevar = "1234"
anothervar = ${somevar}; anothervar == somevar
[ini 配列]
foo[バー]=1
foo[123]=2
foo[]=3