古い PHP を使うときに問題となりそうな箇所

あるバージョンの PHP を想定して書かれたコードをより古いバージョンの PHP で動作させないといけなくなったときに、問題になりそうな箇所を挙げる。

PHP 7.3 → 7.4

  • 配列のスプレッド構文
    • $a = [1, 2]; $b = [0, ...$a, 3, 4];
  • 矢印関数(ショートクロージャ
    • array_map(fn($n) => $n * $n, $a);
  • クラスのプロパティに対する型宣言
    • class C { protected int $id; }

PHP 7.0 → 7.1

  • file_get_contents() の第4引数 $offset のデフォルト値が -1 から 0 に変更された

PHP 5.6 → 7.0

  • 関数のプリミティブ型の型宣言
    • function getUserName(int $userId): ?string
  • 無名関数の直接呼び出し
    • (function() { ... })()
  • date() 関数や DateTime::format() でのフォーマット文字 v (ミリ秒) の追加
  • Null 合体演算子
    • $user = $_GET['user'] ?? 'nobody'; // isset($_GET['user']) ? $_GET['user'] : 'nobody';

PHP 5.5 → 5.6

  • 定数式
    • const ONE = 1; const TWO = ONE * 2;
  • ... による可変個引数関数
    • function f($req, $opt = null, ...$params) { ... }
  • ... による引数のアンパック
    • $arr = [2, 3]; f(1, ...$arr); // = f(1, 2, 3)
  • 累乗演算子 ** および代入演算子 **=
  • use function および use const
  • php://input が2回以上オープンできるように
  • hash_equals() 関数の追加
  • 処理が厳格になったもの
    • json_decode() が JSON の仕様通りに true, false, null は小文字のみ受け付けるようになった
    • Mcrypt 関数が有効なキーと IV を与えない場合、失敗するようになった
    • cURL で @file 構文によってアップロードできないようになった。代わりに CURLFile を使う
  • DateTime
    • DateTimeImmutable::createFromMutable() の追加
  • GMP
  • PDO
    • PDO::pgsqlGetNotify(), PDO::pgsqlGetPid() の追加
  • Session
    • session_abort(), session_reset() の追加
  • Zip
    • ZipArchive::setPassword() の追加

PHP 5.4 → 5.5

  • ジェネレータが追加されました。 yield キーワードで利用します。
  • try-catch ブロックで finally が使えるようになりました。
  • 新しいパスワードハッシュ API … password_hash(), password_needs_rehash(), password_verify() など
  • foreach で list() を使って、ネストした配列を個別の変数に展開できるようになりました。
  • empty() が変数以外の任意の式に対応
  • array リテラルと string リテラルデリファレンス
  • ::class によるクラス名の解決
  • foreach が非スカラーのキーに対応
  • array_column() 関数の追加
  • DateTimeImmutable クラスの追加
  • GD の改良

PHP 5.3 → 5.4

  • トレイトのサポート
  • 配列の短縮構文
    • $a = [1, 2, 3]; // array(1, 2, 3)
  • 関数の返り値を変数に格納することなく foo()[0] のように各要素にアクセスできる
  • クラスのインスタンスを変数に格納することなく (new Foo)->bar() のようにメンバーにアクセスできる
  • クロージャ内で $this が使用できる
  • 2進数の整数リテラル 0b001001101

PHP 5.3.8 → 5.3.9

PHP 5.2 → 5.3

  • 名前空間 のサポートが追加 namespace foo;
  • 遅延静的束縛 のサポートが追加 static::bar()
  • ネイティブクロージャ (ラムダ/無名関数) のサポートが追加
    • $f = function(...) {...};
  • json_encode() - 引数 options が追加
  • json_decode() - 引数 depth が追加
  • DateTime::add(), diff(), sub() などが追加
  • class DateInterval, DatePeriol 追加
  • SQLite3 モジュール (class SQLite3)
  • 定数 __DIR__

PHP 5.1 → 5.2

  • SplFileObject::getFilename() は、PHP 5.2.1 以降ではファイルへの相対パスではなくファイル名のみを返すようになりました。
  • __toString() が、適切な場面で常にコールされるようになりました。
  • 拡張モジュール JSON
  • クラス DateTime, DateTimeZone
  • date() 関数でのフォーマット文字 u (マイクロ秒) の追加