2013-01-25
?
PHP 5.4 は 4 か月前にリリースされましたが、PHP の次のバージョンには少し早いように思えますが、著者はまだ PHP5.5 がもたらす新機能を明らかにしたいと考えています。注意: PHP5.5 はまだ開発の初期段階にあるため、最終結果がどうなるかは誰にもわかりません。著者がここで語ることはすべて単なる提案にすぎません。とはいえ、以下に挙げる新機能のすべてが必ずしも PHP5.5 に含まれるわけではありません。
だから、あまり興奮しないでください:)
新機能と提案のリストは非常に多く、重要度順に並べられていません。すべてを読みたくない場合は、私が個人的に最も楽しみにしている 4 つの機能を以下に示します:
単純なパスワード ハッシュ API、スカラー型ヒント、ゲッターとセッター、ジェネレーター
それでは、PHP5.5 にどのような新機能が追加されるかを見てみましょう:
-
1. 下位互換性の廃止 まず、
の 2 つの変更があります。1. Windows XP および 2003 のサポートを放棄する: HP5.5 は Windows XP および 2003 をサポートしなくなります。これらのシステムは 10 年前のものであるため、PHP はサポートを提供しなくなります。
2. e 修飾子を非推奨にする: e 修飾子は、単に単純な文字列置換を行うのではなく、preg_replace 関数を使用して置換文字列を PHP コードとして評価することを示します。当然のことながら、この動作によりセキュリティ問題が次々と発生します。これが、PHP5.5 でこの修飾子を使用すると非推奨の警告がスローされる理由です。代わりに、preg_replace_callback 関数を使用する必要があります。この変更の詳細については、RFC を参照してください。
-
2. 新しい関数とクラス
次に、計画されている新しい関数とクラスを見ていきます:
1. boolval()
PHP には、strval、intval、floatval 関数が実装されています。一貫性を保つために boolval 関数が追加されます。これは完全にブール計算またはコールバック関数として使用できます。
2. hash_pbkdf2()
PBKDF2 の正式名称は「Password-Based Key Derivation Function 2」で、その名の通り、パスワードから暗号鍵を導出するアルゴリズムです。これには、パスワードのハッシュ化にも使用できる暗号化アルゴリズムが必要です。より詳細な説明と使用例については、RFC を参照してください。
3. intl 拡張子
intl 拡張子には多くの改良が加えられる予定です。たとえば、新しい IntlCalendar、IntlGregorianCalendar、IntlTimeZone、IntlBreakIterator、IntlRuleBasedBreakIterator、IntlCodePointBreakIterator クラスが追加されます。以前は、intl に関する拡張機能がこれほどたくさんあるとは知りませんでした。さらに詳しく知りたい場合は、最新の発表にアクセスして Calendar と BreakIterator を探すことをお勧めします。
4. array_column()
次のように動作する array_column (または array_pluck) 関数を追加するという提案があります。
$userNames = array_column($users, 'name');と同じです
$userNames = []; -
3. 言語の変更
ここからは本当に楽しい内容です。新しい言語機能と拡張機能です。
1. 定数参照;
}2. empty() 関数 (および他の式) を呼び出して連携させます
現在、empty() 言語構造は変数内でのみ使用でき、他の式では使用できません。 empty($this->getFriends()) のような特定のコードでは、エラーがスローされます。 PHP5.5以降、これは有効なコードになります。詳細については、RFC を参照してください。
? 3. 完全なカテゴリ名を取得します
PHP5.3では、名前空間エイリアスクラスと名前空間短縮版の機能が導入されています。ただし、これは文字列クラス名には当てはまりません:
SomeDeeplyNestedNamespaceFooBar を使用します;
// これはグローバル `FooBar` クラスを使用しようとするため、機能しません
$reflection = new ReflectionClass('FooBar');
この問題を解決するには、クラスの完全なカテゴリ名を返す新しい FooBar::class 構文を使用します。
SomeDeeplyNestedNamespaceFooBar を使用します;
// これは、FooBar::class が "Some\Deeply\Nested\Namespace\FooBar" に解決されるため機能します
$reflection = new ReflectionClass(FooBar::class);
その他の例については、RFC を参照してください。
4.パラメータジャンプ
複数のオプションのパラメーターを受け入れる関数がある場合、現在のところ、最後のパラメーターだけを変更し、他のすべてのパラメーターをデフォルト値のままにする方法はありません。
次のような関数がある場合の RFC の例:
関数 create_query($where, $order_by, $join_type='', $execute = false, $report_errors = true) { ... }
では、他の 2 つはデフォルト値のまま、$report_errors=false を設定する方法はありますか。パラメータのジャンプの問題を解決するには:
create_query("deleted=0", "name", デフォルト, デフォルト, false);
私は個人的にこの提案が特に好きではありません。私の目から見ると、コードにはこの機能が必要ですが、設計が不十分なだけです。関数には 12 個のオプションのパラメーターを含めることはできません。
5. スカラー型プロンプト
スカラー型ヒントは当初 5.4 に導入される予定でしたが、コンセンサスが得られなかったため導入されませんでした。スカラー型ヒントが PHP に組み込まれていない理由の詳細については、「スカラー型ヒントは思っているよりも難しい」を参照してください。
PHP5.5 に関しては、スカラー型ヒントに関する議論が再び登場しましたが、これはかなり良い提案だと思います。
入力値で型を指定する必要があります。例: 123、123.0、「123」はすべて有効な int パラメーター入力ですが、「hello world」は有効ではありません。これは内部関数の動作と一致しています。
関数 foo(int $i) { ... }
foo(1) // $i = 1
foo(1.0) // $i = 1
foo("1") // $i = 1
;foo("1abc"); // まだ明確ではありませんが、おそらく $i = 1 になると思われます
foo(1.5); // まだ明確ではありませんが、おそらく $i = 1 になると思われます
foo([]) // エラー
foo("abc") // エラー
ゲッターとセッター
これらの getXYZ() メソッドと setXYZ($value) メソッドを書くのが好きではなかったのであれば、これは最も歓迎すべき変更です。プロパティの設定/読み取りを定義する新しい構文を追加することが提案されました:
クラス TimePeriod {
パブリック $秒;
公開 $hours {
get { return $this->秒 / 3600; }
set { $this->秒 = $value * 3600 }
}
}
$timePeriod = 新しい TimePeriod;
$timePeriod->時間 = 10;
var_dump($timePeriod->秒) // int(36000)
var_dump($timePeriod->hours) // int(10)
;もちろん、読み取り専用属性など、さらに多くの機能があります。さらに詳しく知りたい場合は、RFC を参照してください。
6. ジェネレーター
現在、カスタム イテレータの実装には多くの定型コードが必要なため、カスタム イテレータはほとんど使用されません。ジェネレーターはこの問題を解決し、イテレーターを作成するための単純な定型コードを提供します。
たとえば、範囲関数を反復子として定義できます。
関数 *xrange($start, $end, $step = 1) {
for ($i = $start; $i
$i を生成します;
}
}
foreach (xrange(10, 20) as $i) {
// ...
}
上記の xrange 関数は組み込み関数と同じ動作をしますが、配列のすべての値を返すのではなく、反復子によって動的に生成された値を返すという違いが 1 つあります。
より詳細な紹介については、RFC を参照してください。
7. リスト分析とジェネレーター式
リスト内包表記は、配列に対して小規模な操作を実行する簡単な方法を提供します。
$firstNames = [foreach ($users as $user) yield $user->firstName];
上記のリストの解析は、次のコードと同等です:
$firstNames = [];
foreach ($users として $user) {
$firstNames[] = $user->firstName;
}
次のように配列をフィルタリングすることもできます:
$underageUsers = [foreach ($users as $user) if ($user->age
ジェネレーター式は似ていますが、配列の代わりにイテレーター (値を動的に生成するために使用) を返します。
その他の例については、メーリング リストのお知らせをご覧ください。
結論
ご覧のとおり、PHP 5.5 には多くの優れた新機能が追加されます。ただし、著者が述べたように、PHP5.5 はまだ開発の初期段階にあるため、上記の新機能がすべて追加されるかどうかはわかりません。