SlideShare a Scribd company logo
PHPの今とこれから2020
PHP Conference Tokyo 2020
December 12, 2020
廣川 類 (日本PHPユーザ会)
1
自己紹介:ひろかわ
 PHPのホビーユーザ(1996~)
 PHPマニュアルの日本語化
 マルチバイト化:mbstringエクステンション
 PHPカンファレンス皆勤中!
 PHP関連書籍:
 PHP徹底攻略
 初めてのPHP(監訳)
2
PHPとは?
 PHPは主にWebアプリケーションに使用されるスクリプト言語
 1995年の誕生以来、Webと共に成長、進化
 現場の課題を簡単に解決してくれる便利なツールです
引用: W3Techs.com, 2020/10/1
63.6%5.0%
3.7%
2.5%
2.5%
22.7%
CMS シェア WordPress
Shopify
Joomla
Wix
Drupal
others
3
78.9%
9.4%
4.2%3.3%4.2%
PHP
ASP.NET
Ruby
Java
Other
サーバサイド言語のシェア
PHPの開発体制
Rasmus Lerdorf
Andi Gutmans
Zeev Suraski
Marcus Boerger
開発アカウント:約1939名(15名)
コア:約150名(5名)
PHP Group:10名
Nikita Popov
Derick Rethans
Gabriel Caruso
5
PHP 1 PHP 2 PHP 3 PHP 4 PHP 5 PHP 7 PHP 8
0
200,000
400,000
600,000
800,000
1,000,000
1,200,000
1,400,000
総ステップ数
Python 3 Ruby 2
0
200,000
400,000
600,000
800,000
1,000,000
1,200,000
総ステップ数
 パーソナルツールからプラットフォームへ
 大衆的ツール(Disりの対象)から安全で実用的な高性能ツールへ
1. 言語仕様:PHP 5.3/5.4で現代的なスクリプト言語に
2. 性能:PHP 5で高速化,PHP 7で最速に
3. セキュリティ:PHP 5でCoverity Scan適用
2015/122004/72000/51998/61997/111995/6
総ステップ数(.cファイル)
総ステップ数(.cファイル)
PHPの歩み
2015/12 2020/11
6
20年で速度が50倍に!
(ほぼ)同じスクリプトが動く!
PHPの歩み
bench.php
Ryzen 5 2400G
Ubuntu 20.04
PHPの歩み
2009
7
2010 2011 2012 2013 2014 2015 2016
PHP 5.0 ‘04/7
2017 2018 2019
・名前空間
・クロージャ
・名前空間
・クロージャ
5.3
`09/6
7.07.0
5.45.4
・Traits
・高速化
・MB標準化
・Traits
・高速化
・MB標準化
`12/3 5.5
・ジェネレータ
・キャッシュ
・ジェネレータ
・キャッシュ
`13/6
5.6
・デバッガ・デバッガ
`14/8
`15/12
・大幅高速化・大幅高速化
7.17.1
`16/12
・Nullable
・複数例外キャッチ
・Nullable
・複数例外キャッチ
`17/11
7.27.2
・高速化・高速化
7.37.3
`18/12
2004 PHP 5.0 オブジェクト機能強化
2009 PHP 5.3 普通のプログラミング言語に
2015 PHP 7.0 大幅高速化
2020 2021
7.47.4
`19/11
8.08.0
`20/11/26
・JIT
・union
・JIT
・union
・PCRE2・PCRE2
・プロパティ型
・FFI
・プロパティ型
・FFI
PHP アンケート 2020
 PHPでよく使うバージョンは?
1) PHP 5.x
2) PHP 7.1-7.2
3) PHP 7.3-7.4
8
<?php
echo “Hello!”;
?>
PHPバージョン分布
引用: W3Techs.com, 2020/11/1
9.8%
16.8%
18.9%
6.9%7.2%
22.8%
4.1%
7.0%
6.4%
7.4 7.3 7.2 7.1 7.0
5.6 5.5 5.4 5.3
 PHP7ユーザ: 58% (昨年: 42%)
 PHP 5(EOL)のユーザ: 42% (昨年: 57%),PHP 7.2まで(EOL)のユーザが73%
 WordPressの推奨環境:PHP 7.4, MySQL 5.6, HTTPS
9
* https://wordpress.org/about/requirements/
PHPリリースサイクル
10
2017 2018 2019 2020 2021 2022 2023
5.6
7.0
7.1
7.2
7.3
7.4
アクティブサポート セキュリティ修正のみ
2020/12/12
 PHPのライフサイクル:3年(バグ修正:2年、セキュリティ修正のみ:1年)
 EOL以降はセキュリティ関連の修正も提供されず、非常に危険です
 PHP5、PHP 7.0/7.1/7.2 は EOLとなっています 
EOL 2018/12/31
https://wiki.php.net/rfc/releaseprocess
http://php.net/supported-versions.php
EOL 2018/12/3
EOL 2019/12/1
EOL 2020/11/30
EOL 2021/12/6
EOL 2022/11/28
PHPリリース情報
Release 7.1 7.2 7.3 7.4 変更
2019/11/28 7.4.0 PHP 7.4.0 Release, PHP 7.1 EOL
2019/12/18 7.2.26 7.3.13 7.4.1 CVE-2019-11044,11045,11046 (buffer underflow),11047,11049,11050
2020/1/23 7.2.27 7.3.14 7.4.2 CVE-2020-7060 (buffer overflow)
2020/2/20 7.2.28 7.3.15 7.4.3 CVE-2020-7061 (heap overflow),7062
2020/3/19 7.2.29 7.3.16 7.4.4 CVE-2020-7066,7065 (stack overflow)
2020/4/16 7.2.30 7.3.17 7.4.5 CVE-2020-7067
2020/5/14 7.2.31 7.3.18 7.4.6 CVE-2019-11048
2020/6/11 7.3.19 7.4.7
2020/7/9 7.2.32 7.3.20 7.4.8
2020/8/6 7.2.33 7.3.21 7.4.9 CVE-2020-7068
2020/9/3 7.3.22 7.4.10
2020/10/1 7.2.34 7.3.23 7.4.11 CVE-2020-7069, 7070 (malicious cookie)
2020/10/29 7.3.24 7.4.12
2020/11/26 PHP 8.0 Release, PHP 7.2 EOL (2020/11/30)
11
 CVE-* ⇒ 速やかな更新が必要
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
0
20
40
60
80
100
120
Total
DoS
Code Execution
Overflow
Memory corruption
SQL Injection
XSS
Directory Traversal
HTTP Response Splitting
Bypass
Gain info
Gain privileges
File inclusion
PHP脆弱性件数(CVE)と種別
www.cvedetails.com
PHP
5.6
PHP
7.0
PHP
7.1
PHP
7.2
PHP
7.3
PHP
7.4
PHP
8.0
0
1
2
3
4
5
6
7
8
$x = $f ? $f : tmp $x = $f ? $f : $a
$x = $f ?: tmp $x = $a ?: null
$x = $str[0] $x = $hash['v']
$x = $GLOBALS['v'] $x = $_GET
$x = TEST new Foo()
$x = Foo::TEST $this->f()
empty($this->x) isset($this->x)
$this->x-- $this->x++
--$this->x ++$this->x
$this->x += 2 $this->x = 0
$x = $this->x Foo::f()
self::f() empty(Foo::$x)
isset(Foo::$x) Foo::$x = 0
$x = Foo::$x empty(self::$x)
isset(self::$x) self::$x = 0
$x = self::$x int_func()
undef_func() func()
empty_loop
0
0.2
0.4
0.6
0.8
1
1.2
1.4
1.6
1.8
strcat(200000) sieve(30)
nestedloop(12) matrix(20)
heapsort(20000) hash2(500)
hash1(50000) fibo(30)
ary3(2000) ary2(50000)
ary(50000) ackermann(7)
mandel2 mandel
simpleudcall simpleucall
simplecall simple
PHP8: JIT無し
Ryzen 5 2400G, Ubuntu 20.04
13
 JIT無しの場合:やや改善
Zend/bench.php
Zend/microbench.php
0
0.05
0.1
0.15
0.2
0.25
0.3
0.35
0.4
0.45
0.5
strcat(200000)
sieve(30)
nestedloop(12)
matrix(20)
heapsort(20000)
hash2(500)
hash1(50000)
fibo(30)
ary3(2000)
ary2(50000)
ary(50000)
ackermann(7)
mandel2
mandel
simpleudcall
simpleucall
simplecall
simple
7.4
8.0
7.4
cache
8.0
cache
8.0
tracing
8.0
function
8.0
"1255"
0
0.5
1
1.5
2
2.5
$x = $f ? $f : tmp $x = $f ? $f : $a
$x = $f ?: tmp $x = $a ?: null
$x = $str[0] $x = $hash['v']
$x = $GLOBALS['v'] $x = $_GET
$x = TEST new Foo()
$x = Foo::TEST $this->f()
empty($this->x) isset($this->x)
$this->x-- $this->x++
--$this->x ++$this->x
$this->x += 2 $this->x = 0
$x = $this->x Foo::f()
self::f() empty(Foo::$x)
isset(Foo::$x) Foo::$x = 0
$x = Foo::$x empty(self::$x)
isset(self::$x) self::$x = 0
$x = self::$x int_func()
undef_func() func()
empty_loop
PHP8 JIT: より速く、快適に
Ryzen 5 2400G, Ubuntu 20.04 14
 PHP 8+JIT:実行速度が大幅改善
 実用アプリではそれほどでもない(数%)
Zend/bench.php
Zend/microbench.php
実用アプリにおけるJITの効果の例
15
 実用アプリケーションの例(WordPress)⇒実行速度はほとんど変わらない
 PHPスクリプトで重い処理を行う際の改善効果を期待
nominal opcache JIT function JIT tracing
0
10
20
30
40
50
60
PHP8.0.0RC4+WordPress 5.3.2
http://wordpress/?p=1
Requestspersecond
Ryzen 5 2400G, Ubuntu 20.04
PHP 8.0 JIT導入
 PHP 8におけるJIT
 JIT (Just-in-Time Compiler)
16
https://wiki.php.net/rfc/jit
 HHVMでJIT採用⇒PHP 5に比べて大幅高速化
 PHP 7開発時にもJIT導入を検討(LLVM)⇒見送り(代わりにエンジン高速化)
 LuaJITプロジェクト用に開発された軽量JITエンジンDynAsmを採用
 現在はx86をサポート、将来的にはARM等もサポート
zend_extension = opcache
opcache.enable = 1
opcache.jit = on
opcache.jit_buffer_size = 128M
PHP 8.0 JIT導入
17
https://wiki.php.net/rfc/jit
✔ OPCacheを拡張して実装:バイトコードの代わりにネーティブコードをキャッシュ
✔ 仮想マシン上で実行するよりも高速に実行できる
✔ ただし,ネーティブコードへの変換(JIT)に時間を要するため,時間がかかるコードのみJITを実行
コンパイル・解析
実行(Zend VM)
実行(CPU)
ネーティブコード
PHPスクリプト
バイトコードキャッシュ
コンパイル・解析
変換(JIT)
実行(CPU)
ネーティブコード
PHPスクリプト
バイトコード
キャッシュ
従来 JIT
PHP 8.0 JITオプション
 JITにすれば単純に早くなるというわけでもない⇒opcache.jitオプションで調整
 プロファイルで頻繁に使用される部分を抽出し、JITを適用:静的解析または実行時解析
 実行頻度が高い一連の処理を切り出すトレーシングJITを導入(デフォルト)
 文字列または数値(CRTO)で指定: tracingまたはon (1254),function (1205)
 CPUアーキテクチャに合わせた最適化、SIMD命令の使用
18
opcache.jit=1254
CPU固有の最適化(C) 0:オフ、1: AVX命令生成を有効化
レジスタ配置(R)
0:なし、1:ローカル線形スキャン、2: グローバル線形スキャン
JITトリガ(T)
0:スクリプトロード時、1:初回実行時、
2:初回時プロファイル、2回目にコンパイル
3:プロファイルでホットな関数を見つけてコンパイル
4:docコメントで@jitタグが指定された関数をコンパイル
5:ホットなコード(ループ)をトレース,コンパイル
最適化レベル(O)
0:JIT無効、1:JIT最小実行、2:インライン化
3:関数毎の静的型推論による最適化
4:静的型推論とコールツリーによる最適化
5:静的型推論と内部処理解析による最適化
PHP 8.0 改善/変更のポイント
1. Union型の導入
2. 属性(attribute)
3. static型戻り値指定
4. 弱いマッピング
5. ::classのオブジェクトへの適用
6. 文字列部分一致確認用関数
7. ヌルセーフ演算子
8. match式
9. mixed型
10. 名前付き引数
11. 数値文字列扱い明確化
12. コンストラクタ引数でプロパティ設定
PHP 8.0 改善/変更のポイント
20
<?php
class Test {
public int|float $x;
public function getVal() : int|float {
return $this->x;
}
}
$obj = new Test();
$obj->x = "1.23";
echo $obj->getVal(); // 1.23
 Union: 引数,戻り値の型の候補を複数指定できる
RFC: https://wiki.php.net/rfc/union_types_v2
float(1.23)
PHP 8.0 改善/変更のポイント
21
 属性(attribute): Java(annotation),Rust, Python (decorators)に類似
 ユースケース:メタデータの記述,フレームワークにおけるルーティング,JITオプションなど
<?php
#[ClassAttribute(PHP_VERSION_ID)]
class Foo
{
#[PropertyAttribute(2+3*2)]
public $x;
#[Deprecated("Use bar()"),Jit(1255)]
public function moo() {}
}
RFC: https://wiki.php.net/rfc/attributes_v2
$ref = new ReflectionClass(Foo::class);
$attr = $ref->getProperty('x')->getAttributes();
$attr = $ref->getMethod('moo')->getAttributes();
$attr = $ref->getAttributes();
$attr[0]->getName(), $attr[0]->getArguments()
PHP 8.0 改善/変更のポイント
22
 static型: 関数・クラスメソッドの戻り値に遅延静的束縛(late static binding)を
指定
<?php
class A {
  public function gen1():static { return new self; }
  public function gen2():static { return new static; }
}
class B extends A {}
$a = new A;
$b = new B;
var_dump($b->gen1()); // object(A)#3
var_dump($b->gen2()); // object(B)#3
RFC: https://wiki.php.net/rfc/static_return_type
TypeError: Return value of A::gen1() must
be of Type B, A returned
PHP 8.0 改善/変更のポイント
23
 弱いマッピング:オブジェクトがガベージコレクションの対象となることを妨げない。
<?php
$map = new WeakMap;
$obj = new stdClass;
$map[$obj] = spl_object_hash($obj);
var_dump($map);  // object(WeakMap)#1 (1)
var_dump($map[$obj]); //  $objのハッシュ値
unset($obj);
var_dump($map);  // object(WeakMap)#1 (0)
RFC: https://wiki.php.net/rfc/weak_maps
通常:元の変数を削除してもリファレンスがある場合,実体は削除されない
弱いマッピング:実体はガベージコレクションの対象となり、逆にマッピングが削除される
PHP 8.0 改善/変更のポイント
24
RFC: https://wiki.php.net/rfc/class_name_literal_on_object
 変数::class構文
 オブジェクト変数に対してクラス名を取得する:
●
従来はget_class()関数を使用
●
::class構文をオブジェクト変数にも使用可能とした
<?php
class A {}
$a = new A;
echo A::class;       // A: 従来から使用可能
echo get_class($a);  // A: 変数の場合(従来)
echo $a::class;      // A: PHP8以降
PHP 8.0 改善/変更のポイント
25
 文字列部分一致確認用関数 RFC: https://wiki.php.net/rfc/str_contains
<?php
$s="東京特許許可局";
var_dump(str_contains($s,"特許")); // bool(true)
var_dump(str_starts_with($s,"東京")); // bool(true)
var_dump(str_ends_with($s,"許可局")); // bool(true)
PHP 8.0 改善/変更のポイント
26
 ヌルセーフ演算子: nullチェックを簡便に
RFC: https://wiki.php.net/rfc/nullsafe_operator
<?php
class moo { public $d=123;}
class foo {
public function get() {
return new moo();
}
}
$b = new foo();
if ($b!==null) {
$a=$b->get();
if ($a!==null) {
$d=$a->d;
}
}
echo $d;
echo $b?->get()?->d;
PHP 8.0 改善/変更のポイント
27
 match式: switch文をより簡便
に記述できる
RFC: https://wiki.php.net/rfc/match_expression_v2
switch ($id) {
case 0:
$name = 'Taro';break;
case 1:
$name = 'Jiro';break;
case 2:
  case 3:
$name = 'Hanako';break;
default:
$name = “Anonymous”;break;
}
echo $name;
echo match($id) {0=>'Taro',1=>'Jiro',2,3=>'Hanako', default=>'Anonymous’};
PHP 8.0 改善/変更のポイント
28
 mixed型: あらゆる変数型を表す汎用の型名
 array,bool,callable,int,float,null,object,resource,string
RFC: https://wiki.php.net/rfc/mixed_type_v2
<?php
 class A {
     public mixed $bar; 
     public function foo(int $value): mixed {}
 }
 
 class B extends A {
     public mixed $bar;
     public function foo(mixed $value): int {}
 }
class A
class B
引数型:同じまたは拡大
戻り値型:同じまたは縮小
継承
リスコフ置換原理(LSP)
PHP 8.0 改善/変更のポイント
29
 名前付き引数: 引数を名前(パラメータ名: 値)で指定
●
意図が分かりやすく
●
デフォルト値をスキップ
RFC: https://wiki.php.net/rfc/named_params
array_fill(0, 100, 50);
array_fill(value:50,num:100,start_index:0);
htmlspecialchars($s,ENT_COMPAT|ENT_HTML401,’UTF-8’,false)
htmlspecialchars($s,double_encode:false)
PHP 8.0 改善/変更のポイント
30
 Constructor Property Promotion:コンストラクタでプロパティ指定が可能に
RFC: https://wiki.php.net/rfc/constructor_promotion
class Foo {
public float $x;
public float $y;
public function __construct(float $x=0.0,float $y=0.0) {
$this->x=$x; $this->y=$y;
}
}
class Foo {
public function __construct(public float $x=0.0,public float $y=0.0) {}
}
PHP 7.4
PHP 8.0
PHP 8.0 改善/変更のポイント
31
 数値の定義明確化:前後の空白を許容(互換性がない変更)
RFC: https://wiki.php.net/rfc/saner-numeric-strings
var_dump(is_numeric("123abc")); // bool(false)
var_dump(is_numeric("123 ")); // bool(false)
var_dump(is_numeric(" 123")); // bool(true)
var_dump(is_numeric(" 123 ")); // bool(false)
var_dump(is_numeric("123abc")); // bool(false)
var_dump(is_numeric("123 ")); // bool(true)
var_dump(is_numeric(" 123")); // bool(true)
var_dump(is_numeric(" 123 ")); // bool(true)
PHP 7.4
PHP 8.0
PHP 8.0 改善/変更のポイント
32
 負の添字の明確化:添字追加を連続的に(互換性がない変更)
RFC: https://wiki.php.net/rfc/negative_array_index
$a[-2]=true;
$a[]=true;
var_dump($a);
PHP 7.4
PHP 8.0
$a[-2]=true,$a[0]=true
$a[-2]=true,$a[-1]=true
PHP 8.0 改善/変更のポイント
33
 結合演算子の優先順位明確化(互換性がない変更)
RFC: https://wiki.php.net/rfc/concatenation_precedence
var_dump("3" . "5" + 7);
PHP 7.4
PHP 8.0
int(42)
string(“312”)
'.','+','-'演算子の優先順位は同じ
'+','-'演算子を優先
PHP 8.0 改善/変更のポイント
34
 エラーレベル (error_reporting)のデフォルト値変更:
E_ALL (E_NOTICE,E_DREPRECATEDを除く) ⇒ E_ALL
 display_startup_errorsがデフォルトで有効に
 @演算子は致命的なエラー出力を抑制しなくなった
 削除: each(), create_function()
 mbstringエクステンション
●
func_overload削除
●
mb_ereg_replace()の修正子’e’削除 → mb_ereg_replace_callback()
●
mb_ereg(),mb_eregi()の戻り値 int(1) → bool(true)
PHP の将来
 PHPスクリプトの用途拡大:Opcache(プリローディング)+JIT+FFIの活用
●
PHPエクステンション:C言語による記述からPHPによる記述へ(FFI)
●
計算負荷が高いアルゴリズムのPHPによる実装:機械学習,AI等 (PHP-ML, PHP-MLX)
35
入力処理(C言語)
外部API実行
PHPスクリプト
従来のエクステンション(C言語)
出力処理(C言語)
PHP出力
入力処理(PHP)
外部API実行
PHPスクリプト
FFIエクステンション(PHP)
出力処理(PHP)
PHP出力
PHPユーザ相互の情報交換およびコミュ
ニティの健全な発展
設立趣旨
•  高性能Webミドルウエアへのニーズ増大
•  オープンソースソフトウエアの発展
背景
国内PHPユーザの増加
活動内容
ドキュメント整備
セミナー/イベント
メンバー/スタッフ 国際化
Web/SNS
・PHPユーザ会員と思ったらメンバー
・運営するのも楽しいかも
日本PHPユーザ会
(2000年4月発足)
PHPカンファレンス
36
PHP勉強会
37
PHP Conference 2020 の見どころ
Tack 1 Track 2 Track 3 Track 4 Track 5(PHP8 specical) Track 6 (International)
PHPの今とこれから2020
PHP Webアプリケーション設計
入門 (GMO)
NewRelicプラットフォームを使ったオ
ブザーバビリティ入門(川口)
初心者セッション (柏岡) Laravelで運用しているサービスを
Nuxt.jsにリプレイスする (久保田)
PHP 8.0: A new version, a new era
(Gabriel Caruso)
レガシープロジェクトで,メタプログ
ラミングを使った...(弁護士ドットコム)
LaravelDB.comを使ってDB設計
スポンサー’s LT
長期運用を目指す
「Shadowverse」におけるリファ
クタ事例の紹介(Cygames)
徳丸皆伝を狙いませんか?徳丸実務
試験とPHP8上級試験の解説(PHP
技術者認定機構)
GCPとPHP
(サイトウ)
ゼロベースからLaravelを用いた
API実装オートメーション(めもり
~)
PHP8で作るJSONパーサ
(新原)
自分のやりたいことをやって超簡単に
チームのコミュニケーションを活性化
させた(Hamee)
PHP on Kubernetes
事業のスケールアウトを支える
PHPで作る分散アーキテクチャ
(竹澤)
PSRで学ぶHTTP Webアプリケー
ションの実践 (うさみ)
Webサービスをセキュアに保
つために必要な視点
Laravel x オニオンアーキテクチャ
で始めるテスト駆動開発
PHPのソースコードから理解す
るPreloadとJIT
テストピラミッドを意識したテスト
コード実装戦略
PHP8はISUCONへの扉を開く
鍵となるか
パネルセッション「ひさてるさんに
聞け」
Composer 2.0って何? どう変わる
の? 読んでみました (きんじょう)
DNS改ざん検知ツールの実
装とDNSパケットの世界(市
川)
本番でしか起きない問題に早く気
が付けるように,僕はLarabel
DuskでCIする (sogaoh)
PHP8の新機能をPHP内部
コードのテストphptから読む
(東口)
今こそ理解する,PHPの日時計算 CakePHPで学ぶDIコンテナ
(itasho)
Laravel+Lighthouseで始める低
コストなGraphQL入門
PHP8時代のWebアプリケー
ションフレームワークの話をしよ
う(中榮)
ウェブセキュリティのありがちな誤
解を解説する(徳丸)
効率的な静的解析のCI導入パター
ンを求めて (杉山)
PhpStormを使えばほとんど
コード補完されるんだってば
さ(マキ)
PHP8でWeb以外の世界の扉
を開く (sji)
Service communication re:Born
(Nick Chiu))
微妙な違いも見落とすな!ビジュアル
リグレッションテスト!(大橋)
PHPで作るオンラインカンファ
レンス向け録画システム(長
谷川)
How good are my tests?
(Stephan Hochdoerfer)
LT大会 Functional Programming in PHP
(Lochemem Michael)
38
PHPカンファレンスは1999年からPHP関連の技術を主とした技術者カンファレンスです。
例年であれば大田区蒲田にある「大田区産業プラザ PiO」にて開催を行う予定でしたが
新型コロナウイルス(COVID-19)感染症拡大防止のため、21年目で初めてのオンライン
開催となります。
オンライン開催では「YouTube Live」を利用したライブでのセッションを始め、オンラインなら
ではのコンテンツで今年のカンファレンスをお楽しみください。

More Related Content

PDF
Laravel の paginate は一体何をやっているのか
PPTX
PHP AST 徹底解説
PPTX
Docker friendly PHP / Laravel
PDF
PHP、おまえだったのか。 いつもHTTPメッセージを 運んでくれたのは。
PDF
Mavenの真実とウソ
PDF
TRICK 2022 Results
PDF
ソーシャルゲーム案件におけるDB分割のPHP実装
PDF
モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―
Laravel の paginate は一体何をやっているのか
PHP AST 徹底解説
Docker friendly PHP / Laravel
PHP、おまえだったのか。 いつもHTTPメッセージを 運んでくれたのは。
Mavenの真実とウソ
TRICK 2022 Results
ソーシャルゲーム案件におけるDB分割のPHP実装
モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―

What's hot (20)

PPTX
LINEのMySQL運用について 修正版
PPTX
設計をする上で役にたった制約について
PDF
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
PDF
PHPの今とこれから2022
PDF
なぜ人は必死でjQueryを捨てようとしているのか
PDF
入門ClojureScript
PDF
大規模ソーシャルゲーム開発から学んだPHP&MySQL実践テクニック
PPTX
SPAセキュリティ入門~PHP Conference Japan 2021
PPTX
継続的にテスト可能な設計を考える
PPTX
Docker Tokyo
PDF
PHPの今とこれから2021
PPTX
php-src の歩き方
PDF
Laravel × レイヤードアーキテクチャを実践して得られた知見と反省 / Practice of Laravel with layered archi...
PDF
PHPの今とこれから2023
PDF
LogbackからLog4j 2への移行によるアプリケーションのスループット改善 ( JJUG CCC 2021 Fall )
PPTX
PHP と SAPI と ZendEngine3 と
PDF
TLS, HTTP/2演習
PDF
WebRTCの技術解説 公開版
PDF
SQLite の暗号化
PPTX
PHPとシグナル、その裏側
LINEのMySQL運用について 修正版
設計をする上で役にたった制約について
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
PHPの今とこれから2022
なぜ人は必死でjQueryを捨てようとしているのか
入門ClojureScript
大規模ソーシャルゲーム開発から学んだPHP&MySQL実践テクニック
SPAセキュリティ入門~PHP Conference Japan 2021
継続的にテスト可能な設計を考える
Docker Tokyo
PHPの今とこれから2021
php-src の歩き方
Laravel × レイヤードアーキテクチャを実践して得られた知見と反省 / Practice of Laravel with layered archi...
PHPの今とこれから2023
LogbackからLog4j 2への移行によるアプリケーションのスループット改善 ( JJUG CCC 2021 Fall )
PHP と SAPI と ZendEngine3 と
TLS, HTTP/2演習
WebRTCの技術解説 公開版
SQLite の暗号化
PHPとシグナル、その裏側
Ad

Similar to PHPの今とこれから2020 (20)

PDF
PHPの今とこれから2014
PDF
PHPの今とこれから2016
PDF
PHPの今とこれから2025 (PHP Conference Japan 2025)
PDF
PHPの今とこれから2024 at PHP Conference Japan 2024
PDF
PHPの今とこれから 2013
PDF
PHP 8 で Web 以外の世界の扉を叩く
PDF
PHPの今とこれから2019
PDF
PHPの今とこれから2015
PDF
PHPの今とこれから2017
PDF
スクリプト言語PHP攻略法
PDF
PHPの今とこれから2007
PDF
PHPの今とこれから2009
PDF
PHP Now and Then 2012 at PHP Conference 2012, Tokyo Japan (in japanese)
PDF
PHPの今とこれから2018
PDF
PHP Now and then 2018 : WordPress Special Edition
PDF
最新PHP事情 (2000年7月22日,PHPカンファレンス)
PPTX
PHP基礎勉強会
PDF
徳丸本に学ぶ 安全なPHPアプリ開発の鉄則2012
PDF
PHPの今とこれから2008
PDF
PHPの今とこれから2006
PHPの今とこれから2014
PHPの今とこれから2016
PHPの今とこれから2025 (PHP Conference Japan 2025)
PHPの今とこれから2024 at PHP Conference Japan 2024
PHPの今とこれから 2013
PHP 8 で Web 以外の世界の扉を叩く
PHPの今とこれから2019
PHPの今とこれから2015
PHPの今とこれから2017
スクリプト言語PHP攻略法
PHPの今とこれから2007
PHPの今とこれから2009
PHP Now and Then 2012 at PHP Conference 2012, Tokyo Japan (in japanese)
PHPの今とこれから2018
PHP Now and then 2018 : WordPress Special Edition
最新PHP事情 (2000年7月22日,PHPカンファレンス)
PHP基礎勉強会
徳丸本に学ぶ 安全なPHPアプリ開発の鉄則2012
PHPの今とこれから2008
PHPの今とこれから2006
Ad

More from Rui Hirokawa (8)

PDF
日本PHPユーザ会の紹介
PDF
PHPの中の人によるパネルディスカッション
PDF
PHPの今と未来を語る
PDF
PHPの今と未来を語る
PDF
php.netの歩き方
PDF
PHP4の今 ~日本語対応と最近のトピックス~
PDF
PHP 5.5ネーティブキャッシュの話
PPT
PHP, Now and Then 2011
日本PHPユーザ会の紹介
PHPの中の人によるパネルディスカッション
PHPの今と未来を語る
PHPの今と未来を語る
php.netの歩き方
PHP4の今 ~日本語対応と最近のトピックス~
PHP 5.5ネーティブキャッシュの話
PHP, Now and Then 2011

PHPの今とこれから2020

  • 1. PHPの今とこれから2020 PHP Conference Tokyo 2020 December 12, 2020 廣川 類 (日本PHPユーザ会) 1
  • 2. 自己紹介:ひろかわ  PHPのホビーユーザ(1996~)  PHPマニュアルの日本語化  マルチバイト化:mbstringエクステンション  PHPカンファレンス皆勤中!  PHP関連書籍:  PHP徹底攻略  初めてのPHP(監訳) 2
  • 3. PHPとは?  PHPは主にWebアプリケーションに使用されるスクリプト言語  1995年の誕生以来、Webと共に成長、進化  現場の課題を簡単に解決してくれる便利なツールです 引用: W3Techs.com, 2020/10/1 63.6%5.0% 3.7% 2.5% 2.5% 22.7% CMS シェア WordPress Shopify Joomla Wix Drupal others 3 78.9% 9.4% 4.2%3.3%4.2% PHP ASP.NET Ruby Java Other サーバサイド言語のシェア
  • 4. PHPの開発体制 Rasmus Lerdorf Andi Gutmans Zeev Suraski Marcus Boerger 開発アカウント:約1939名(15名) コア:約150名(5名) PHP Group:10名 Nikita Popov Derick Rethans Gabriel Caruso
  • 5. 5 PHP 1 PHP 2 PHP 3 PHP 4 PHP 5 PHP 7 PHP 8 0 200,000 400,000 600,000 800,000 1,000,000 1,200,000 1,400,000 総ステップ数 Python 3 Ruby 2 0 200,000 400,000 600,000 800,000 1,000,000 1,200,000 総ステップ数  パーソナルツールからプラットフォームへ  大衆的ツール(Disりの対象)から安全で実用的な高性能ツールへ 1. 言語仕様:PHP 5.3/5.4で現代的なスクリプト言語に 2. 性能:PHP 5で高速化,PHP 7で最速に 3. セキュリティ:PHP 5でCoverity Scan適用 2015/122004/72000/51998/61997/111995/6 総ステップ数(.cファイル) 総ステップ数(.cファイル) PHPの歩み 2015/12 2020/11
  • 7. PHPの歩み 2009 7 2010 2011 2012 2013 2014 2015 2016 PHP 5.0 ‘04/7 2017 2018 2019 ・名前空間 ・クロージャ ・名前空間 ・クロージャ 5.3 `09/6 7.07.0 5.45.4 ・Traits ・高速化 ・MB標準化 ・Traits ・高速化 ・MB標準化 `12/3 5.5 ・ジェネレータ ・キャッシュ ・ジェネレータ ・キャッシュ `13/6 5.6 ・デバッガ・デバッガ `14/8 `15/12 ・大幅高速化・大幅高速化 7.17.1 `16/12 ・Nullable ・複数例外キャッチ ・Nullable ・複数例外キャッチ `17/11 7.27.2 ・高速化・高速化 7.37.3 `18/12 2004 PHP 5.0 オブジェクト機能強化 2009 PHP 5.3 普通のプログラミング言語に 2015 PHP 7.0 大幅高速化 2020 2021 7.47.4 `19/11 8.08.0 `20/11/26 ・JIT ・union ・JIT ・union ・PCRE2・PCRE2 ・プロパティ型 ・FFI ・プロパティ型 ・FFI
  • 8. PHP アンケート 2020  PHPでよく使うバージョンは? 1) PHP 5.x 2) PHP 7.1-7.2 3) PHP 7.3-7.4 8 <?php echo “Hello!”; ?>
  • 9. PHPバージョン分布 引用: W3Techs.com, 2020/11/1 9.8% 16.8% 18.9% 6.9%7.2% 22.8% 4.1% 7.0% 6.4% 7.4 7.3 7.2 7.1 7.0 5.6 5.5 5.4 5.3  PHP7ユーザ: 58% (昨年: 42%)  PHP 5(EOL)のユーザ: 42% (昨年: 57%),PHP 7.2まで(EOL)のユーザが73%  WordPressの推奨環境:PHP 7.4, MySQL 5.6, HTTPS 9 * https://wordpress.org/about/requirements/
  • 10. PHPリリースサイクル 10 2017 2018 2019 2020 2021 2022 2023 5.6 7.0 7.1 7.2 7.3 7.4 アクティブサポート セキュリティ修正のみ 2020/12/12  PHPのライフサイクル:3年(バグ修正:2年、セキュリティ修正のみ:1年)  EOL以降はセキュリティ関連の修正も提供されず、非常に危険です  PHP5、PHP 7.0/7.1/7.2 は EOLとなっています  EOL 2018/12/31 https://wiki.php.net/rfc/releaseprocess http://php.net/supported-versions.php EOL 2018/12/3 EOL 2019/12/1 EOL 2020/11/30 EOL 2021/12/6 EOL 2022/11/28
  • 11. PHPリリース情報 Release 7.1 7.2 7.3 7.4 変更 2019/11/28 7.4.0 PHP 7.4.0 Release, PHP 7.1 EOL 2019/12/18 7.2.26 7.3.13 7.4.1 CVE-2019-11044,11045,11046 (buffer underflow),11047,11049,11050 2020/1/23 7.2.27 7.3.14 7.4.2 CVE-2020-7060 (buffer overflow) 2020/2/20 7.2.28 7.3.15 7.4.3 CVE-2020-7061 (heap overflow),7062 2020/3/19 7.2.29 7.3.16 7.4.4 CVE-2020-7066,7065 (stack overflow) 2020/4/16 7.2.30 7.3.17 7.4.5 CVE-2020-7067 2020/5/14 7.2.31 7.3.18 7.4.6 CVE-2019-11048 2020/6/11 7.3.19 7.4.7 2020/7/9 7.2.32 7.3.20 7.4.8 2020/8/6 7.2.33 7.3.21 7.4.9 CVE-2020-7068 2020/9/3 7.3.22 7.4.10 2020/10/1 7.2.34 7.3.23 7.4.11 CVE-2020-7069, 7070 (malicious cookie) 2020/10/29 7.3.24 7.4.12 2020/11/26 PHP 8.0 Release, PHP 7.2 EOL (2020/11/30) 11  CVE-* ⇒ 速やかな更新が必要
  • 12. 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 0 20 40 60 80 100 120 Total DoS Code Execution Overflow Memory corruption SQL Injection XSS Directory Traversal HTTP Response Splitting Bypass Gain info Gain privileges File inclusion PHP脆弱性件数(CVE)と種別 www.cvedetails.com
  • 13. PHP 5.6 PHP 7.0 PHP 7.1 PHP 7.2 PHP 7.3 PHP 7.4 PHP 8.0 0 1 2 3 4 5 6 7 8 $x = $f ? $f : tmp $x = $f ? $f : $a $x = $f ?: tmp $x = $a ?: null $x = $str[0] $x = $hash['v'] $x = $GLOBALS['v'] $x = $_GET $x = TEST new Foo() $x = Foo::TEST $this->f() empty($this->x) isset($this->x) $this->x-- $this->x++ --$this->x ++$this->x $this->x += 2 $this->x = 0 $x = $this->x Foo::f() self::f() empty(Foo::$x) isset(Foo::$x) Foo::$x = 0 $x = Foo::$x empty(self::$x) isset(self::$x) self::$x = 0 $x = self::$x int_func() undef_func() func() empty_loop 0 0.2 0.4 0.6 0.8 1 1.2 1.4 1.6 1.8 strcat(200000) sieve(30) nestedloop(12) matrix(20) heapsort(20000) hash2(500) hash1(50000) fibo(30) ary3(2000) ary2(50000) ary(50000) ackermann(7) mandel2 mandel simpleudcall simpleucall simplecall simple PHP8: JIT無し Ryzen 5 2400G, Ubuntu 20.04 13  JIT無しの場合:やや改善 Zend/bench.php Zend/microbench.php
  • 14. 0 0.05 0.1 0.15 0.2 0.25 0.3 0.35 0.4 0.45 0.5 strcat(200000) sieve(30) nestedloop(12) matrix(20) heapsort(20000) hash2(500) hash1(50000) fibo(30) ary3(2000) ary2(50000) ary(50000) ackermann(7) mandel2 mandel simpleudcall simpleucall simplecall simple 7.4 8.0 7.4 cache 8.0 cache 8.0 tracing 8.0 function 8.0 "1255" 0 0.5 1 1.5 2 2.5 $x = $f ? $f : tmp $x = $f ? $f : $a $x = $f ?: tmp $x = $a ?: null $x = $str[0] $x = $hash['v'] $x = $GLOBALS['v'] $x = $_GET $x = TEST new Foo() $x = Foo::TEST $this->f() empty($this->x) isset($this->x) $this->x-- $this->x++ --$this->x ++$this->x $this->x += 2 $this->x = 0 $x = $this->x Foo::f() self::f() empty(Foo::$x) isset(Foo::$x) Foo::$x = 0 $x = Foo::$x empty(self::$x) isset(self::$x) self::$x = 0 $x = self::$x int_func() undef_func() func() empty_loop PHP8 JIT: より速く、快適に Ryzen 5 2400G, Ubuntu 20.04 14  PHP 8+JIT:実行速度が大幅改善  実用アプリではそれほどでもない(数%) Zend/bench.php Zend/microbench.php
  • 15. 実用アプリにおけるJITの効果の例 15  実用アプリケーションの例(WordPress)⇒実行速度はほとんど変わらない  PHPスクリプトで重い処理を行う際の改善効果を期待 nominal opcache JIT function JIT tracing 0 10 20 30 40 50 60 PHP8.0.0RC4+WordPress 5.3.2 http://wordpress/?p=1 Requestspersecond Ryzen 5 2400G, Ubuntu 20.04
  • 16. PHP 8.0 JIT導入  PHP 8におけるJIT  JIT (Just-in-Time Compiler) 16 https://wiki.php.net/rfc/jit  HHVMでJIT採用⇒PHP 5に比べて大幅高速化  PHP 7開発時にもJIT導入を検討(LLVM)⇒見送り(代わりにエンジン高速化)  LuaJITプロジェクト用に開発された軽量JITエンジンDynAsmを採用  現在はx86をサポート、将来的にはARM等もサポート zend_extension = opcache opcache.enable = 1 opcache.jit = on opcache.jit_buffer_size = 128M
  • 17. PHP 8.0 JIT導入 17 https://wiki.php.net/rfc/jit ✔ OPCacheを拡張して実装:バイトコードの代わりにネーティブコードをキャッシュ ✔ 仮想マシン上で実行するよりも高速に実行できる ✔ ただし,ネーティブコードへの変換(JIT)に時間を要するため,時間がかかるコードのみJITを実行 コンパイル・解析 実行(Zend VM) 実行(CPU) ネーティブコード PHPスクリプト バイトコードキャッシュ コンパイル・解析 変換(JIT) 実行(CPU) ネーティブコード PHPスクリプト バイトコード キャッシュ 従来 JIT
  • 18. PHP 8.0 JITオプション  JITにすれば単純に早くなるというわけでもない⇒opcache.jitオプションで調整  プロファイルで頻繁に使用される部分を抽出し、JITを適用:静的解析または実行時解析  実行頻度が高い一連の処理を切り出すトレーシングJITを導入(デフォルト)  文字列または数値(CRTO)で指定: tracingまたはon (1254),function (1205)  CPUアーキテクチャに合わせた最適化、SIMD命令の使用 18 opcache.jit=1254 CPU固有の最適化(C) 0:オフ、1: AVX命令生成を有効化 レジスタ配置(R) 0:なし、1:ローカル線形スキャン、2: グローバル線形スキャン JITトリガ(T) 0:スクリプトロード時、1:初回実行時、 2:初回時プロファイル、2回目にコンパイル 3:プロファイルでホットな関数を見つけてコンパイル 4:docコメントで@jitタグが指定された関数をコンパイル 5:ホットなコード(ループ)をトレース,コンパイル 最適化レベル(O) 0:JIT無効、1:JIT最小実行、2:インライン化 3:関数毎の静的型推論による最適化 4:静的型推論とコールツリーによる最適化 5:静的型推論と内部処理解析による最適化
  • 19. PHP 8.0 改善/変更のポイント 1. Union型の導入 2. 属性(attribute) 3. static型戻り値指定 4. 弱いマッピング 5. ::classのオブジェクトへの適用 6. 文字列部分一致確認用関数 7. ヌルセーフ演算子 8. match式 9. mixed型 10. 名前付き引数 11. 数値文字列扱い明確化 12. コンストラクタ引数でプロパティ設定
  • 20. PHP 8.0 改善/変更のポイント 20 <?php class Test { public int|float $x; public function getVal() : int|float { return $this->x; } } $obj = new Test(); $obj->x = "1.23"; echo $obj->getVal(); // 1.23  Union: 引数,戻り値の型の候補を複数指定できる RFC: https://wiki.php.net/rfc/union_types_v2 float(1.23)
  • 21. PHP 8.0 改善/変更のポイント 21  属性(attribute): Java(annotation),Rust, Python (decorators)に類似  ユースケース:メタデータの記述,フレームワークにおけるルーティング,JITオプションなど <?php #[ClassAttribute(PHP_VERSION_ID)] class Foo { #[PropertyAttribute(2+3*2)] public $x; #[Deprecated("Use bar()"),Jit(1255)] public function moo() {} } RFC: https://wiki.php.net/rfc/attributes_v2 $ref = new ReflectionClass(Foo::class); $attr = $ref->getProperty('x')->getAttributes(); $attr = $ref->getMethod('moo')->getAttributes(); $attr = $ref->getAttributes(); $attr[0]->getName(), $attr[0]->getArguments()
  • 22. PHP 8.0 改善/変更のポイント 22  static型: 関数・クラスメソッドの戻り値に遅延静的束縛(late static binding)を 指定 <?php class A {   public function gen1():static { return new self; }   public function gen2():static { return new static; } } class B extends A {} $a = new A; $b = new B; var_dump($b->gen1()); // object(A)#3 var_dump($b->gen2()); // object(B)#3 RFC: https://wiki.php.net/rfc/static_return_type TypeError: Return value of A::gen1() must be of Type B, A returned
  • 23. PHP 8.0 改善/変更のポイント 23  弱いマッピング:オブジェクトがガベージコレクションの対象となることを妨げない。 <?php $map = new WeakMap; $obj = new stdClass; $map[$obj] = spl_object_hash($obj); var_dump($map);  // object(WeakMap)#1 (1) var_dump($map[$obj]); //  $objのハッシュ値 unset($obj); var_dump($map);  // object(WeakMap)#1 (0) RFC: https://wiki.php.net/rfc/weak_maps 通常:元の変数を削除してもリファレンスがある場合,実体は削除されない 弱いマッピング:実体はガベージコレクションの対象となり、逆にマッピングが削除される
  • 24. PHP 8.0 改善/変更のポイント 24 RFC: https://wiki.php.net/rfc/class_name_literal_on_object  変数::class構文  オブジェクト変数に対してクラス名を取得する: ● 従来はget_class()関数を使用 ● ::class構文をオブジェクト変数にも使用可能とした <?php class A {} $a = new A; echo A::class;       // A: 従来から使用可能 echo get_class($a);  // A: 変数の場合(従来) echo $a::class;      // A: PHP8以降
  • 25. PHP 8.0 改善/変更のポイント 25  文字列部分一致確認用関数 RFC: https://wiki.php.net/rfc/str_contains <?php $s="東京特許許可局"; var_dump(str_contains($s,"特許")); // bool(true) var_dump(str_starts_with($s,"東京")); // bool(true) var_dump(str_ends_with($s,"許可局")); // bool(true)
  • 26. PHP 8.0 改善/変更のポイント 26  ヌルセーフ演算子: nullチェックを簡便に RFC: https://wiki.php.net/rfc/nullsafe_operator <?php class moo { public $d=123;} class foo { public function get() { return new moo(); } } $b = new foo(); if ($b!==null) { $a=$b->get(); if ($a!==null) { $d=$a->d; } } echo $d; echo $b?->get()?->d;
  • 27. PHP 8.0 改善/変更のポイント 27  match式: switch文をより簡便 に記述できる RFC: https://wiki.php.net/rfc/match_expression_v2 switch ($id) { case 0: $name = 'Taro';break; case 1: $name = 'Jiro';break; case 2:   case 3: $name = 'Hanako';break; default: $name = “Anonymous”;break; } echo $name; echo match($id) {0=>'Taro',1=>'Jiro',2,3=>'Hanako', default=>'Anonymous’};
  • 28. PHP 8.0 改善/変更のポイント 28  mixed型: あらゆる変数型を表す汎用の型名  array,bool,callable,int,float,null,object,resource,string RFC: https://wiki.php.net/rfc/mixed_type_v2 <?php  class A {      public mixed $bar;       public function foo(int $value): mixed {}  }    class B extends A {      public mixed $bar;      public function foo(mixed $value): int {}  } class A class B 引数型:同じまたは拡大 戻り値型:同じまたは縮小 継承 リスコフ置換原理(LSP)
  • 29. PHP 8.0 改善/変更のポイント 29  名前付き引数: 引数を名前(パラメータ名: 値)で指定 ● 意図が分かりやすく ● デフォルト値をスキップ RFC: https://wiki.php.net/rfc/named_params array_fill(0, 100, 50); array_fill(value:50,num:100,start_index:0); htmlspecialchars($s,ENT_COMPAT|ENT_HTML401,’UTF-8’,false) htmlspecialchars($s,double_encode:false)
  • 30. PHP 8.0 改善/変更のポイント 30  Constructor Property Promotion:コンストラクタでプロパティ指定が可能に RFC: https://wiki.php.net/rfc/constructor_promotion class Foo { public float $x; public float $y; public function __construct(float $x=0.0,float $y=0.0) { $this->x=$x; $this->y=$y; } } class Foo { public function __construct(public float $x=0.0,public float $y=0.0) {} } PHP 7.4 PHP 8.0
  • 31. PHP 8.0 改善/変更のポイント 31  数値の定義明確化:前後の空白を許容(互換性がない変更) RFC: https://wiki.php.net/rfc/saner-numeric-strings var_dump(is_numeric("123abc")); // bool(false) var_dump(is_numeric("123 ")); // bool(false) var_dump(is_numeric(" 123")); // bool(true) var_dump(is_numeric(" 123 ")); // bool(false) var_dump(is_numeric("123abc")); // bool(false) var_dump(is_numeric("123 ")); // bool(true) var_dump(is_numeric(" 123")); // bool(true) var_dump(is_numeric(" 123 ")); // bool(true) PHP 7.4 PHP 8.0
  • 32. PHP 8.0 改善/変更のポイント 32  負の添字の明確化:添字追加を連続的に(互換性がない変更) RFC: https://wiki.php.net/rfc/negative_array_index $a[-2]=true; $a[]=true; var_dump($a); PHP 7.4 PHP 8.0 $a[-2]=true,$a[0]=true $a[-2]=true,$a[-1]=true
  • 33. PHP 8.0 改善/変更のポイント 33  結合演算子の優先順位明確化(互換性がない変更) RFC: https://wiki.php.net/rfc/concatenation_precedence var_dump("3" . "5" + 7); PHP 7.4 PHP 8.0 int(42) string(“312”) '.','+','-'演算子の優先順位は同じ '+','-'演算子を優先
  • 34. PHP 8.0 改善/変更のポイント 34  エラーレベル (error_reporting)のデフォルト値変更: E_ALL (E_NOTICE,E_DREPRECATEDを除く) ⇒ E_ALL  display_startup_errorsがデフォルトで有効に  @演算子は致命的なエラー出力を抑制しなくなった  削除: each(), create_function()  mbstringエクステンション ● func_overload削除 ● mb_ereg_replace()の修正子’e’削除 → mb_ereg_replace_callback() ● mb_ereg(),mb_eregi()の戻り値 int(1) → bool(true)
  • 35. PHP の将来  PHPスクリプトの用途拡大:Opcache(プリローディング)+JIT+FFIの活用 ● PHPエクステンション:C言語による記述からPHPによる記述へ(FFI) ● 計算負荷が高いアルゴリズムのPHPによる実装:機械学習,AI等 (PHP-ML, PHP-MLX) 35 入力処理(C言語) 外部API実行 PHPスクリプト 従来のエクステンション(C言語) 出力処理(C言語) PHP出力 入力処理(PHP) 外部API実行 PHPスクリプト FFIエクステンション(PHP) 出力処理(PHP) PHP出力
  • 37. 37 PHP Conference 2020 の見どころ Tack 1 Track 2 Track 3 Track 4 Track 5(PHP8 specical) Track 6 (International) PHPの今とこれから2020 PHP Webアプリケーション設計 入門 (GMO) NewRelicプラットフォームを使ったオ ブザーバビリティ入門(川口) 初心者セッション (柏岡) Laravelで運用しているサービスを Nuxt.jsにリプレイスする (久保田) PHP 8.0: A new version, a new era (Gabriel Caruso) レガシープロジェクトで,メタプログ ラミングを使った...(弁護士ドットコム) LaravelDB.comを使ってDB設計 スポンサー’s LT 長期運用を目指す 「Shadowverse」におけるリファ クタ事例の紹介(Cygames) 徳丸皆伝を狙いませんか?徳丸実務 試験とPHP8上級試験の解説(PHP 技術者認定機構) GCPとPHP (サイトウ) ゼロベースからLaravelを用いた API実装オートメーション(めもり ~) PHP8で作るJSONパーサ (新原) 自分のやりたいことをやって超簡単に チームのコミュニケーションを活性化 させた(Hamee) PHP on Kubernetes 事業のスケールアウトを支える PHPで作る分散アーキテクチャ (竹澤) PSRで学ぶHTTP Webアプリケー ションの実践 (うさみ) Webサービスをセキュアに保 つために必要な視点 Laravel x オニオンアーキテクチャ で始めるテスト駆動開発 PHPのソースコードから理解す るPreloadとJIT テストピラミッドを意識したテスト コード実装戦略 PHP8はISUCONへの扉を開く 鍵となるか パネルセッション「ひさてるさんに 聞け」 Composer 2.0って何? どう変わる の? 読んでみました (きんじょう) DNS改ざん検知ツールの実 装とDNSパケットの世界(市 川) 本番でしか起きない問題に早く気 が付けるように,僕はLarabel DuskでCIする (sogaoh) PHP8の新機能をPHP内部 コードのテストphptから読む (東口) 今こそ理解する,PHPの日時計算 CakePHPで学ぶDIコンテナ (itasho) Laravel+Lighthouseで始める低 コストなGraphQL入門 PHP8時代のWebアプリケー ションフレームワークの話をしよ う(中榮) ウェブセキュリティのありがちな誤 解を解説する(徳丸) 効率的な静的解析のCI導入パター ンを求めて (杉山) PhpStormを使えばほとんど コード補完されるんだってば さ(マキ) PHP8でWeb以外の世界の扉 を開く (sji) Service communication re:Born (Nick Chiu)) 微妙な違いも見落とすな!ビジュアル リグレッションテスト!(大橋) PHPで作るオンラインカンファ レンス向け録画システム(長 谷川) How good are my tests? (Stephan Hochdoerfer) LT大会 Functional Programming in PHP (Lochemem Michael)