Page 1
Analyzing PHP
pixiv Inc.
USAMI Kenta
2023-08-30
TechFeed Expert Night
公開日:
by USAMI Kenta@tadsan
にオンラインのYouTube Liveで開催された『TechFeed Experts Night#24 〜 プログラミング言語をつくる・解析する ー 言語界隈をエキスパートが語る』で10分枠として発表しました。
Analyzing PHP
pixiv Inc.
USAMI Kenta
2023-08-30
TechFeed Expert Night
お前誰よ
emacs-php
PHPカンファレンス沖縄2023
LLイベント
PHPって
どんな言語?
みなさんの想像する
PHPとは
脆弱性 ゆるふわ 弱い型 動的
クソザコ 型なし 意味不明 弱い 自動変換 貧弱 Perlっぽい 適当
PHPについてのパブリックイメージ
脆弱性 ゆるふわ 弱い型 動的
クソザコ 型なし 意味不明 弱い 自動変換 貧弱 Perlっぽい 適当
PHPについての認識は概ね間違い
ソースコードで
見ると
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>
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>';
C
<?php declare(strict_types=1);
namespace Foo\Http\Controller;
class BooksController extends BaseController {
public function index() {
$books = Books::getAll();
$this->render(compact("books"));
}
}
P H P の原作者
ラスマスかく語りき
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
2007年 MySQL Conference
には プロパティも
“PHP protected
抽象メソッドもありますよ。計算機科学の
教授が「使え」と言ってるものは全部。
そんなことはクソ興味ないですけど
”
(tadsan )
–Rasmus Lerdorf
による超訳
変数に$があって
Perlっぽくて
C言語っぽい
関数と
-> があって
雰囲気Javaっぽい オブジェクト指向で
PHPは見る人の心を映す
整理しましょう
PHPは汎用プログラミング言語
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>';
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>';
現在でも動くCGI
言語としてのPHP
PHPの実行フロー
仮想機械?
I am CPU.
つまり?
自分のことをCPU だと思い込んだ象
CPUの言葉でしゃべれ
Zend Engine
オ ペ コ ー ド
opcode
PHPはオペコードにコンパイルされる
<?php
echo 1; ECHO 1
PHPはオペコードにコンパイルされる
<?php
echo 'foo'; ECHO 'foo'
PHPはオペコードにコンパイルされる
<?php
print 'foo'; ECHO 'foo'
PHPはオペコードにコンパイルされる
<?php
echo 1 + 2; ECHO 3
PHPはオペコードにコンパイルされる
<?php
$a = 1; ASSIGN !0, 1
ADD ~2 !0, 2
echo $a + 2;
ECHO ~2
opcodeでおk
<?php echo "foo";
ECHO 'foo'
なんで
こんなことするの
PHP
高度な構文解析が必要 な高級なシンタックス
opcode
構文解析不要な
シンプルな命令セット
分けて開発することで
最適化しやすくなる
PHPと型宣言
PHPとDocComment型注釈
静的解析しやすい特徴
PHPの進化は 型宣言の進化
いまやPHPは
静的型付きと言っても
過言ではない
(本当か…?)
型がついていない関数(PHP5)
function add($a, $b) {
return $a + $b;
}
スカラー型宣言(PHP7)
int + intって
本当にintなの?
function add(int $a, int $b): int {
return $a + $b;
}
広い値をとるにはfloatが必要
ひとつの解決策では
あるが… 不必要に5oat
を強制するのか
function add(float $a, float $b): float {
return $a + $b;
}
PHPDocの型注釈
(アノテーション)
/**
* @param int|float $a
あえて型宣言を省略する
* @param int|float $b
* @return int|float
*/
function add($a, $b) {
return $a + $b;
}
ユニオン型宣言 (PHP8.0)
function add(int|float $a, int|float $b): int|float {
return $a + $b;
}
LL言語としてのPHP vs エディタ
PHPと静的解析
PHP Static Analysis Tool
PHPStanとは
PHPStanの提供する型
PHP処理系
PHPの開発体制
EmacsとPHP
Emacs PHP Modeのサポート範囲
php-modeの未解決issue
最近のEmacs
php-ts-mode
