Edited at

PHP7.3.0の新機能

PHP7.4.0 / PHP7.3.0 / PHP7.3.0α1 / PHP7.2

先日PHP7.3.0α1がリリースされた際に新機能を解説しましたが、その後も順調に開発が進み、2018/09/13に7.3.0RC1がリリースされました。

RCとなったので以後の機能追加はなく、デバッグが一段落したところでリリースされることになると思われます。

ということで前回以降追加された機能を見てみます。


RFC


array_key_first(), array_key_last()

RFCの訳

array_key_first/lastは賛成18反対14で受理、array_value_first/lastは賛成15反対18で却下されました。

先日ちょうどPHPで配列の最後の値を取得するという記事を出したのですが、そこで書いたように7.3.0α4で実装されました。

それはいいのだけどNEWSに載ってないのはなぜだろう。


Make compact function reports undefined passed variables

compact関数が存在しない変数をスルーするのでエラーを出すようにしよう、という提案。

賛成32反対5で受理されました。

compact('hoge');

7.3.0以前は何も起こりませんでしたが、今後はUndefined variable: hogeE_NOTICEが発生します。

というかそもそも、compact関数を何に使えばいいのか未だによくわからない。


Argon2 Password Hash Enhancements

password_hash関数のハッシュアルゴリズムにArgon2idを加えよう、という提案。

賛成17反対0で受理されました。

Argon2はサーバの性能や負荷に応じて暗号強度を変えられるという、なんかすごいアルゴリズムです。

元々はArgon2dとArgon2iという2種類の実装があり、Argon2dはGPUクラッキングに強く、Argon2iはタイミング攻撃などのサイドチャネル攻撃に強いアルゴリズムです。

PHPでは7.2.0でArgon2iが実装されました。

その後Argon2dとArgon2iのいいとこ取りをしたArgon2idというアルゴリズムが考案されたので、今回追加になったということのようです。


Deprecate and Remove image2wbmp()

image2wbmpいらなくね?という提案。

賛成14反対0で受理されました。

実質imagewbmpと全く同じなので、統一されることになりました。

GDはいいかげんリソースをやめてオブジェクトにしていただきたい。


Deprecate and Remove Case-Insensitive Constants

define関数の大文字小文字を区別しないオプションを削除しようという提案。

賛成39反対0で受理されました。

そもそもどうしてこんなオプションが存在していたのかが疑問です。


Deprecations for PHP 7.3

古くから存在していた、明らかにいらないだろうという機能が削除されます。

各項目の解説は別記事を見てください。

Undocumented mbstring function aliasesは賛成37反対1で受理されました。

String search functions with integer needleは賛成32反対1で受理されました。

fgetss() function and string.strip_tags filterは賛成20反対4で受理されました。

Defining a free-standing assert() functionは賛成20反対7で受理されました。

FILTER_FLAG_SCHEME_REQUIRED and FILTER_FLAG_HOST_REQUIREDは賛成31反対0で受理されました。

pdo_odbc.db2_instance_name php.ini directiveは賛成29反対0で受理されました。


Same Site Cookie

2016年あたりに、Cookieの仕様でSameSite属性が追加されました。

PHPではsetcookie関数でCookieを設定できるのですが、実は任意の属性を設定することができません。

SameSite属性にはこれまで非対応で、どうしてもやりたいならインジェクションするしかないという状態でした。

以上から、SameSite属性を設定可能にするRFCが提案されました。

引数を追加する仕様は賛成0反対26で却下、引数を配列にする仕様は賛成39反対0で受理されました。

setcookie('hoge', 'fuga', [

'expires' => 3600,
'path' => '/',
'secure' => true,
'httponly' => true,
'samesite' => 'Strict',
]);

PHP7.3.0以降は引数を配列で渡せるようになります。

ただまあ、別に独自の属性値を渡せるようになったわけでもなく、予め決められた値しか渡せないのは変わらないんですけどね。

従って、もし今後Cookieに新たな属性が追加されたとしても、PHP本体が対応するまでは使うことができないということになります。

どうせなら任意の値を渡せるようにしておけばよかったんじゃないかな。


その他

7.3.0α1ではRFC以外の機能追加もいくつかありましたが、それ以降のリリースはほぼバグフィックスです。

Fixの入ってないNEWSは4つくらいしかありませんでした。


Updated to Oniguruma 6.9.0

正規表現エンジン鬼車6.9.0にバージョンアップされました。

ちなみにPHP7.2.0で鬼車6.3.0、PHP7.2.5で鬼車6.8.1、PHP7.3.0α1で鬼車6.8.2と、わりと新しいバージョンに追随しています。


Added the 'add_slashes' sanitization mode

Filter関数にFILTER_SANITIZE_ADD_SLASHESが追加されました。

えっ?

削除したんじゃなくて?

まあFILTER_SANITIZE_MAGIC_QUOTESが存在する時点で今更か。

というか実装上両者は同じです。

いったい何のために追加したのだ。

ちなみにFILTER_SANITIZE_MAGIC_QUOTESをDeprecatedにしようというRFCが早くも提出されています。


まとめ

7.3.0で主要になりそうな機能はα1で実装されきったかんじで、あとはバグフィックスで完成度を高めていく作業が中心のように見えます。

今回新たに入った機能の中では、実用上はarray_key_lastが一番使えそうですね。

あとArgon2idは、今後password_hashのデフォルトになりそうな気がなんとなくします。