PHP5.6の新機能紹介

[PHP7.1.0α1](http://qiita.com/rana_kualu/items/3540a960ab442e57d48e) / [PHP7.1の新機能](http://qiita.com/rana_kualu/items/476385b674d27339f911) / [PHP7.0.0α1](http://qiita.com/rana_kualu/items/447995347acb2f8997a3) / [PHP5.6](http://qiita.com/rana_kualu/items/206d786a2be7942c6dc3)

いつのまにか[PHP5.6への移行ガイド](http://www.php.net/manual/ja/migration56.php)ができていたので、[新機能](http://www.php.net/manual/ja/migration56.new-features.php)を斜め読みしてみます。

#新機能

## Constant scalar expressions

オブジェクト定数に表現が使えるようになりました。

```php
<?php
	const A = 1;
	
	class HOGE{
		const B = A + 100; // 101
		const C = self::B + 10; // 111
		const D = intval(1); // Parse error: syntax error
	}
```

ただし変数/メソッド呼び出しはできない模様。
どうせならそこまで対応してほしかったところ。

## Variadic functions via ...

関数の引数に可変長引数が使えるようになりました。
これまでも可変長引数はfunc_get_args()で使えましたが、こいつは引数に明記されないからわかりにくいし、IDEにも捉えてもらえませんでした。

```php
<?php
	function hoge($arg1, $arg2, ...$args){}
	
	hoge(1, 2);          // $args = []
	hoge(1, 2, 3, 4, 5); // $args = [3, 4, 5]
```

固定の引数に入りきらない部分が、可変長引数に配列で入ってきます。
これは便利。

## Argument unpacking via ...

関数の呼び出しにも...が使えるようになりました。

```php
<?php
	function fuga(...$args){}
	
	fuga(1, [2, 3]);         // $args = [1, [2, 3]]
	fuga(1, ...[2, 3]);      // $args = [1, 2, 3]
	fuga(...[1], ...[2, 3]); // $args = [1, 2, 3]
```

配列を...付きで渡すと、引数を展開してから渡してくれます。
こちらはいったいどういうメリットがあるのかよくわかりません。

## Exponentiation via **

[累乗演算子](http://qiita.com/rana_kualu/items/1ae58ddaad393ffa9330)です。

## use function and use const

関数や定数を use 文でインポートできるようになりました。

```php
<?php
	namespace HOGE{
		const FUGA = 1;
		function foo(){return __FUNCTION__;}
	}

	namespace{
		use const HOGE\FUGA;
		use function HOGE\foo;
		
		echo FUGA;  // 1
		echo foo(); // HOGE\foo
	}
```

http://www.php.net/manual/ja/language.namespaces.faq.php#language.namespaces.faq.nofuncconstantuse
> 関数や定数は use 文でインポートできない

お、おう。

## phpdbg

デバッガとしてphpdbgが同梱されます。
ブレークポイントやステップ実行などの強力なデバッグ機能が使用可能です。
が、今のところコマンドラインツールしかないみたいなので、Eclipseのデバッグウィンドウみたいに扱えるIDEの出現が望まれるところ。
[ひとつ見つけた](http://paulslinuxbox.net/blog/linux/debugging-with-eclipse-and-phpdbg-in-linux)のですが日本語ではないのでよくわかりません。

## Default character encoding

デフォルトの文字コードがようやくUTF-8になりました。

## php://input is reusable

いまいち意味がよくわかりませんが、php://inputを何度呼び出してもメモリを食いつぶさなくなったってこと？

## Large file uploads

2ギガバイト以上のファイルをアップロードできるようになりました。
まあ普通はそんなのupload_max_filesizeで止めますが。

## GMP supports operator overloading

[GMPの演算子オーバーロード](http://qiita.com/rana_kualu/items/1ae58ddaad393ffa9330)です。

## hash_equals() for timing attack safe string comparison

hash_equals()関数のマニュアルはまだ無いようです。
[ソース](https://github.com/php/php-src/blob/68e479b94d2ee48935726dab4bcc118e75feccab/ext/hash/hash.c)を見ると、どうもふたつの文字列が同じものかを調べてる、つまり===にしか見えないのですが、いったい何の機能があるのでしょう。

どうやら[タイミング攻撃を防ぐ](http://blog.ohgaki.net/php-5-6-become-timing-safe)もののようです。

100文字のパスワードをチェックする機構があったとして、
===は「文字列の長さが違うからfalseを返す」ときと「1文字目が違うからfalseを返す」ときと「100文字目が違うからfalseを返す」ときで処理にかかる時間がほんのわずかに違います。
その時間の違いからパスワードが何文字か推定できて、何文字目が違うか推定できて、結果として全探索より遙かに少ない回数で正解パスワードまで辿り着けてしまうということらしいです。
正直そんなの可能なのか？と思えるのですが、[実際やってみた](http://tabesugi.net/video/timingattack.html)人が現れ、[情報セキュリティスペシャリストの問題](http://www.k4.dion.ne.jp/~type_f/24S_L4/24S_L4SC_08.html)にも出てくるくらいになっています。

そこでhash_equals()は、途中の文字が違っても最後まで比較を行うことで、実行にかかる時間を一定にするようにしています。
でも文字列長が違ったら即座にFALSEを返してるように見えるんだがどうだろう。

## gost-crypto hash algorithm

[RFC4357](http://tools.ietf.org/html/rfc4357#section-11.2)で定義されているGOSTというアルゴリズムに対応したということですが、GOSTが何なのかよくわかりません。

## SSL/TLS improvements

[SSLの機能](http://www.php.net/manual/ja/migration56.openssl.php)が色々追加になりました。
よくわかりませんが。

# 非推奨

ついでに[非推奨となった機能](http://www.php.net/manual/ja/migration56.deprecated.php)。

## Calls from incompatible context

インスタンス内でstaticでないメソッドをstatic呼び出しするとE_DEPRECATEDが発生します。

```php
<?php
	class A {
		public function foo() {}
	}
	class B {
		public function bar() { A::foo(); }
	}
	(new B)->bar(); // Deprecated: Non-static method A::foo() should not be called statically
	A::foo(); // Strict Standards: Non-static method A::foo() should not be called statically
```

どうして違うエラーになってるのかさっぱりだ。

## $HTTP_RAW_POST_DATA and always_populate_raw_post_data

always_populate_raw_post_dataを有効にするとE_DEPRECATEDが発生します。
かわりに php://input を使えということらしいです。



正直、これは是非とも5.6に上げなければ、というような機能はあまりないように思えます。
一番魅力的なのはphpdbgだと思いますが、これはPHP5.4以降個別に入れられたりします。
まあChangeLogにはFixedがたくさん並んでいて、完成度を高める方向に向かっていると考えるといいことなのではないでしょうか。