PHP5.5の新機能とphp5.4との違いのまとめ
ここで、PHP5.5 の考えられる新機能を見てみましょう:
e 修飾子は、単に単純な文字列置換を行うのではなく、置換文字列を PHP コードとして評価するように preg_replace 関数に指示します。当然のことながら、この動作によりセキュリティ問題が次々と発生します。これが、PHP5.5 でこの修飾子を使用すると非推奨の警告がスローされる理由です。代わりに、preg_replace_callback 関数を使用する必要があります。この変更の詳細については、RFC を参照してください。
boolval()
PHP には、strval、intval、および floatval 関数が実装されています。一貫性を保つために boolval 関数が追加されます。これは完全にブール計算またはコールバック関数として使用できます。
hash_pbkdf2()
PBKDF2の正式名称は「Password-Based Key Derivation Function 2」で、その名の通りパスワードから暗号鍵を導出するアルゴリズムです。これには、パスワードのハッシュ化にも使用できる暗号化アルゴリズムが必要です。より詳細な説明と使用例
array_column()
$userNames = array_column($users, 'name'); // is the same as $userNames = []; foreach ($users as $user) { $userNames[] = $user['name']; }
国際拡張子
intl 拡張子には多くの改良が加えられる予定です。たとえば、新しい IntlCalendar、IntlGregorianCalendar、IntlTimeZone、IntlBreakIterator、IntlRuleBasedBreakIterator、IntlCodePointBreakIterator クラスが追加されます。以前は、intl に関する拡張機能がこれほどたくさんあるとは知りませんでした。さらに詳しく知りたい場合は、最新のお知らせにアクセスして Calendar と BreakIterator を探すことをお勧めします。
$password = "foo"; // creating the hash $hash = password_hash($password, PASSWORD_BCRYPT); // verifying a password if (password_verify($password, $hash)) { // password correct! } else { // password wrong! }
定数参照
「定数参照」とは、配列が文字列および配列リテラルを直接操作できることを意味します。例を 2 つ挙げます:
function randomHexString($length) { $str = ''; for ($i = 0; $i < $length; ++$i) { $str .= "0123456789abcdef"[mt_rand(0, 15)]; // direct dereference of string } } function randomBool() { return [false, true][mt_rand(0, 1)]; // direct dereference of array }
この機能が実際に使用されるとは思いませんが、言語の一貫性が高まります。 RFC を参照してください。
現在、empty() 言語構造は変数内でのみ使用でき、他の式では使用できません。
empty($this->getFriends()) のような特定のコードでは、エラーがスローされます。 PHP5.5 以降、これは有効なコードになります
PHP5.3 では、名前空間エイリアスクラスと名前空間短縮版の機能が導入されています。ただし、これは文字列クラス名には当てはまりません
use Some\Deeply\Nested\Namespace\FooBar; // does not work, because this will try to use the global `FooBar` class $reflection = new ReflectionClass('FooBar'); echo FooBar::class;
この問題を解決するには、クラス
複数のオプションのパラメーターを受け入れる関数がある場合、現在のところ、最後のパラメーターだけを変更し、他のすべてのパラメーターをデフォルト値のままにする方法はありません。
次のような関数がある場合の RFC の例:
function create_query($where, $order_by, $join_type='', $execute = false, $report_errors = true) { ... }
それでは、他の 2 つはデフォルトですが、$report_errors=false を設定する方法はありますか。このパラメータのジャンプの問題を解決するために、次のことが提案されています:
create_query("deleted=0", "name", default, default, false);
個人的にはこの提案はあまり好きではありません。私の目から見ると、コードにはこの機能が必要ですが、設計が不十分なだけです。関数には 12 個のオプションのパラメーターを含めることはできません。
スカラー型ヒントは当初 5.4 に導入される予定でしたが、コンセンサスが得られなかったため導入されませんでした。スカラー型ヒントが PHP に組み込まれていない理由の詳細については、「スカラー型ヒントは思っているよりも難しい」を参照してください。
PHP5.5ではスカラー型ヒントの議論が再び出てきましたが、これはなかなか良い提案だと思います。
タイプを指定するには入力値が必要です。例: 123、123.0、「123」はすべて有効な int パラメーター入力ですが、「hello world」は有効ではありません。これは内部関数の動作と一致しています。
function foo(int $i) { ... } foo(1); // $i = 1 foo(1.0); // $i = 1 foo("1"); // $i = 1 foo("1abc"); // not yet clear, maybe $i = 1 with notice foo(1.5); // not yet clear, maybe $i = 1 with notice foo([]); // error foo("abc"); // error
これらの getXYZ() メソッドと setXYZ($value) メソッドを書くのが好きではなかったのであれば、これは最も歓迎すべき変更です。プロパティの設定/読み取りを定義する新しい構文を追加することが提案されています:
<?php class TimePeriod { public $seconds; public $hours { get { return $this->seconds / 3600; } set { $this->seconds = $value * 3600; } } } $timePeriod = new TimePeriod; $timePeriod->hours = 10; var_dump($timePeriod->seconds); // int(36000) var_dump($timePeriod->hours); // int(10)
もちろん、読み取り専用プロパティなど、さらに多くの機能があります。さらに詳しく知りたい場合は、RFC を参照してください。
カスタム イテレータの実装には多くの定型コードが必要となるため、現在、カスタム イテレータはほとんど使用されません。ジェネレーターはこの問題を解決し、イテレーターを作成するための単純な定型コードを提供します。
たとえば、範囲関数をイテレータとして定義できます。
<?php function *xrange($start, $end, $step = 1) { for ($i = $start; $i < $end; $i += $step) { yield $i; } } foreach (xrange(10, 20) as $i) { // ... }
上述xrange函数具有与内建函数相同的行为,但有一点区别:不是返回一个数组的所有值,而是返回一个迭代器动态生成的值。
列表解析提供一个简单的方法对数组进行小规模操作:
$firstNames = [foreach ($users as $user) yield $user->firstName];
上述列表解析相等于下面的代码:
$firstNames = []; foreach ($users as $user) { $firstNames[] = $user->firstName; }
也可以这样过滤数组:
$underageUsers = [foreach ($users as $user) if ($user->age < 18) yield $user];
生成器表达式也很类似,但是返回一个迭代器(用于动态生成值)而不是一个数组。
这个和java中的finally一样,经典的try ... catch ... finally 三段式异常处理。
对于“数组的数组”进行迭代,之前需要使用两个foreach,现在只需要使用foreach + list了,但是这个数组的数组中的每个数组的个数需要一样。看文档的例子一看就明白了。
$array = [ [1, 2], [3, 4], ]; foreach ($array as list($a, $b)) { echo "A: $a; B: $b\n"; }
使用opcache会提高php的性能,你可以和其他扩展一样静态编译(--enable-opcache)或者动态扩展(zend_extension)加入这个优化项。
echo array(1, 2, 3)[0];
echo [1, 2, 3][0];
echo "foobar"[2];