Page 1
“慈悲深いユニオン”とは何か
What's benevolent union?
pixiv Inc.
USAMI Kenta
PHP勉強会 in 神戸2024-07-19 #関ガレ
公開日:
by USAMI Kenta@tadsan
に兵庫県神戸市で開催された『PHP勉強会 in 神戸』でライトニングトーク(5分)として発表しました。
PHP勉強会 in 神戸2024-07-19 #関ガレ
お前誰よ
最近のプログラミング言語っぽい発表
(2月 PHPカンファレンス関西2024)
静的解析は好きですか?
<?php
$v = [1, 2, 3];echo json_decode($v);
<?php
$v = [1, 2, 3];echo json_decode($v);
<?php
$v = [1, 2, 3];echo json_encode($v);
<?php
$v = '[1, 2, 3]';var_dump(json_decode($v));
静的型検査万歳型チェッカーは常に愚かな我々に先んじてプログラムのミスを指摘してくれる… そうですよね?
次のスライドのコードはどうでしょうか?
<?php
$v = file_get_contents('data.json');var_dump(json_decode($v));
<?php
$v = file_get_contents('data.json');var_dump(json_decode($v));
なんでfalse??
デプロイのミス
A-1.要求されたファイルが正しく配置されなかった
ファイルの存在チェックしてない
この手法は潜在的なリスクがある…
<?php
if (!file_exists('data.json')) {return;}
// maybe safe$v = file_get_contents('data.json');var_dump(json_decode($v));
<?php
この関数がfalseを返すことはない… たぶん…おそらく… きっと…
if (!file_exists('data.json')) {return;}
// maybe safe?$v = file_get_contents('data.json');var_dump(json_decode($v));
$vが絶対にfalseになっていないことをアサーション(表明)
実際にはfalseが返ってくる可能性を見て見ぬふり
<?php
/** @var string */$v = file_get_contents('data.json');
var_dump(json_decode($v));
ほんとにfalse返すの?
実行時のハンドラー設定に依存する
状況整理
falseが返ってこないなら
この確認は常に無駄!
<?php
$v = file_get_contents('data.json');
assert($v !== false);var_dump(json_decode($v));
PHP勉強会 in 神戸2024-07-19 #関ガレ
謎の型
functionMap
TypeResolver
Test code
これらの関数の共通点を探ってみましょう
__benevolent<>が使われた関数の共通点は?
ので、呼び出し後に毎回型検査をするのは不毛
__benevolent<>って結局どう動くの?
この型を使えば標準関数を使いやすくするラッパーも作れる
便利っぽい…?んだけど、使わないでね!
に例外を発生させ、呼び出しコードを修正する。
き。Javaのチェック例外みたいに。
安全性を保ちコードの繰り返しを防ぐには?
benevolent unionよりも構造化された例外を!!
みんなのコードではbenevolent unionsを使わないでね!
