Upgrade to Pro — share decks privately, control downloads, hide ads and more …

PHP8.1で、リソースがオブジェクトに!? マイナーリリースの変更が レガシープロダクトに与...

hirobe
February 11, 2024
1.1k

PHP8.1で、リソースがオブジェクトに!? マイナーリリースの変更が レガシープロダクトに与えた影響

PHPConference関西2024LT資料です

hirobe

February 11, 2024
Tweet

Transcript

  1. 7 PHP8.1 の新機能! • ENUM型! • 読み取り専⽤プロパティ! • 引数デフォルト値にNew! •

    Finalクラス定数! などなど ※参考:https://www.php.net/releases/8.1/ja.php
  2. 8 PHP8.0 → PHP8.1への移⾏ 下位互換性のない変更 • $GLOBALS へのアクセス制限 • 継承したメソッド内で

    static 変数を使う • 必須の引数の前に、デフォルト値を持つ引数を指定した場合 • 内部クラスと戻り値の型の互換性 • 新しいキーワード • リソースからオブジェクトへの移⾏ ※参考:https://www.php.net/manual/ja/migration81.php
  3. 12 object移⾏によって⾏ったこと 今まで(PHP 8.0以前) $resource = pg_connect($connect_info) //接続成功時にresourceを返す is_resource($resource) //true

    これから(PHP8.1以降) $object = pg_connect($connect_info) //接続成功時にobjectを返す is_resource($object) //false
  4. 15 崩壊その1 DBへの接続処理判定に失敗し、SQLが実⾏されなくなる $connection = pg_connect($connect_info); // 接続成功時にobjectを返す if (is_resource($connection)){

    // false判定されるように! $result = pg_query_params($connection, $query, $params) } else { throw new DbConnectException(); // 必ず接続エラーに }
  5. 16 崩壊その2 SQLの実⾏結果判定に失敗し、結果があるのに結果なしと判定 $result = pg_query_params($connection, $query, $params); if (is_resource($result)){

    // false判定される! return pg_fetch_object($result) } else { return false; // 必ず結果なしになってしまう }
  6. 18 とはいえ、修正はそんなに難しくない is_resource()の判定を、falseかどうかの判定に変えればOK $result = pg_query_params($connection, $query, $params); if ($result

    !== false){ return pg_fetch_object($result) } else { return false; } まあそのis_resource()の使⽤箇所を調べるのが ⼤変だったりはしたのですが……
  7. 23 htmlspecialcharsのデフォルト値変更 以下の関数のデフォルト値が ENT_COMPAT → ENT_QUOTES | ENT_SUBSTITUTE に •

    htmlspecialchars() • htmlentities() • htmlspecialchars_decode() • html_entity_decode() • get_html_translation_table()