PHP7.3.0の新機能

[PHP7.4.0](https://qiita.com/rana_kualu/items/38c9917f634bc7767f1b) / [PHP7.3.0](https://qiita.com/rana_kualu/items/48e6e4baaeb265ab9fa7) / [PHP7.3.0α1](https://qiita.com/rana_kualu/items/a7c6be77e165bca0f3fc) / [PHP7.2](https://qiita.com/rana_kualu/items/40ebed78742bfdbd1065)

先日PHP7.3.0α1がリリースされた際に[新機能を解説](https://qiita.com/rana_kualu/items/a7c6be77e165bca0f3fc)しましたが、その後も順調に開発が進み、2018/09/13に[7.3.0RC1](http://php.net/archive/2018.php#id2018-09-13-2)がリリースされました。
RCとなったので以後の機能追加はなく、デバッグが一段落したところでリリースされることになると思われます。

ということで[前回](https://qiita.com/rana_kualu/items/a7c6be77e165bca0f3fc)以降追加された機能を見てみます。


# RFC

## [array_key_first(), array_key_last()](https://wiki.php.net/rfc/array_key_first_last)

[RFCの訳](https://qiita.com/rana_kualu/items/a80ef40547496192de86)。
array_key_first/lastは賛成18反対14で受理、array_value_first/lastは賛成15反対18で却下されました。

先日ちょうど[PHPで配列の最後の値を取得する](https://qiita.com/rana_kualu/items/e780778413dba6eed422)という記事を出したのですが、そこで書いたように7.3.0α4で実装されました。
それはいいのだけど[NEWS](https://github.com/php/php-src/blob/php-7.3.0alpha4/NEWS)に載ってないのはなぜだろう。


## [Make compact function reports undefined passed variables](https://wiki.php.net/rfc/compact)

[compact](http://php.net/manual/ja/function.compact.php)関数が存在しない変数をスルーするのでエラーを出すようにしよう、という提案。
賛成32反対5で受理されました。

```php
compact('hoge');
```

7.3.0以前は何も起こりませんでしたが、今後は`Undefined variable: hoge`の[E_NOTICEが発生](https://3v4l.org/SqlrH)します。

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


## [Argon2 Password Hash Enhancements](https://wiki.php.net/rfc/argon2_password_hash_enhancements)

[password_hash](http://php.net/manual/ja/function.password-hash.php)関数のハッシュアルゴリズムにArgon2idを加えよう、という提案。
賛成17反対0で受理されました。

[Argon2](https://password-hashing.net/argon2-specs.pdf)はサーバの性能や負荷に応じて暗号強度を変えられるという、なんかすごいアルゴリズムです。
元々はArgon2dとArgon2iという2種類の実装があり、Argon2dはGPUクラッキングに強く、Argon2iはタイミング攻撃などのサイドチャネル攻撃に強いアルゴリズムです。
PHPでは7.2.0で[Argon2i](http://php.net/manual/ja/password.constants.php#constant.password-argon2i)が実装されました。

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


## [Deprecate and Remove image2wbmp()](https://wiki.php.net/rfc/image2wbmp)

[image2wbmp](http://php.net/manual/ja/function.image2wbmp.php)いらなくね？という提案。
賛成14反対0で受理されました。

実質[imagewbmp](http://php.net/manual/ja/function.imagewbmp.php)と全く同じなので、統一されることになりました。
GDはいいかげんリソースをやめてオブジェクトにしていただきたい。


## [Deprecate and Remove Case-Insensitive Constants](https://wiki.php.net/rfc/case_insensitive_constant_deprecation)

[define](http://php.net/manual/ja/function.define.php)関数の[大文字小文字を区別しないオプション](https://qiita.com/rana_kualu/items/23b10fcefb552533b067#deprecate-and-remove-case-insensitive-constants)を削除しようという提案。
賛成39反対0で受理されました。

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


## [Deprecations for PHP 7.3](https://wiki.php.net/rfc/deprecations_php_7_3)

古くから存在していた、明らかにいらないだろうという機能が削除されます。
各項目の解説は[別記事](https://qiita.com/rana_kualu/items/23b10fcefb552533b067#deprecations-for-php-73)を見てください。

`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](https://wiki.php.net/rfc/same-site-cookie)

2016年あたりに、Cookieの仕様で[SameSite](https://tools.ietf.org/html/draft-west-first-party-cookies-07)属性が追加されました。

PHPでは[setcookie](http://php.net/manual/ja/function.setcookie.php)関数でCookieを設定できるのですが、実は任意の属性を設定することができません。
SameSite属性にはこれまで非対応で、どうしてもやりたいなら[インジェクションする](https://qiita.com/tadsan/items/96db7894e285743d996b#%E5%BE%93%E6%9D%A5%E3%81%AEphp%E3%81%A7%E3%81%AE%E3%83%AF%E3%83%BC%E3%82%AF%E3%82%A2%E3%83%A9%E3%82%A6%E3%83%B3%E3%83%89)しかないという状態でした。

以上から、SameSite属性を設定可能にするRFCが提案されました。
引数を追加する仕様は賛成0反対26で却下、引数を配列にする仕様は賛成39反対0で受理されました。

```php
setcookie('hoge', 'fuga', [
    'expires' => 3600,
    'path' => '/',
    'secure' => true,
    'httponly' => true,
    'samesite' => 'Strict',
]);
```

PHP7.3.0以降は[引数を配列で渡せる](https://3v4l.org/bVCdt)ようになります。

ただまあ、別に独自の属性値を渡せるようになったわけでもなく、[予め決められた値しか渡せない](https://github.com/php/php-src/blob/php-7.3.0RC1/ext/session/session.c#L1716)のは変わらないんですけどね。
従って、もし今後Cookieに新たな属性が追加されたとしても、PHP本体が対応するまでは使うことができないということになります。
どうせなら任意の値を渡せるようにしておけばよかったんじゃないかな。


# その他

[7.3.0α1](https://qiita.com/rana_kualu/items/a7c6be77e165bca0f3fc)ではRFC以外の機能追加もいくつかありましたが、それ以降のリリースはほぼバグフィックスです。
Fixの入ってないNEWSは4つくらいしかありませんでした。

## Updated to Oniguruma 6.9.0

正規表現エンジン[鬼車](https://github.com/kkos/oniguruma)が[6.9.0](https://github.com/kkos/oniguruma/releases/tag/v6.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関数](http://php.net/manual/ja/ref.filter.php)にFILTER_SANITIZE_ADD_SLASHESが追加されました。

えっ？

削除したんじゃなくて？

まあ[FILTER_SANITIZE_MAGIC_QUOTESが存在する](http://php.net/manual/ja/filter.filters.sanitize.php)時点で今更か。
というか[実装上両者は同じ](https://github.com/php/php-src/commit/a8dce319572e6a0b2fabe60698257677013fd30f#diff-cc46c381bdd288e4090fd6dce224e686)です。
いったい何のために追加したのだ。

ちなみにFILTER_SANITIZE_MAGIC_QUOTESをDeprecatedにしようというRFCが[早くも提出](https://wiki.php.net/rfc/deprecations_php_7_4)されています。

# まとめ

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

今回新たに入った機能の中では、実用上はarray_key_lastが一番使えそうですね。
あとArgon2idは、今後password_hashのデフォルトになりそうな気がなんとなくします。