PHP8で削除される機能

2017/06/22に[PHP7.2.0 α2](https://secure.php.net/)が出ました。
[アップグレードガイド](https://github.com/php/php-src/blob/php-7.2.0alpha2/UPGRADING)にDeprecated Functionalityという項目がありました。

> All the deprecated functionality listed in the following will be removed in PHP 8.0.

ここに書いてあるやつはPHP8.0で削除されるぜ、とか書いてあるので見てみましょう。
基本的にPHP7.2で非推奨になった機能はPHP8.0で削除される予定です。

# PHP8.0で削除される機能

## Core

### The trace_errors ini directive has been deprecated.

そもそも`trace_errors`ってディレクティブが存在しないっぽいんだけどこれ本当に正しいのか？
[track_errors](http://php.net/manual/ja/errorfunc.configuration.php#ini.track-errors)なんじゃないのという気がしてならない。
のっけからこんな間違いとか先が思いやられる。

### The __autoload() mechanism has been deprecated

[__autoload](http://php.net/manual/ja/function.autoload.php)はもう不要です。
今や完全上位互換の[spl_autoload_register](http://php.net/manual/ja/function.spl-autoload-register.php)があるため、そちらを使いましょう。

### The (unset) cast has been deprecated

[(unset)キャスト](http://php.net/manual/ja/language.types.null.php#language.types.null.casting)は[unset()関数](http://php.net/manual/ja/function.unset.php)とは別物で、他の`(int)`や`(string)`等と同じ動作でnullにするだけのものです。
普通に`(null)`ってしておけばよかったのに、どうしてこんな名前になってたのでしょうか。

```php
	$a = 1;
	(unset)$a;
	echo $a; // 1
	unset($a);
	echo $a; // Notice: Undefined variable: a
	
```

### The create_function() function has been deprecated

[create_function](http://php.net/manual/ja/function.create-function.php)は過去の遺物です。
[クロージャ](http://php.net/manual/ja/functions.anonymous.php)を使いましょう。
というか、関数のcallable引数に渡すとき以外は普通に関数にすればいいと思うのだが。

### The each() function has been deprecated

[each](http://php.net/manual/ja/function.each.php)はforeachより10倍遅いうえ、[他の機能に邪魔](https://wiki.php.net/rfc/notice-for-non-valid-array-container#list_access)だったりといいことがないので削除されます。
foreachを使わずあえてeachを使わなければいけない場面って存在するだろうか。

## GD

### png2wbmp() and jpeg2wbmp() have been deprecated

謎のWBMP出力関数が[削除されます](http://qiita.com/rana_kualu/items/40ebed78742bfdbd1065#deprecate-png2wbmp-and-jpeg2wbmp)。
GDは関数名識別とリソース引き回しが面倒なので、オブジェクト指向で書き直してくれないかな。

## GMP

### The gmp_random() function has been deprecated

[gmp_random](http://php.net/manual/ja/function.gmp-random.php)はプラットフォームのビット数に依存して出力範囲が変わってしまうという大問題がありました。
かわりにプラットフォームに依存しない[gmp_random_bits](http://php.net/manual/ja/function.gmp-random-bits.php)か、そもそも範囲を数値で指定できる[gmp_random_range](http://php.net/manual/ja/function.gmp-random-range.php)を使いましょう。

## Intl

### INTL_IDNA_VARIANT_2003 has been deprecated

[INTL_IDNA_VARIANT_2003は](http://php.net/manual/ja/intl.constants.php#constant.intl-idna-variant-2003)は非推奨になったので、かわりに[INTL_IDNA_VARIANT_UTS46](http://php.net/manual/ja/intl.constants.php#constant.intl-idna-variant-uts46)を使いましょう。
とか言われても、そもそも[IDNA2003とかUST46](http://unicode.org/reports/tr46/#Table_IDNA_Comparisons)とかが何なのかが[さっぱりわからん](https://wiki.suikawiki.org/n/UTS%20%2346)。

## Mbstring

### The mbstring.func_overload ini directive has been deprecated

[mbstringの関数オーバーロード](http://php.net/manual/ja/mbstring.overload.php)が撤廃されます。
マルチバイト対応が必要なら、普通に[mb_strpos](http://php.net/manual/ja/function.mb-strpos.php)みたいに書きましょう。
経緯については[このあたり](http://markmail.org/message/vckycqqppwxhp2gk)のMLみたいですが、よくわかりませんでした。

## Standard

### Calling parse_str() without the result argument has been deprecated

[parse_str](http://php.net/manual/ja/function.parse-str.php)は第二引数を指定しないときは変数を現在のスコープに展開するというregister_globals機能があります。
今後は第二引数を指定しないと使えなくなります。
むしろ参照渡しをやめて普通に返り値にして欲しかった。

```php
	parse_str($query_string); // 'a=1'が$aに展開される
	parse_str($query_string, $result); // 'a=1'が$result['a']に展開される
	
	$result = parse_str($query_string); // こうしてほしかった
```

### Calling assert() with a string argument has been deprecated

[assert](http://php.net/manual/ja/function.assert.php)に文字列を渡すと`eval`していましたが、今後は式を渡すことになります。
PHP5のassertは実は[なんちゃってassert](http://qiita.com/hnw/items/c996cecf98f0dba5f4fc)だったのですが、PHP7以降ノーコストで実行できるようになり実用的になりました。


# PHP7.2で削除された機能

## Mcrypt

PHP7.1でDeprecatedになった[Mcrypt](http://php.net/manual/ja/book.mcrypt.php)が、[予告通り](http://qiita.com/rana_kualu/items/572494021917fbb93c95#deprecate-and-remove-mcrypt)削除されました。
今後は[PECL](https://pecl.php.net/package/mcrypt)行きで、一応インストールすれば今後も使うことはできる模様。


# まとめ

今からでもこれらの機能は使わないようにしておきましょう。
といっても、まともに運用してるところではほとんど残ってないような機能しかない気もするけど。