Skip to content

ぺちこん北海道

公開日:

Download PDF

スライドテキスト

Page 1

ぺちこん北海道
学生ランチセッション

PHP for Students

PHPカンファレンス北海道 実行委員会

USAMI Kenta

2024-01-13

PHPカンファレンス北海道2024

Page 2

お前誰よ

  • うさみけんた (@tadsan) / Zonu.EXE / にゃんだーすわん
  • ピクシブ株式会社 pixiv事業本部 Webエンジニアリングチーム PHPer
    • 2012年末から現職でPHPを書いているWebプログラマ
  • Emacs PHP Modeを開発しています (2017年-)
  • プログラミング言語にちょっとこだわりのある素人 (spcamp2010)

Page 3

tadsan loves 北海道

  • 北海道砂川市出身
  • 北海道工業大学卒業 (現・北海道科学大学)
  • 2011年1月〜2012年7月くらいまで札幌のコミュニティに顔を出してた
    • LOCAL学生部
    • Ruby札幌
    • Python札幌

Page 4

tadsanとPHP

  • 北海道に住んでたときはほとんどPHPを書いていない(!)
  • 2010年にセキュリティキャンプに参加してからプログラミング言語に興味
  • PHPは2012年に現職に入社してからやりはじめた
  • PHPカンファレンス北海道2016が初めてのカンファレンス発表
    • Webフレームワークを作る話とか静的解析とか、脆弱性の話をしています

Page 5

<?php

Page 6

さて
PHPは何ができる 言語なのでしょうか

Page 7

とにかく毀誉褒貶が
激しい言語ランタイム

Page 8

Webトラフィック

Page 9

W3Techs 統計

Page 10

パッケージ数

Page 11

PHPはどこで
使えるのか

Page 12

PHPは汎用プログラミング言語

  • HTTP = Webサービス

Page 13

PHPは汎用プログラミング言語

  • HTTP = Webサービス
  • それ以外の任意のあらゆること (得意とは言ってない)

Page 14

PHPは汎用プログラミング言語

  • HTTP = Webサービス
  • それ以外の任意のあらゆること (得意とは言ってない)
    • CLI
    • GUIもいちおう… (得意とは言ってない)

Page 15

みなさんの想像する
PHPとは

Page 16

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 17

B

<?php require 'bootstrap.php';

$db = mysqli_connect();
$stmt = mysqli_prepare($db, 'SELECT * FROM books');
mysqli_stmt_execute($stmt); print '<h1>本の一覧</h1>';

print '<ul>';
foreach ($stmt as $s) {
print '<li>'; print $s->name; print '</li>';
}
print '</ul>';

Page 18

C

<?php declare(strict_types=1);

namespace Foo\Http\Controller;

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

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

Page 19

P H P の原作者
ラスマスかく語りき

Page 20

2007年 MySQL Conference

“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 21

2007年 MySQL Conference

には プロパティも
“PHP protected
抽象メソッドもありますよ。計算機科学の
教授が「使え」と言ってるものは全部。

そんなことはクソ興味ないですけど

(tadsan )

–Rasmus Lerdorf

による超訳

Page 22

変数に$があって
Perlっぽくて

Page 23

C言語っぽい
関数と
-> があって

Page 24

雰囲気Javaっぽい オブジェクト指向で

Page 25

PHPは見る人の心を映す

Page 26

整理しましょう

Page 27

A=SSIスタイル

<!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 28

Perl

use DBI;

$db = DBI->connect('...');
$stmt = $db->prepare('SELECT * FROM books');
$stmt->execute;
print '<h1>本の一覧</h1>'; print '<ul>';

for ($i = 0; $I < $sth->rows; $i++) {
@row = $sth->fetchrow_array;
print '<li>'; print $row[0]; print '</li>';
}
print '</ul>';

Page 29

B=CGIスタイル

<?php require 'bootstrap.php';

$db = mysqli_connect();
$stmt = mysqli_prepare($db, 'SELECT * FROM books');
mysqli_stmt_execute($stmt); print '<h1>本の一覧</h1>';

print '<ul>';
foreach ($stmt as $s) {
print '<li>'; print $s->name; print '</li>';
}
print '</ul>';

Page 30

C=OOPスタイル

<?php declare(strict_types=1);

namespace Foo\Http\Controller;

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

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

Page 31

PHPは汎用プログラミング言語

  • PHPはHTTP(≒Webサービス)を言語レベルでサポートしている
    • ほかの言語ではCGIライブラリとしてサポートしている機能が組み込み
  • 各Webサーバとの連携はSAPI(Server API)として定義されている
    • どのサーバー上でもCGI風の動作をする
    • コマンドラインスクリプトとして実行するモード(CLI)もSAPIのひとつ

Page 32

PHPの歴史

  • 1994: PHP Tools 1.0 → SSI風構文のテンプレートエンジン
  • 1996: PHP/FI 2.0 → 汎用言語として使用できるように
  • 1998: PHP 3.0 → クラス構文のサポート
  • 1999: PHP 4.0 → Zend Engine (インタプリタVM化)
  • 2003: PHP 5.0(開発中) → オブジェクト指向構文の刷新

Page 33

PHPと文字列

  • string型 = バイト列 (任意のバイナリが格納できる)
    • Ruby 1.8、Python 2.xと同等
  • PHP 6.xでICUと統合してUCS正規化しようとした
    • 規定路線だったので、PHP 5.2(2006年)にbinaryキャストが追加
    • 当時期待されていたパフォーマンス要件を満たせず2010年に断念
  • 文字列以外の機能は5.3(2009年)、5.4(2012年)でリリース

Page 34

PHPのオブジェクト指向機能

  • PHP 5.0
    • 可視性 (public/protected/private)
    • abstract/interfaceが導入
    • オブジェクトが参照型に (それまではCoW)
  • PHP 5.4: traitが導入
  • PHP 5.6: 定数式 (それまではリテラルしか記述できなかった)

Page 35

PHPのオブジェクト指向機能

  • PHP 7.4: 型付きプロパティ
  • PHP 8.0: コンストラクタプロモーション (PHP 8.2)
  • PHP 8.1: readonlyプロパティ
  • PHP 8.2: trait定数宣言
  • PHP 8.3: 型付き定数宣言

Page 36

<?php <?php

class Book { class Book {
/** public function __construct(
* @var string public readonly string $name,
* @readonly ) { */ }
private $name;
...
/** @param string $name */
public function __construct($name) {
$this->name = $name;

...

Page 37

静的解析しやすい特徴

  • クラスや関数が再定義されることは基本的にない
  • Java風のクラス継承(class, interface)
  • 関数呼び出しは全て () がつく、文末は必ず ;

Page 38

PHPの進化は 型宣言の進化

Page 39

いまやPHPは
静的型付きと言っても
過言ではない
(本当か…?)

Page 40

型がついていない関数(PHP5)

function add($a, $b) {
return $a + $b;
}

Page 41

スカラー型宣言(PHP7)

int + intって
本当にintなの?

function add(int $a, int $b): int {
return $a + $b;
}

Page 42

広い値をとるにはfloatが必要

ひとつの解決策では
あるが… 不必要にhoat
を強制するのか

function add(float $a, float $b): float {
return $a + $b;
}

Page 43

PHPDocの型注釈

(アノテーション)

/**
* @param int|float $a

あえて型宣言を省略する

* @param int|float $b
* @return int|float
*/

function add($a, $b) {
return $a + $b;
}

Page 44

ユニオン型宣言 (PHP8.0)

function add(int|float $a, int|float $b): int|float {
return $a + $b;
}

Page 45

LL言語としてのPHP vs エディタ

  • 2000年代のCGIやLL言語(Lightweight Language)という用語が
    よく使われていた頃は「重厚鈍重なIDEが必要な言語」のアンチテーゼとして
    シンプルなスクリプト言語とエディタが好まれていた (ように思う)
  • 時は流れ、Webアプリケーションは巨大になり、ファイルは増え、シンプルなエ
    ディタでは開発のオーバーヘッドが無視しがたくなってきた
  • PhpStorm(JetBrains社のIDE)が静的解析とインテリジェントな編集機能
    を提供してくれるようになった

Page 46

PHPと静的解析

  • PHP組み込みで提供されているのは php -l (syntax check) のみ
  • 「静的解析ツール」と呼ばれうるものは2000年代からあった
    • ドキュメント生成、コーディングスタイルのチェック
  • 2010年代後半になってPhpStormの普及を呼び水にして、
    型システムや変数スコープを正確に扱えるツールが開発され始めた

Page 47

PHP Static Analysis Tool

Page 48

PHPStanとは

  • 2016年から開発されているPHPの静的解析ツール
    • Ondřej Mirtesさんの個人プロジェクト、2021年からフルタイム開発
  • 開発当初は純粋な静的解析ではなく実行時リフレクションを用いることで
    高速な解析を実現していた
    • 現在は静的解析がデフォルトで、レガシープロジェクトに導入しやすくなった
  • その他のPHP静的解析ツールにはPsalm, Phan, Qodana(PhpStorm)

Page 49

PHPStanの提供する型

  • PHPの組み込み型、クラス名、インターフェイス名
  • 修飾型: non-empty-string, non-empty-array
  • ユニオン型: A|B
  • ジェネリクス: array<T>, ArrayObject<T>
  • 定数型: 123, "foo", Foo::BAR

Page 50

PHP処理系

  • ソースコード: https://github.com/php/php-src
  • 処理系のソースコードはC言語で書かれている(一部のみC++)
    • パーサーはYacc(Bison)で記述されている
    • 基礎知識は『Rubyソースコード完全解説』の知識が役に立つ
  • 議論はメーリングリストがメインだが、GitHub issueやPull Requestも
    受け付けてくれる

Page 51

PHPの開発体制

  • Request for Comments https://wiki.php.net/rfc
    • 言語機能の改廃提案と投票プロセス、リリース周期が明文化
  • 機能提案する人は仕様をまとめてMLで議論、実装も責任を持って用意する
  • PHP原作者のRasmus Lardorfは開発者としての1票しか行使しない
  • PHP 7.0(2015年)以降、11月末〜12月初頭にリリースが定着
    • 品質保障のためのfeature freeze、RC版なども定められた

Page 52

PHPは誰が開発しているのか

Page 53

Page 54

Page 55

PHPはどこに行くのか

  • おそらく、どの言語よりも利用者の幅が広い言語
    • 動的なホームページを作りたい個人
    • Web制作からのステップアップ
    • CMSを使ったWebサイト構築
    • 各種システム開発 (大規模Webサイト、ゲームのAPIサーバ…)

Page 56

PHPは過去と未来を繋ぐ言語

  • PHPの仕様はCGIの時代から地続き
    • PerlやRubyはApache mod時代やPost WSGI時代に断絶がある
    • PHPはpreforkなサーバ上でもCGI互換のシェアードナッシング
      (すべての状態が隔離され、リクエストごとに初期化される)
  • 汎用プログラミング言語の能力を持ちながら根幹がテンプレートエンジンに
    あるので、小規模からある程度大規模なアプリケーションにもフィットする

Page 57

Webの世界のトレンド

  • シェアを伸張する各言語
    • Node.js, SPA
    • パフォーマンスに優れた静的型付き言語
  • 相対的にPHPの存在感は薄れつつある
    • このままPHPは滅びるしかないのか…?

Page 58

PHPはどこでも65点がとれる言語

  • 「現代におけるプロダクト開発とPHPを選定するワケ #phpkansai」
    • By @potato4d (PHPカンファレンス関西2017)
  • 小難しいことを考えずに簡単にWebアプリを書ける(HTML+α)の言語
    • なんだかんだいってWEB+DB連携がさくっとできる言語ランタイムとして
      の存在感は健在
  • 求められているのは素晴らしい言語ではなく簡単に使える言語

Page 59

PHP先生の
雑草のような生命力に
ご期待ください!