Upgrade to Pro — share decks privately, control downloads, hide ads and more …

PHP7 bootcamp

Sponsored · SiteGround - Reliable hosting with speed, security, and support you can count on.

PHP7 bootcamp

PHPカンファレンス北海道の発表資料です

Avatar for HASEGAWA Tomoki

HASEGAWA Tomoki

April 16, 2016
Tweet

More Decks by HASEGAWA Tomoki

Other Decks in Technology

Transcript

  1. 長谷川智希 はせがわともき @tomzoh Web / iOSアプリ開発, サッカー観戦(日本代表 / BVB), レンタルカートレース,

    
 ビール, 電子工作, … デジタルサーカス株式会社 副団長CTO 趣味・興味
  2. 長谷川智希 はせがわともき @tomzoh Web / iOSアプリ開発, サッカー観戦(日本代表 / BVB), レンタルカートレース,

    
 ビール, 電子工作, … デジタルサーカス株式会社 副団長CTO 趣味・興味 ౦ژ͔Βདྷ·ͨ͠
  3. もくじ • PHPのいま • php7 の新機能 • 以前のバージョンからの移行 • php7

    環境の作り方 • OSSの動作状況とパフォーマンス
  4. リリースタイミングとサポート期間 5.4 2013 2014 2015 2016 2017 2018 Active Support

    Security Support 7/10 5.3 5.5 5.6 7.0 3 既にサポート終了
  5. リリースタイミングとサポート期間 5.4 2013 2014 2015 2016 2017 2018 Active Support

    Security Support 7/10 5.3 5.5 5.6 7.0 3 既にサポート終了
  6. リリースタイミングとサポート期間 5.4 2013 2014 2015 2016 2017 2018 Active Support

    Security Support 7/10 5.3 5.5 5.6 7.0 3 既にサポート終了 12/31 12/31 12/3 12/3
  7. 新機能・特徴 5.3 5.4 5.5 5.6 7.0 名前空間, クロージャ, GC 配列の短縮構文,

    トレイト, 組込Webサーバ ジェネレータ 定数やプロパティでの式表現 大幅な高速化, ?? <=> 演算子, … サポート終了 〜7/10
  8. パフォーマンス向上 / 最適化 • 実アプリで100%以上のパフォーマンス改善 • メモリ使用量の低減 • ファイルベースOPCache php7

    index.php 1x ファイルベースOPCache 共有メモリベースOPCache 10x 4x SPEEDING UP THE WEB WITH PHP7
 PHPカンファレンス 2015 / Rasmus Lerdorf
 http://talks.php.net/tokyo15
  9. Null合体演算子 ʢ/VMM߹ମԋࢉࢠ/VMMDPBMFTDJOHPQFSBUPSʣ $username = isset($_GET['user']) ? $_GET['user'] : 'nobody'; PHP5

    $username = $_GET['user'] ?? 'nobody'; php7 $username = $_GET['user'] ?? $_POST['user'] ?? 'nobody'; php7
  10. 宇宙船演算子 ʢӉ஦ધԋࢉࢠ4QBDFTIJQPQFSBUPSʣ echo 1 <=> 1; // 0 echo 1

    <=> 2; // -1 echo 2 <=> 1; // 1 php7 PHP7で宇宙船演算子を使いこなすぞ Hiraku
 http://qiita.com/Hiraku/items/62821d7d0e7af1ac211e PHP Manual usort()
 http://php.net/manual/en/function.usort.php#117659
  11. 宇宙船演算子 ʢӉ஦ધԋࢉࢠ4QBDFTIJQPQFSBUPSʣ echo 1 <=> 1; // 0 echo 1

    <=> 2; // -1 echo 2 <=> 1; // 1 php7 PHP7で宇宙船演算子を使いこなすぞ Hiraku
 http://qiita.com/Hiraku/items/62821d7d0e7af1ac211e $sampleArray = ['one', 'two', 'free', 'fore', 'five']; usort($sampleArray, function($a, $b) { return strlen($a) <=> strlen($b); }); PHP Manual usort()
 http://php.net/manual/en/function.usort.php#117659
  12. 宇宙船演算子 ʢӉ஦ધԋࢉࢠ4QBDFTIJQPQFSBUPSʣ echo 1 <=> 1; // 0 echo 1

    <=> 2; // -1 echo 2 <=> 1; // 1 php7 PHP7で宇宙船演算子を使いこなすぞ Hiraku
 http://qiita.com/Hiraku/items/62821d7d0e7af1ac211e $sampleArray = ['one', 'two', 'free', 'fore', 'five']; usort($sampleArray, function($a, $b) { return strlen($a) <=> strlen($b); }); PHP Manual usort()
 http://php.net/manual/en/function.usort.php#117659
  13. function sumOfInts(int ...$ints) { return array_sum($ints); } var_dump(sumOfInts(2, '3', 4.1,

    'aaa')); スカラー型宣言 PHP Fatal error: Uncaught TypeError: Argument 4 passed to sumOfInts() must be of the type integer, string given, called in xxx.php on line x php7
  14. function sumOfInts(int ...$ints) { return array_sum($ints); } var_dump(sumOfInts(2, '3', 4.1,

    'aaa')); declare(strict_types=1); スカラー型宣言 PHP Fatal error: Uncaught TypeError: Argument 4 passed to sumOfInts() must be of the type integer, string given, called in xxx.php on line x php7
  15. function sumOfInts(int ...$ints) { return array_sum($ints); } var_dump(sumOfInts(2, '3', 4.1,

    'aaa')); declare(strict_types=1); スカラー型宣言 PHP Fatal error: Uncaught TypeError: Argument 4 passed to sumOfInts() must be of the type integer, string given, called in xxx.php on line x php7
  16. function arraysSum(array ...$arrays): array { return array_map(function(array $array): int {

    return array_sum($array); }, $arrays); } 関数の返値型指定 php7
  17. function arraysSum(array ...$arrays): array { return array_map(function(array $array): int {

    return array_sum($array); }, $arrays); } 関数の返値型指定 php7
  18. function arraysSum(array ...$arrays): array { return array_map(function(array $array): int {

    return array_sum($array); }, $arrays); } 関数の返値型指定 php7 declare(strict_types=1);
  19. 変数の取扱の変更 $foo->$bar['baz'] $foo->$bar['baz'] $foo->$bar['baz'] PHP5 php7 ① ② ② ①

    プロパティ、メソッド等のアクセスは常に左から右に評価す る様になった。
  20. 変数の取扱の変更 $foo->$bar['baz']() $foo->$bar['baz']() $foo->$bar['baz']() PHP5 php7 ① ② ② ①

    プロパティ、メソッド等のアクセスは常に左から右に評価す る様になった。
  21. 変数の取扱の変更 Foo::$bar['baz']() Foo::$bar['baz']() Foo::$bar['baz']() PHP5 php7 ① ② ② ①

    プロパティ、メソッド等のアクセスは常に左から右に評価す る様になった。
  22. 変数の取扱の変更 Foo::$bar['baz']() Foo::{$bar['baz']}() {Foo::$bar}['baz']() PHP5 php7 ① ② ② ①

    プロパティ、メソッド等のアクセスは常に左から右に評価す る様になった。
  23. 変数の取扱の変更 Foo::$bar['baz']() Foo::{$bar['baz']}() {Foo::$bar}['baz']() PHP5 php7 ① ② ② ①

    プロパティ、メソッド等のアクセスは常に左から右に評価す る様になった。 ϓϩάϥϚ͕ͦͷҙࢤΛ\^Ͱ
 ද໌͢Δͷ΋ྑ͍
  24. 16進数形式文字列の取扱変更 16進数数値形式の文字列は数値とみなされなくなった。 var_dump("0x123" == "291"); var_dump(is_numeric("0x123")); var_dump("0xe" + "0x1"); var_dump(substr("foo",

    "0x1")); bool(true) bool(true) int(15) string(2) "oo" PHP5 bool(false) bool(false) int(0) Notice: A non well formed numeric value encountered in xxx.php on line x string(3) "foo" php7
  25. 16進数形式文字列の取扱変更 16進数数値形式の文字列は数値とみなされなくなった。 var_dump("0x123" == "291"); var_dump(is_numeric("0x123")); var_dump("0xe" + "0x1"); var_dump(substr("foo",

    "0x1")); bool(true) bool(true) int(15) string(2) "oo" PHP5 bool(false) bool(false) int(0) Notice: A non well formed numeric value encountered in xxx.php on line x string(3) "foo" php7 ஍ຯʹϋϚΔ͔΋
  26. 新たな予約語 クラスやインターフェイス、トレイトの名前として使えない予約語 ܹϋϚΔʂʂʂʂ bool int float string NULL TRUE FALSE

    • フレームワークでは独自にStringクラス を実装しているケースがある。 • PHP7で動作させるとFatal Error。
  27. 非推奨関数の削除 mysql_* ereg_* PHP5.5でDEPRECATED。php7 で削除。 mysqli_* / PDO を使う。 PHP5.3でDEPRECATED。php7

    で削除。 preg_* を使う。 preg_replace()͕/eΛαϙʔτ͠ͳ͘ͳ͍ͬͯΔͷͰཁ஫ҙɻ
  28. エクステンションの非互換 • php7 で内部的なデータ構造やAPIに変更 • 既存のエクステンションはコンパイルすら失敗する可能性が高い。 • 同梱エクステンションは対応済。 • GD,

    Exif, Gettext, iconv, intl, json, mbstring, mcrypt, pdo … PHP7調査(37)エクステンションの対応状況 hnw
 http://qiita.com/hnw/items/8a34bb28f2faeb72d44c
  29. php7 環境の作り方 • ubuntu, CentOS 6 / 7, Amazon Linuxともにパッケージマ

    ネジャの外部リポジトリを使うことでphp7 を利用可能。
  30. • 簡単 & 無問題 $ sudo add-apt-repository ppa:ondrej/php $ sudo

    apt-get update $ sudo apt-get install php7.0 php7.0-mysql libapache2-mod-php7.0 $ php --version PHP 7.0.5-2+deb.sury.org~trusty+1 (cli) ( NTS ) Copyright (c) 1997-2016 The PHP Group Zend Engine v3.0.0, Copyright (c) 1998-2016 Zend Technologies with Zend OPcache v7.0.6-dev, Copyright (c) 1999-2016, by Zend Technologies
  31. • 簡単 & 無問題 $ sudo yum -y install epel-release

    $ wget http://rpms.famillecollet.com/enterprise/remi-release-6.rpm $ sudo rpm -Uvh remi-release-6*.rpm $ sudo yum install --enablerepo=remi,remi-php70 php $ php --version PHP 7.0.5 (cli) (built: Apr 8 2016 17:53:24) ( NTS ) Copyright (c) 1997-2016 The PHP Group Zend Engine v3.0.0, Copyright (c) 1998-2016 Zend Technologies 
  32. • 簡単 & 無問題 $ sudo yum -y install epel-release

    $ wget http://rpms.famillecollet.com/enterprise/remi-release-7.rpm $ sudo rpm -ivh remi-release-7.rpm $ sudo yum install --enablerepo=epel,remi,remi-php70 php70 php70-php $ source /opt/remi/php70/enable $ php --version PHP 7.0.5 (cli) (built: Apr 8 2016 16:43:12) ( NTS ) Copyright (c) 1997-2016 The PHP Group Zend Engine v3.0.0, Copyright (c) 1998-2016 Zend Technologies 
  33. Amazon Linux • 簡単だけど ちょい問題 • Cent6と同じ。ただしパッケージ依存の問題で Apache 2.4 で使うのが難しい?

    $ sudo yum -y install epel-release $ wget http://rpms.famillecollet.com/enterprise/remi-release-6.rpm $ sudo rpm -Uvh remi-release-6*.rpm $ sudo yum -y install --enablerepo=remi --enablerepo=remi-php70 php $ php --version PHP 7.0.5 (cli) (built: Apr 8 2016 17:53:24) ( NTS ) Copyright (c) 1997-2016 The PHP Group Zend Engine v3.0.0, Copyright (c) 1998-2016 Zend Technologies
  34. fix in the Avalon db library diff --git a/database/model.php b/database/model.php

    index 6c5f7da..c93e726 100644 --- a/database/model.php +++ b/database/model.php @@ -397,7 +397,7 @@ public function __get($var) { $belongs_to['column'] = $var . '_id'; } $model = $belongs_to['model']; - return $this->$var = $model::find($belongs_to['foreign_key'], $this->$belongs_to['column']); + return $this->$var = $model::find($belongs_to['foreign_key'], $this->{$belongs_to['column']}); } else { $val = $this->$var;
  35. fix in the Avalon db library diff --git a/database/model.php b/database/model.php

    index 6c5f7da..c93e726 100644 --- a/database/model.php +++ b/database/model.php @@ -397,7 +397,7 @@ public function __get($var) { $belongs_to['column'] = $var . '_id'; } $model = $belongs_to['model']; - return $this->$var = $model::find($belongs_to['foreign_key'], $this->$belongs_to['column']); + return $this->$var = $model::find($belongs_to['foreign_key'], $this->{$belongs_to['column']}); } else { $val = $this->$var;
  36. Thanks @tomzoh WE ARE HIRING Drupal / Mobile App Engineer


    Digital Circus, Inc. Tokyo, Japan @tomzoh