Post on 13-Apr-2017
自己紹介内山雄司 (@y__uti)
◦ http://y-uti.hatenablog.jp/ (phpusers-ja)
仕事◦ 受託開発の会社 (株式会社ピコラボ) でプログラマをしています
興味◦ プログラミング言語処理系
◦ 機械学習
2016-05-18 社内勉強会 2
PHP のバージョンPHP の各バージョンのサポート状況
◦ http://php.net/supported-versions.php
現在の状況◦ 5.4 サポート終了済み
◦ 5.5 2016 年 7 月 10 日で終了
◦ 5.6 2018 年 12 月 31 日で終了 (5.x 系の最後なので特別に長い)
◦ 7.0 2018 年 12 月 3 日で終了
ただしディストリビュータがパッチを提供し続ける場合もある◦ 例: CentOS 7 は PHP 5.4 だが CentOS がパッチを提供し続けている
2016-05-18 社内勉強会 4
各バージョンの新機能PHP マニュアルの「付録」を参照
◦ http://php.net/manual/ja/appendices.php
PHP 7.0 の新機能◦ スカラー型宣言
◦ 戻り値の型宣言
◦ Null 合体演算子
◦ 宇宙船演算子
◦ 無名クラス
◦ Throwableインタフェース
◦ などなど
PHP 7 は「高速化」が宣伝されているが機能も結構増えている
2016-05-18 社内勉強会 5
PHP 5.4 ~ PHP 5.6昔はこういうのも書けなかった。
PHP 5.4 (2012-03-01)◦ トレイト 正直私は全く使いこなせてないけど...
◦ 配列の短縮構文 array(1, 2, 3) を [1, 2, 3] と書けるように
PHP 5.5 (2013-06-20)◦ ジェネレータ yield
◦ finally try-catch に finally を書けるように
◦ OPcache標準搭載 (言語機能じゃないけど)
PHP 5.6 (2014-08-28)◦ 可変個引数 ...$argsと書けるように
◦ 累乗演算子 **
2016-05-18 社内勉強会 7
スカラー型宣言関数の引数にスカラー型も宣言できるようになった
2016-05-18 社内勉強会 9
<?php
function int_plus(int $a, int $b){
return $a + $b;}
echo int_plus(1, 2); // 3echo int_plus(1.6, 3.7); // 4
◦ 既定の動作:宣言された型に変換される◦ 二番目の例では $a = 1, $b = 3 として関数が実行される
戻り値の型宣言関数の戻り値の型を宣言できるようになった
2016-05-18 社内勉強会 10
<?php
function int_plus($a, $b): int{
return $a + $b;}
echo int_plus(1, 2); // 3echo int_plus(1.6, 3.7); // 5
◦ 既定の動作:宣言された型に変換される◦ 二番目の例では 1.6 + 3.7 = 5.3 が intに変換されて 5 が戻される
強い型付け宣言された型と異なる場合にエラーとする
2016-05-18 社内勉強会 11
<?phpdeclare(strict_types = 1);
function int_plus(int $a, int $b){
return $a + $b;}
echo int_plus(1.6, 3.7); // Error
◦ ファイル内で有効
◦ 戻り値の型宣言に対しても有効
強い型付け(面倒な話)引数の型宣言:関数を呼び出すファイルに declare を書く
2016-05-18 社内勉強会 12
<?phpfunction int_plus(int $a, int $b){
return $a + $b;}
<?phpdeclare(strict_types = 1);
echo int_plus(1.6, 3.7); // Error
強い型付け(面倒な話)戻り値の型宣言:関数を定義するファイルに declare を書く
2016-05-18 社内勉強会 13
<?phpdeclare(strict_types = 1);
function int_plus($a, $b): int{
return $a + $b;}
<?phpecho int_plus(1.6, 3.7); // Error
Null 合体演算子issetで調べて false なら既定値を使う処理を簡単に書ける
2016-05-18 社内勉強会 14
<?php
$arr = [ 'x' => 1, 'y' => 0 ];
echo $arr['x'] ?? 9; // 1echo $arr['y'] ?? 9; // 0echo $arr['z'] ?? 9; // 9
// ?: 演算子との違い
echo $arr['x'] ?: 9; // 1echo $arr['y'] ?: 9; // 9echo $arr['z'] ?: 9; // Notice
宇宙船演算子両辺の大小関係を比較して -1, 0, 1 を返す
2016-05-18 社内勉強会 15
<?php
function cmp($a, $b){
return $a['x'] <=> $b['x'] ?: $a['y'] <=> $b['y'];}
$data = [['x' => 3, 'y' => 2],['x' => 3, 'y' => 0],['x' => 2, 'y' => 5],['x' => 2, 'y' => 7]];
usort($data, 'cmp');
無名クラスクラスを定義してその場でインスタンスを作成できる
2016-05-18 社内勉強会 16
<?php
$logger = new class implements Logger {...
};
◦ 以下はコンストラクタに引数を渡してインスタンスを生成する例
<?php
$foo = new class(10) extends SomeClass {...
};
Throwableすべての例外やエラーが実装する共通の基底インタフェース
2016-05-18 社内勉強会 17
<?php
$a = 0;
try {$a->foo(); // E_ERROR (重大な実行時エラー)
} catch (Throwable $e) { // エラーも catch される
...}
Throwable(面倒な話)例外ハンドラがエラーも補足する
2016-05-18 社内勉強会 18
<?php
function exception_handler($e){
...}set_exception_handler('exception_handler');
$a = 0;$a->foo(); // exception_handler が実行される
Throwable(面倒な話)例外ハンドラの引数は Exception とは限らない
2016-05-18 社内勉強会 19
<?php
function exception_handler(Exception $e){
...}set_exception_handler('exception_handler');
$a = 0;$a->foo(); // exception_handler で型エラー
◦ 型宣言を外す (PHP5, PHP7 兼用)
◦ Throwableに変更する (PHP7 専用)
将来の PHPの動向PHP Wiki の RFC を参照
◦ https://wiki.php.net/rfc
PHP 7.1 の新機能
◦ Allow specifying keys in list()
◦ Square bracket syntax for array destructing assignment
◦ Generalize support of negative string offsets
◦ Support class constant visibility
◦ Void return type
◦ Catching multiple exception types
◦ Null coalescing assignment operator
◦ Nullable types (2016-05-18 時点では投票中の状況)
◦ などなど
2016-05-18 社内勉強会 21
Allow specifying keys in list()list にキーを指定できるようになる
2016-05-18 社内勉強会 22
<?php
$p = ['x' => 2, 'y' => 3, 'z' => 4];
list ('x' => $x, 'y' => $y) = $p; // $x = 2, $y = 3
Square bracket syntaxfor array destructuring assignmentlist を角括弧で書けるようになる
2016-05-18 社内勉強会 23
<?php
$p = ['x' => 2, 'y' => 3, 'z' => 4];
['x' => $x, 'y' => $y] = $p; // $x = 2, $y = 3
Generalizesupport of negative string offsets文字列に負のオフセットを指定できるようになる
2016-05-18 社内勉強会 24
<?php
$s = 'Hello, world!';
echo $s[-6]; // w
◦ 負の値を指定すると末尾から数える
◦ なぜ "Generalize" ?◦ 従来より substr関数ではサポートされていた
◦ それを角括弧や他の文字列関数でも使えるようにした
Support class constant visibilityクラスの定数 (const) にアクセス権を指定できるようになる
2016-05-18 社内勉強会 25
<?php
class MyClass {public const Foo = 1; // defaultprotected const Bar = 2;private const Baz = 3;
}
Void return type関数の戻り値の型宣言に void を指定できるようになる
2016-05-18 社内勉強会 26
<?php
function hello() : void{
echo "Hello, world!¥n";return 1; // error
}
hello();
◦ 呼ばれた時にエラーになる (静的に検出されるわけではない)
Catching multiple exception types例外の catch を複数まとめて指定できるようになる
2016-05-18 社内勉強会 27
<?php
try {...
} catch (Exception1 | Exception2 | Exception3 $e) {...
}
Null coalescing assignment operatorNull 合体演算子と代入をまとめて使えるようになる
2016-05-18 社内勉強会 28
<?php
$param ??= 'default';
◦ $paramが null なら 'default' が代入される
Nullable types (in voting)関数の型宣言に null 許容型を指定できるようになる
2016-05-18 社内勉強会 29
<?php
function hello(?string $name){
$name ??= 'world';echo "Hello, $name!¥n";
}
hello('Yuji'); // Hello, Yuji!hello(null); // Hello, world!hello(); // error
◦ 2016-05-18 時点では投票中 (ですが accept されるのは確実な状況)
PHP 7.1 のタイムテーブルPHP Wiki の TODO を参照 (まだリンクされていないかも)
◦ https://wiki.php.net/todo/php71
順調に進めば 2016 年 12 月のリリース予定◦ 6 ヶ月の pre-release 期間が 6 月に始まる予定
2016-05-18 社内勉強会 30
参考情報Web 上にある日本語の説明記事 (公式サイト以外)
PHP7 で変わること (hnw氏)
◦ http://d.hatena.ne.jp/hnw/20150525
PHP7.1 の新機能 (rana_kualu氏)
◦ http://qiita.com/rana_kualu/items/476385b674d27339f911
2016-05-18 社内勉強会 31