PHPの成功と失敗

公開日:

福岡市中央区大名Wework 大名(PR TIMES 福岡サテライトオフィス)で開催された『【非公式】PHPカンファレンス福岡・前日Meetup』でライトニングトーク(5分)として発表しました。

Download PDF

スライドテキスト

Page 1

PHPの成功と失敗

Let's talk successes and failures in PHP applications

pixiv Inc.
USAMI Kenta

2022-06-23

【非公式】PHPカンファレンス福岡・前日Meetup

Page 2

お前誰よ

  • うさみけんた (@tadsan) / Zonu.EXE / にゃんだーすわん
  • ピクシブ株式会社 pixiv事業本部 エンジニア
    • 最近はピクシブ百科事典(dic.pixiv.net)を開発しています
  • Emacs Lisper, PHPer
    • Emacs PHP Modeを開発しています (2017年-)
  • プログラミング言語にちょっとこだわりのある素人

Page 3

さて

Page 4

😎
サクセスしたい
ですか?

Page 5

???
「PHPをご存じか?」

Page 6

世界で最も成功した プログラミング言語

Page 7

多くの「失敗」を抱えた
プログラミング言語

Page 8

……という話は ここで終了です

Page 9

本題

Page 10

今回のお題

Page 11

あなたのコードは
「絶対に」正常に
動きますか?

Page 12

成功と失敗を考える

Page 13

検索して1件も
レコードがなれば
失敗か?

Page 14

場合による!

Page 15

プログラムが期待通り
に動かないことを
失敗と捉える

Page 16

もうちょっと抽象的に

Page 17

あなたのプログラムはいつ動かない?

  • A. 基本的には絶対動く (コンピュータやOSが正常動作する限り)
  • B. コンピュータが意図してない状態に陥ってない限りは動く
  • C. 通信先のDB/APIが動いてる限りは動く
  • D. ちゃんと正規の手順でセットアップしてくれる限りは動く

Page 18

絶対動くプログラム

(基本的に)

  • echo "Hello"
  • var_dump(1 + 1)
  • count([1, 2, 3])

Page 19

PCの環境が整っている限りは動く

  • 'le_get_contents($path) // ファイルがあれば動く
  • 'le_put_contents($path, $body) // ディスクに書き込めれば
  • ネットワークが…

Page 20

通信先の問題がなければ動く

  • 接続先のデータベースが過負荷状態で応答しない
  • 接続先のAPIが何らかの問題で応答しない
  • 接続先との間のネットワークが詰まっている
    • これらの問題はこちらでは対処できない

Page 21

想定通りの前提が揃っていれば

  • 通信のためにAPIキーを環境変数でセットしておく必要がある
  • メソッド呼び出し前に正規のオプションをセットしていれば動く
  • php.ini におかしな設定が入っていなければ動く
    • 存在しないextensionを読み込もうとしてないかとか

Page 22

想定していない
事態にどう対処するか

Page 23

file_get_contents($path)

Page 24

PHP標準関数はどうするか

  • 失敗がありうる関数は、型としては |false のような型がつけられている
  • 例: 'le_get_contents() などを含む
  • ただし、内部的にはエラーを発生させられる
    • そして発生したエラーはエラーハンドラーで握り潰される可能性がある
    • falseが返ってくるかどうかは環境による(!)

Page 25

エラーとは

  • throwできる例外とは別にエラーというものがある
    • PHP7で追加されたErrorとは別物(!)
  • 発生したエラーはset_error_handler()でカスタマイズできる
  • エラーのままでは扱いにくいのでErrorExceptionに変換するといい

Page 26

例外とは

  • throwできるオブジェクト
  • 例外が発生する可能性がある処理をcatchで括ると補足できる
  • どのcatchにも捕捉されなかった例外はset_exception_handler()で
    カスタマイズできる
    • Webサイトの共通エラー画面を表示するのに使える

Page 27

@throws

  • ある関数メソッドを呼び出すと例外が発生することを使用者に示す
    • そのメソッドを呼び出して発生するおそれのある例外を捕捉して対処するこ
      とを例外ハンドリンクという
  • Javaのthrowsと検査例外(チェック例外)を模倣したもの
    • 静的解析ツールやPhpStormは@throwsがあるメソッド呼び出しに対し
      て、try-catchがなければハンドリングすることを要求する

Page 28

ユニオン型による失敗の表現

  • function searchBooks($name): ?Book
    • 検索がヒットしなければnullを返す
    • ユニオン型だけで失敗を表現すると、どうすればいいのか情報不足になりが

Page 29

ユニオン型+throwsによる失敗表現

  • /**
    * @throws SearchEngineErrorException
    */
    function searchBook($name): ?Book
    • 検索がヒットしなければnullを返す
    • 検索エンジンに異常事態があれば例外を示す

Page 30

ユニオン型+throwsによる失敗表現

  • /**
    * @throws SearchEngineErrorException
    */
    function searchBook($name): ?Book
    • 検索がヒットしなければnullを返す
    • 検索エンジンに異常事態があれば例外を示す

Page 31

リスト+throwsによる失敗表現

  • /**
    * @throws SearchEngineErrorException
    */
    function searchBook($name): array
    • 検索がヒットしなければnullを返す
    • 検索エンジンに異常事態があれば例外を示す

Page 32

ユニオン型+throwsによる失敗表現

  • /**
    * @throws SearchEngineErrorException
    */
    function searchBook($name): ?Book
    • 検索がヒットしなければnullを返す
    • 検索エンジンに異常事態があれば例外を示す

Page 33

例外を含むユニオン型

  • function searchBooks($name): Book|NotFound|DBError
    • 検索がヒットすればnullを返す
    • 検索がヒットしなければNotFoundを返す
    • DBが異常ならDBErrorを返す

Page 34

その他