97
96

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

PHP7.1α1の新機能

Last updated at Posted at 2016-05-13

PHP7.1.0の新機能 / PHP7.1β1の新機能 / PHP7.1α1の新機能 / PHP7.1.0α1インストール / PHP7.0.0α1 / PHP5.6

PHP7.1に導入決定・実装完了したRFCを見てみます。

Warn about invalid strings in arithmetic

非数値文字列の数値演算でエラーが発生する。

	$x = 1 + 'a';  // Warning: A non-numeric string encountered
	$y = 1 + '1a'; // Notice: A non well formed numeric string encountered
	$z = 1 + '1';  // 大丈夫っぽい
	
	$x = (1 + (int)'a'); // 回避手段1
	$x = @(1 + 'a'); // 回避手段2

数値として解釈可能であればE_NOTICE、完全に数値でなければE_WARNINGになるみたい。
PHP使いにとってはわりかし致命的っぽいですが、$zで問題なければまあ大丈夫でしょう。

Allow specifying keys in list()

list()にキーが使えるようになる。

	// 配列
	$arr = ['hoge', 'fuga', 'piyo'];
	list(2=>$foo, 1=>$bar, 0=>$baz) = $arr;
	
	// 連想配列
	$arr = ['x'=>'xx', 'y'=>'yy', 'z'=>'zz'];
	list('y'=>$y, 'z'=>$z, 'x'=>$x) = $arr;
	
	// 不要な列
	$arr = ['foo', 'bar', 'baz'];
	list( 1=>$a ) = $arr;

$foo='piyo'、$bar='fuga'、$baz='hoge'、$x='xx'、$y='yy'、$z='zz'、$a='bar'になります。

	// foreach
	$points = [
	    ['x' => 1, 'y' => 3],
	    ['x' => 2, 'y' => 4]
	];
	foreach ($points as list('x' => $x, 'y' => $y)) {
	    echo "x=$x, y=$y";
	}

	// 変数の入れ替え
	list('foo'=>$bar, 'bar'=>$foo) = ['foo'=>$foo, 'bar'=>$bar];

foreachで多重配列を展開できたり、変数の入れ替えが可能になるみたい。

Generalize support of negative string offsets

多くの文字列関数がマイナスの引数を受け取る。

	$str = 'abcdefg';
	
	// 文字列関数
	strpos($str, 'fg', -3); // 1
	strpos($str, 'fg', strlen($str)-3); // これと同じ
	
	// 文字列添字
	$str[-2]; // f
	$str[-3] = 'h'; // $str='abcdhfg'になる

元々substrではマイナスの引数が使えましたが、使用可能な関数が拡大するみたいです。
変わったところではfile_get_contentsにも使えるようになるみたいですが、このオフセット機能って使ってる人いるんですかね。

ところで中に『Recommend using '{}' vs '[]' for string offsets』というセクションがありますが、みんなはどちら派でしょうか。
'abcdefg'[1]'abcdefg'{1}、現在は何れでもアクセス可能ですが、何れはどちらかに寄せた方がよいでしょう。

OpenSSL AEAD support

OpenSSLの認証付き暗号Authenticated Encrypt with Associated Dataに対応する。

といってもAEADがよくわからん。
実用的にはopenssl_encryptとopenssl_decryptに引数が追加されるだけみたい。
OpenSSL関数はopenssl_random_pseudo_bytesくらいしか使ったことない。

Void Return Type

返り値の型voidが追加される。

function hoge(): void {
    return null; // Fatal error: A void function must not return a value
    return; // OK。もしくはreturnを書かない。
}

Javaのvoidと同じ。
nullではなく、明示的に何も返さないことを表明したいときに指定する。
ただ$hoge=hoge();としたときに$hogeがどうなるのかは記載がない気がする。null?

Support Class Constant Visibility

クラス内constのアクセス修飾子をサポート。

class dummy{
	          const CONST1 = 1; // public
	private   const CONST2 = 2;
	protected const CONST3 = 3;
	public    const CONST4 = 4;
}

ますますdefineがいらない子に。
あと中にしれっとconst A=1,B=2;みたいな記法が載ってて、何気にPHP5.4でも動いたんだけど、こんな説明どこかにあったっけ?

ext/curl HTTP/2 Server Push Support

curlがHTTP/2に対応する。

HTTP/1.1以来16年ぶりのバージョンアップであるHTTP/2に対応。
まあPHPから呼ぶときはほとんど関係ない気はしますが。

IntlTimeZone::getWindowsID()

ICUのgetWindowsIDに対応。

といってもそもそもICUって何レベルなので、これが何なのか全くわかりません。
DateTimeZoneとかのWindows版?

Catching Multiple Exception Types

複数の例外キャッチに対応。

	// PHP7.1
	try{
		// なんかコード
	}catch(ParseError | TypeError $e){
		// ParseErrorまたはTypeErrorをcatch
	}catch(AssertionError $e){
		// AssertionErrorをcatch
	}
	
	// これまで
	try{
		// なんかコード
	}catch(ParseError $e){
		// ParseErrorをcatch
	}catch(TypeError $e){
		// TypeErrorをcatch
	}catch(AssertionError $e){
		// AssertionErrorをcatch
	}

これまでは真面目に例外処理しようとすればするほど面倒で、もういいやExceptionキャッチしとけってなりがちでしたが、その手間をだいぶ抑えることができるようになりそうです。

これと似たような話としてUnion TypesってRFCがあるのですが、こちらはさすがにどうだろう?

	function hoge(int | string $var){
		// $varはintかstring
	}

まとめ

negative string offsets、Class constant visibility modifiers 、Catching Multiple Exception Typesは間違いなく便利。
Warn about invalid strings in arithmeticは言語としては正しい方向だけどPHPとしてはどうだろう。
Allow specifying keys in list()は便利そうだけど、そもそも私はlistを全く使わないのでなんとも言えないな。

なお、PHP7.1は2016年10月リリース予定です。

97
96
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
97
96

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?