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月リリース予定です。