Skip to content

P++とは何だったのか

公開日:

東京都渋谷区GMO Yoursで開催された『第141回 PHP勉強会@東京』でメイン発表枠(20分)として発表しました。

札幌市中央区札幌市民交流プラザで開催された『PHPカンファレンス北海道2019』でアンカンファレンス(20分)として発表しました。

Download PDF

スライドテキスト

Page 1

P++とは何だったのか

Bring peace to the galaxy with P++

[2019-08-28]第141回 PHP勉強会@東京

#phpstudy

Page 2

お前誰よ

  • うさみけんた (@tadsan) / Zonu.EXE
  • GitHub/Packagistでは id: zonuexe
  • ピクシブ株式会社 pixiv事業本部
  • Emacs Lisper, PHPer
  • Emacs PHP Modeのメンテナ引き継ぎました
  • 好きなリスプはEmacs Lispです
  • Qiitaに記事を書いたり変なコメントしてるよ

Page 3

Page 4

Page 5

P++とは何か

Page 6

Page 7

言ってることは正しい

Page 8

情報は間違ってる

Page 9

どういうことか

Page 10

さて

Page 11

アンケート

Page 12

君の想像するPHPはどんなやつ?

Page 13

A

<!DOCTYPE html><html><head><title>Hello, PHP!</title></head><p><?php if (date('H') < 19): ?>こんにちは<?php else: ?>こんばんは<?php endif; ?></p><p>今は<?= htmlspecialchars(date('H')) ?>時です</p>

Page 14

B

<?php require 'bootstrap.php';

$db = mysqli_connect();

$stmt = mysqli_prepare($db, 'SELECT * FROM books');

mysqli_stmt_execute($stmt);

print '<h1>本の一覧</h1><ul>';

foreach ($stmt as $s) {

print '<li>'; print $s->name; print '</li>';

}

Page 15

C

<?php namespace Hoge\Http\Controller;

class BooksController extends BaseController {public function index() {$books = Books::getAll();

$this->render(compact("books"));}}

Page 16

A?

B?

C?

Page 17

PHPはどんな速度で変化してるか

Page 18

速い?

遅い?

Page 19

PHPは変わったと思う?

Page 20

速くなったとしたらいつから?

Page 21

これ何の数かわかる?

Page 22

PHP7.0…

PHP7.1…

PHP7.2…

PHP7.3…

PHP7.4…

Page 23

お前はPHP7以降追加された機能の数を覚えているか

Page 24

せいかいバージョンごとに受理されたRFC数

Page 25

RFC?

Page 26

Page 27

PHP7の機能追加や改廃の提案

Page 28

PythonでのPEPに相当

Page 29

RFCの提案をもとに、PHP開発者(php.netのVCSアカウント所有者)が一人一票を投じる仕組み

Page 30

単純に「追加された数」ではないが

Page 31

PHPの行く末を知りたければRFCをウォッチすればよい

Page 32

https://wiki.php.net/rfc

Page 33

https://php-rfc-watch.beberlei.de/

Page 34

Page 35

https://wiki.php.net/rfc

Page 36

改めて数を見てみよう

Page 37

PHP7.0…

PHP7.1…

PHP7.2…

PHP7.3…

PHP7.4…

Page 38

意外に変わってるなって感じはする

Page 39

とてもざっくり言うとレガシー仕様は消え、不条理な挙動は是正され、他言語にあるようなカッコイイ機能が追加提案されてる

Page 40

😇

Page 41

ところでRasmusはこう言った

Page 42

“We have things like protected properties.We have abstract methods. We have all this stuff that your computer science teacher told you you should be using.I don't care about this crap at all.”

–Rasmus Lerdorf https://en.wikiquote.org/wiki/Rasmus_Lerdorf

Page 43

“PHPにはprotectedプロパティも抽象メソッドもありますよ。計算機科学の教授が「使え」と言ってるものは全部。そんなことはクソ興味ないですけど”–Rasmus Lerdorf

Page 44

改めてPHPの言語仕様が追加された時系列を見てみよう

Page 45

PHP 7.4

Arrow functions 2.0

JavaScriptなど

Typed Property

Javaなどの静的型付き言語

Numeric Literal Separator

Ada, Ruby, JavaScriptなど

Page 46

PHP 7.3

Flexible Heredoc and Nowdoc

Rubyにも似た記法はある

list() Reference Assignment

これはPHP独自に近い

Page 47

PHP 7.2

Trailing Commas In List Syntax

カンマ(,)を並べて書く記法のほぼ全てで余分につけてもよくなった

Parameter Type Widening

継承したクラスで引数の型省略

Page 48

PHP 7.1

Nullable Types

Void Return Type

Multi catch

Allow specifying keys in list()

Page 49

PHP 7.0

Anonymous Class

Generator Delegation(yield from)

Return Type Declaration

Null Coalesce Operator

Scalar type hints

Page 50

PHP 5.6

Exponential Operator(pow**)

Importing named function

Variadic function argument (...)

配列を引数として展開

Argument unpacking(...)

可変長引数を配列として取得

Page 51

PHP 5.5

Generator

finally keyword (try-catch-...)

Const array/string dereference

Allow non-scalar keys in foreach

Page 52

PHP 5.4

Traits

Short array syntax

callable type hint

Page 53

PHP 5.3

Closures (function expression)関数式、クロージャ、またはラムダ式JavaScriptのfunctionに似てるが、レキシカルスコープ(変数の捕捉)のためにuseキーワードが必要

Page 54

抽象クラス, トレイト, インターフェイス, ジェネレータ, イテレータ, クロージャ, 函数の動的呼び出し, 無名クラス, eval, 型宣言, 連想配列, リフレクションAPI, 自己文書化, 標準入出力の読み書き,REPL, クラスの遅延ロード

Page 55

これらの新機能をフルに活用してコードを書いてる人はどれだけ居るの?

Page 56

(そういう人は居るけど、そうじゃない人たちと二極化してるのは確実)

Page 57

PHPの古参開発者たちは冷ややか

Page 58

PHP以外の言語に触れてた経験のないみんなもポカーソ

Page 59

そういうとこやぞ

Page 60

クールな新機能や静的解析しやすい仕様に興味あるひと

Page 61

従来のコードが動けば十分で破壊的進化は望まないひと

Page 62

そのほかにもPHPユーザには様々な立場のひとたちが居る

Page 63

その見えない溝が可視化されたのが今回の一件

Page 64

さらにひきがねを引く事件があった

Page 65

Page 66

Deprecate PHP's short open tags, again一般的なPHPタグは<?php ... ?>または<?= ... ?> だが、<? ... ?>という形式もあるphp.iniで有効無効を切替られる環境によってOnだったりOffだったり

Page 67

Deprecate PHP's short open tags, again

XML宣言との相性がとても悪いそんな半端モンは引導を渡してやろうぜ! ということで提案された構文がシンプルになるし、機械的に変換もできるから良いだろ、という主旨

Page 68

Zeevによる反論

Page 69

Page 70

Zeev Suraski

PHP3・4の開発者

相方のAndi Gutmansとともに

VM型処理系のZend Engine開発

PHPでよくあるZend…はZeevとAndiに由来

PHPコードに未だに影響を残す

Page 71

Rasmus Lardorf

オリジナルのPHP(PHP/FI)作者

言語の原作者は最終的な決定権を担っていることがある(BDFL:優しい終身の独裁者)が、Rasmusはそうではない

必要な場面では発言するが権限はRFCの一票しか持ってない

今回の一件にはあまり関与してない

Page 72

Nikita Popov

近年のPHPの中核的な開発者

PHP5.5以降、非常に多数の言語機能を実装してPHPに取り入れてきた

PHP-Parserなどの作者

去年の大学院を卒業し今年JetBrainsに入社してPhpStormチームに参加

Page 73

📛

Page 74

🔥

Page 75

燃えた

Page 76

めちゃくちゃ燃えた

Page 77

Deprecate PHP's short open tags, again<? ... ?> 使ってないひとは使ってないし、廃止したからと言って文法が簡単になるか…?この仕様を削除してもパフォーマンスは特に向上しないし、コードもちょっとしか消えない

Page 78

Deprecate PHP's short open tags, again大山鳴動して鼠一匹大騒ぎして文法変更する割に得られるメリットが少なすぎないか…?だからと言って負債になった文法はずっと変えられないままなのか?!

喧喧諤諤非難轟々

Page 79

再び立ち上がった

Page 80

Page 81

PHPコミュニティ内の革新vs保守の対立を解決したい

Page 82

ここで提案されたのがP++

Page 83

概要は最初の本の虫の記事で紹介された通り

Page 84

Page 85

誰も何も決定してないことを除けば

Page 86

PHPの意思決定機関が開発者によるRFCの多数決であることを知っていれば誤解はしないはず

Page 87

本の虫で紹介された「ソース」はメーリングリストでの議論のためのメモ書き

Page 88

燃え拡がる

誤解…!

🔥

🔥

🔥

Page 89

Page 90

その後の経緯はこの記事に書いた通り

Page 91

Page 92

理想はわかるが…現実的ではない…

Page 93

Zeevの予言…

Page 94

Page 95

PHPの明日はどっちだ

Page 96

救いとしてはそれ以降も別のRFCで建設的な議論は続いてるし、ZeevもNikitaも参加している

Page 97

PHP先生の次回作(PHP8)にご期待ください!