Page 1
はじめてのPHPDocと型
My first PHPDoc and Type
2016-09-09 ピクシブ社内勉強会
公開日:
by USAMI Kenta@tadsan
に東京都のpixiv株式会社で開催された『ピクシブ社内勉強会』で社内勉強会(30分)として発表しました。
My first PHPDoc and Type
2016-09-09 ピクシブ社内勉強会
型とは何か
プログラミング言語が1 + [] (数字と配列のたしざん)みたいなのを叱れるようにする基盤
動かすとき(runtime)に調べるかが、静的型付きと動的型検査の大きな差
手さぐりで型を調べる
だけど数字だから足しざんできるね!」みたいな茶番を毎回やってる
静的検査
をとりながらPHPを書ける
やってれないことはない
// 絶対int返すマンfunction x() { return 1; }// 絶対array返すマンfunction y() { return []; }// たしざん// $n1, $n2 は数字っぽい値が欲しいfunction add($n1, $n2) { return $n1 + $2; }$a = x(); // x()がintを返すからたぶんintのはず$b = y(); // y()がarrayを返すからたぶんarrayのはず$c = add($a, $b);// 数字っぽい値以外を渡すとエラーが発生することは// 理窟の上では動かさなくても明らか
時間は最小限にできるとウレシイ
いいけど、現実は甘くない
// 絶対int返すマンfunction x() { return 1; }// 絶対array返すマンfunction y() { return []; }// たしざん// $n1, $n2 は数字っぽい値が欲しいfunction add($n1, $n2) { return $n1 + $2; }$a = x(); // x()がintを返すからたぶんintのはず$b = y(); // y()がarrayを返すからたぶんarrayのはず$c = add($a, $b);// 数字っぽい値以外を渡すとエラーが発生することは// 理窟の上では動かさなくても明らか
/** @return int */function x() { return 1; }/** @return array */function y() { return []; }/*** @param int $n1* @param int $n2*/function add($n1, $n2) { return $n1 + $2; }
PHPDoc
取得できる特別な形式のコメント
/** 〜 */ って書くと文字列になる
(/* では無効なので注意!!!!)
<?php/** こんにちは〜〜〜〜 */function hello() { throw new \Exception(); }$ref = new \ReflectionFunction('hello');echo $ref->getDocComment(), PHP_EOL;exit;
HTMLドキュメントを生成できる
PHPDocって形式がある
デファクト https://phpdoc.org/docs/latest/index.html
types.html
タグ名
意味
例
@param引数を定義@param int $n1
@return返り値を定義@return int[]
@var変数/プロパティを定義@var int
@propertyマジックプロパティを定義@property int $id
リストでもあり連想配列でもある
tadsanは連想配列をarrayと書く
mixed[] とか User[] みたいに書く
phpDocumentor2の仕様 (phpdoc.org)
PHPの型宣言
引数に特定のキーワードかクラス名を書くことができた
みたいな
書ける
みたいな単純な問題ではない
で呼び出したときにどうするの…?
<?php declare(strict_types=0);function myint(int $v) { return $v;}myint(1.1); // => 1 myint(true); // => 1 myint("1"); // => 1 myint(floatval(PHP_INT_MAX - 512)); // int(9223372036854774784)myint(12345678901234567890.0);// PHP Fatal error: Uncaught TypeError: Argument 1// passed to myint() must be of the type integer, float given myint("12345678901234567890");// PHP Fatal error: Uncaught TypeError: Argument 1// passed to myint() must be of the type integer, string given
Phan
型が違ってるところを指摘してくれる
詳しくしゃべってきます (30分枠)
