32
最近の PHP の話 内山 雄司 (@y__uti) 2016-05-18 社内勉強会

最近の PHP の話

  • Upload
    y-uti

  • View
    1.896

  • Download
    0

Embed Size (px)

Citation preview

最近の PHPの話内山 雄司 (@y__uti)

2016-05-18 社内勉強会

自己紹介内山雄司 (@y__uti)

◦ http://y-uti.hatenablog.jp/ (phpusers-ja)

仕事◦ 受託開発の会社 (株式会社ピコラボ) でプログラマをしています

興味◦ プログラミング言語処理系

◦ 機械学習

2016-05-18 社内勉強会 2

最新の PHP 使ってますか ?

2016-05-18 社内勉強会 3

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

その前におさらい

2016-05-18 社内勉強会 6

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

PHP 7.0 (2015-12-03)

2016-05-18 社内勉強会 8

スカラー型宣言関数の引数にスカラー型も宣言できるようになった

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

2016-05-18 社内勉強会 20

将来の 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

まとめ新しい PHP を使おう!

2016-05-18 社内勉強会 32