はじめに
PHP8とそれ以前の過去バージョンを比較して変更点をまとめました。
PHPのアップデート対応をするときに参考になると思うので、ご活用ください。
1. コンストラクタの変更
PHP5以前のバージョンでは、クラス名と同じ名前のメソッドがコンストラクタとして使われていました。PHP7以降では、__construct メソッドがコンストラクタとして標準化されています。
修正前:
class MyClass {
function MyClass() {
// コンストラクタの処理
}
}
修正後:
class MyClass {
function __construct() {
// コンストラクタの処理
}
}
2. mysql_* 関数の廃止
PHP7.0で mysql_* 関数は廃止され、代わりに mysqli_* または PDO(PHP Data Objects)が推奨されています。
修正前:
$link = mysql_connect("localhost", "user", "password");
$result = mysql_query("SELECT * FROM table");
修正後:
$link = mysqli_connect("localhost", "user", "password", "database");
$result = mysqli_query($link, "SELECT * FROM table");
または
$pdo = new PDO('mysql:host=localhost;dbname=database', 'user', 'password');
$stmt = $pdo->query("SELECT * FROM table");
3. エラーレポートの変更
PHP7.0から、エラーレポートのデフォルト設定が変更され、より厳密になっています。これにより、一部のコードがエラーを発生させる可能性があります。例えば、以前は警告として処理されていたものが、例外としてスローされる場合があります。
修正前:
ini_set('display_errors', 1);
error_reporting(E_ALL);
修正後:
エラーハンドリングの改善やログ設定を見直してください。
4. 型宣言の強化
PHP7.0以降、型宣言が強化され、より厳格な型チェックが行われるようになりました。関数の引数や戻り値に型宣言を追加する必要があります。
修正前:
function add($a, $b) {
return $a + $b;
}
修正後:
function add(int $a, int $b): int {
return $a + $b;
}
5. null 合体演算子の追加
PHP7.0から ?? 演算子(null 合体演算子)が追加されました。これにより、変数が存在するかどうかをチェックする簡潔な方法が提供されます。
修正前:
$value = isset($array['key']) ? $array['key'] : 'default';
修正後:
$value = $array['key'] ?? 'default';
6. is_null() 関数の動作変更
PHP7.0から、is_null() 関数は厳密に NULL かどうかをチェックします。変数が未定義でも NULL として扱われますが、より明確なコードを書くことが推奨されます。
修正前:
if (is_null($variable)) {
// 処理
}
修正後:
変数が存在するかどうかを先に確認することが推奨されます。
7. __toString() メソッドの変更
PHP7.0以降、__toString() メソッドは必ず文字列を返す必要があります。文字列以外の値を返すとエラーになります。
修正前:
class MyClass {
public function __toString() {
return 123; // 整数
}
}
修正後:
class MyClass {
public function __toString() {
return '123'; // 文字列
}
}
8. call_user_func_array() の変更
PHP7.0では call_user_func_array() がより厳密に型チェックを行います。関数呼び出し時に引数の型が一致するように修正が必要です。
修正前:
function test($a, $b) {
return $a + $b;
}
call_user_func_array('test', [1, 2]);
修正後:
型宣言を追加し、引数の一致を確認します。
9. 名前付き引数のサポート
PHP8.0から名前付き引数がサポートされるようになりました。関数の引数を名前で指定することができますが、PHP7.xではサポートされていません。
PHP8.0以降:
function greet($name, $age) {
echo "Name: $name, Age: $age";
}
greet(age: 30, name: "John");
10. その他の変更
- デフォルトのエラーレベルの変更
- コンストラクタのインヘリタンスの動作変更
- 抽象メソッドとインターフェースの厳格化
- セッションハンドラの動作変更
これらの変更に対処することで、PHP8へのアップデート後もコードが正常に動作し、より良いパフォーマンスとセキュリティを確保できます。アップデート前にこれらの修正点を確認し、適切な対応を行うことが重要です。