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

PHP7 bootcamp

PHP7 bootcamp

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

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