最後のおさらい！PHP8で削除される＆動かなくなる機能 ~レガシーシステムでありそうなものピックアップ~

まえがき
----
PHP8が2020/12にリリースされる予定で、先日2020/06/25にアルファ版が公開されました。

https://twitter.com/official_php/status/1276198231714783232?s=20


PHP7.2~7.4では既に非推奨になっている機能が廃止され、エラーで止まったりするということで、今一度PHP8で動かなくなる機能を調べ、そのなかでもレガシーシステムで使われてそう・古いFWで使われてそうで万人に身近そうなものを独断でピックアップして記載したいと思います。


PHP8で削除される&動かなくなる機能
---
## PHP7.2から非推奨→廃止

### $errcontext argument of error handler
エラーハンドラのコールバック関数のシグニチャに指定できる`$errcontext`が廃止されます。
この変数にはエラーが起きたときのローカル変数の値をすべて保持しています。

が、現在はデバッガで確認するような内容で実運用では使用頻度があまりなさそうなものにこれからもこの変数を実現するために保守し続けるのは割に合わない...とのことで廃止されます。

この機能に関しては、**deprecationのワーニングスローがされていません。** もしこの引数を利用していればエラー処理がうまく作動しなくなるかもしれませんので今一度注意したほうがよいと思います。

> Proposed action: Throw deprecation notice if error handler has five or more arguments. Otherwise, do not pass the $errcontext. This prevents circumvention with func_get_args().

> Update: Due to technical issues, this does not throw a deprecation warning. It is a documentation-only deprecation.

## PHP7.3から非推奨→廃止
### String search functions with integer needle

文字列内検索に関する関数の振る舞いが一部変わります。
検索文字列が数値だった場合、falseを返していたのを、与えられた数値を文字列に変換してくれるようになります。

...今までfalseになって分岐に入っていなかった処理が実行される..いいことであるはずですが、もしかするとなにか"トラブル"にもなるかもしれません。

~PHP7.4: 

```PHP
$str = "There are 10 apples";
var_dump(strpos($str, "10")); // int(10)
var_dump(strpos($str, 10));   // bool(false)
```
PHP8: 

```PHP
$str = "There are 10 apples";
var_dump(strpos($str, "10")); // int(10)
var_dump(strpos($str, 10));   // int(10)
```

[こちら](https://wiki.php.net/rfc/deprecations_php_7_3)からそのままソースを引用

## PHP7.4から非推奨→廃止

### The 'real' type

type`float`のエイリアスとして`double`と`real`が存在するのですが、ほぼ`real`が利用されていないため廃止されます。(既に`settype($type)`関数には'real'と入れても効果がないようになっているとのこと)
  
お金の計算などを行うドメインを扱うシステムでは利用されているかもしれません。

公式の対処法では、単に'real'となっている箇所を'float'に置き換えれば同じふるまいになるそうなのでそこまで難しくはなさそうです。


### array_key_exists() with objects

関数名の通り、配列を渡すための関数ですが、オブジェクトを渡しても問題ないように**見えています**。オブジェクトのプロパティが存在するかは別関数があるのでそちらに差し替えるようにする必要があります。

> 過去との互換性を保つため、key が仮に array で指定したオブジェクトのプロパティであっても array_key_exists() は TRUE を返します。 しかし、この挙動に頼ってはいけません。 array にはオブジェクトではなく配列を渡すようにしましょう。
> オブジェクトのプロパティが存在するかどうかを調べるには、 property_exists() を使いましょう。
https://www.php.net/manual/ja/function.array-key-exists.php


### mb_strrpos() with encoding as 3rd argument

公式ドキュメントにそのままのっていました。現在は`encoding`は第4引数になっているのですが、移行時間を設けていままで第3引数でも通るようになっていました。が、ついにPHP8で削除されます。

> 注意: encoding パラメータは、 PHP 5.2.0 以降は三番目のパラメータではなく四番目のパラメータに変わりました。 過去との互換性を保つために encoding を三番目の引数で指定することもできますが、これは推奨されません。 将来は削除される予定です。
https://www.php.net/manual/ja/function.mb-strrpos.php


### implode() parameter order mix
公式ドキュメントに注意書きの非推奨文言がありました。ついに歴史に終止符を打つようです。

> 注意:
implode()は、歴史的な理由により、引数をどちら の順番でも受けつけることが可能です。しかし、 explode() との統一性の観点からは、 ドキュメントに記述された引数の順番を使用しないことは推奨されません。
https://www.php.net/manual/ja/function.implode.php

以下のシグニチャに書き換える必要があります。

```PHP
implode ( string $glue , array $pieces ) : string
implode ( array $pieces ) : string
```



所感
---
記載したもの以外にも非推奨コマンドはあるのと、業務ドメインによってはささるようなメソッドもあったのでいまいちど確認したほうがいいなと感じました。PHPの、コミュニティとともに変化していくのが楽しいと思いつつ、実システムの考慮はやや大変だなと思いつつ。。これからのPHP8を楽しみに待ちたいです。

https://wiki.php.net/rfc/deprecations_php_7_2
https://wiki.php.net/rfc/deprecations_php_7_3
https://wiki.php.net/rfc/deprecations_php_7_4