忍者ブログ
[PR]
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。



2017/05/27 13:23 |
PHP5.6の新機能
いつのまにかPHP5.6への移行ガイドができていたので、新機能を斜め読みしてみます。

■ Constant scalar expressions

オブジェクト定数に表現が使えるようになりました。
<?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
	function hoge($arg1, $arg2, ...$args){}
	
	hoge(1, 2);          // $args = []
	hoge(1, 2, 3, 4, 5); // $args = [3, 4, 5]
固定の引数に入りきらない部分が、可変長引数に配列で入ってきます。
これは便利。

■ Argument unpacking via ...

関数の呼び出しにも...が使えるようになりました。
<?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 **

累乗演算子です。

■ use function and use const

関数や定数を use 文でインポートできるようになりました。
<?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の出現が望まれるところ。
ひとつ見つけたのですが日本語ではないのでよくわかりません。

■ Default character encoding

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

■ php://input is reusable

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

■ Large file uploads

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

■ GMP supports operator overloading

GMPの演算子オーバーロードです。

■ hash_equals() for timing attack safe string comparison

hash_equals()関数のマニュアルはまだ無いようです。
ソースを見ると、どうもふたつの文字列が同じものかを調べてる、つまり===にしか見えないのですが、いったい何の機能があるのでしょう。

どうやらタイミング攻撃を防ぐもののようです。

100文字のパスワードをチェックする機構があったとして、
===は「文字列の長さが違うからすぐにエラーを返す」ときと「1文字目が違うからエラーを返す」ときと「100文字目が違うからエラーを返す」ときで処理にかかる時間がほんのわずかに違います。
その時間の違いからパスワードが何文字か推定できて、何文字目が違うか推定できて、結果として全探索より遙かに少ない回数で正解パスワードまで辿り着けてしまうということらしいです。
正直そんなの可能なのか?と思えるのですが、実際やってみた人が現れ、情報セキュリティスペシャリストの問題にも出てくるくらいになっています。

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

■ gost-crypto hash algorithm

RFC4357で定義されているGOSTというアルゴリズムに対応したということですが、GOSTが何なのかよくわかりません。

■ SSL/TLS improvements

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


ついでに廃止となった機能

■ Calls from incompatible context

インスタンス内でstaticでないメソッドをstatic呼び出しするとE_DEPRECATEDが発生します。
<?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がたくさん並んでいて、完成度を高める方向に向かっていると考えるといいことなのではないでしょうか。
PR


2014/04/11 23:06 | Comments(0) | PHP

コメント

コメントを投稿する






Vodafone絵文字 i-mode絵文字 Ezweb絵文字 (絵文字)



<<買ったものリスト 2014/04/13 | HOME | PHP5.6.0 「第17回オフラインリアルタイムどう書くの問題」をPHPで解く>>
忍者ブログ[PR]