Page 1
“慈悲深いユニオン”とは何か
What's benevolent union?
pixiv Inc.
USAMI Kenta
PHP勉強会 in 神戸
2024-07-19 #関ガレ
公開日:
by USAMI Kenta@tadsan
“慈悲深いユニオン”とは何か
What's benevolent union?
pixiv Inc.
USAMI Kenta
PHP勉強会 in 神戸
2024-07-19 #関ガレ
お前誰よ
最近のプログラミング言語っぽい発表
さてみなさん
Now, everyone
静的解析は
好きですか?
Do you like static
type analysis?
<?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??
どうしてこの関数は失敗したら falseを返すのはなんで???
デプロイのミス
A-1.
要求されたファイルが
正しく配置されなかった
ファイルの存在
チェックしてない
A-2.
動的に生成されるファイルを
!le_exists()でチェックせずに
アクセスしてしまった この手法は潜在的なリスクがある…
<?php
if (!file_exists('data.json')) {
return;
}
// maybe safe
$v = file_get_contents('data.json');
var_dump(json_decode($v));
<?php
if (!file_exists('data.json')) {
この関数がfalseを返すこ
とはない… たぶん…
return;
おそらく… きっと…
}
// maybe safe?
$v = file_get_contents('data.json');
var_dump(json_decode($v));
$vが絶対にfalseに なっていないことを
<?php
アサーション(表明)
$v = file_get_contents('data.json');
assert($v !== false);
var_dump(json_decode($v));
実際にはfalseが返って
<?php
くる可能性を見て見ぬふり
/** @var string */
$v = file_get_contents('data.json');
var_dump(json_decode($v));
ほんとにfalse返すの?
Q. ところで !le_get_contents()
ほんとにほんとにfalse返すの?
実行時のハンドラー
設定に依存する
Q. 実行時のハンドラー設定に
依存する
状況整理
どういう状況が考えられるか
一度確認してみましょう
Gle_get_contents() が返すのは...
falseが返ってこないなら
<?php
この確認は常に無駄!
$v = file_get_contents('data.json');
assert($v !== false);
var_dump(json_decode($v));
本題
ここからがタイトルのネタ
“慈悲深いユニオン”とは何か
What's benevolent union?
pixiv Inc.
USAMI Kenta
PHP勉強会 in 神戸
2024-07-19 #関ガレ
謎の型
__benevolent<> は
PHPStanに実装された隠し機能
functionMap
TypeResolver
Test code
なんだこれ?
で、結局なにこれ????
これらの関数の共通点を
探ってみましょう
__benevolent<>が使われた関数の共通点は?
__benevolent<>って
結局どう動くの?
この型を使えば標準関数を
使いやすくするラッパーも作れる
便利っぽい…?
んだけど、使わないでね!
benevolent unionを濫用するな
安全性を保ち
コードの繰り返しを防ぐには?
この関数はFileSystemExceptionをthrowsする
PhpStormはハンドリングしない例外を警告する
benevolent unionよりも
構造化された例外を!!
みんなのコードでは
benevolent unionsを
使わないでね!
