WordPressでPHP8.0以上にアップデートすると使えなくなるPHPタグ

WordPressのサイト運営において、PHPのバージョンアップは
性能向上やセキュリティ強化にとって重要です。
しかし、PHPのバージョンを8.0以上に上げると、
一部の古いPHPタグや関数が非推奨または削除され、
サイトが正常に動作しなくなる可能性があります。
本記事では、PHP8.0以上にアップデートした際に使えなくなる主要な
PHPタグや関数について解説します。

非推奨および削除されたPHPタグや関数

create_function()

create_function()は、無名関数を作成するための関数ですが、
PHP7.2以降で非推奨となり、PHP8.0で削除されました。
この関数を使っているコードは、anonymous functions(無名関数)や
arrow functions(矢印関数)に書き換える必要があります。

// 非推奨のコード
$callback = create_function('$a', 'return $a * 2;');

// 修正後のコード
$callback = function($a) {
    return $a * 2;
};

each()

each()関数は配列の要素を順番に返すために使われていましたが、
PHP7.2で非推奨となり、PHP8.0で削除されました。
この関数を使っているコードは、foreachループに置き換える必要があります。

例:

// 非推奨のコード
while (list($key, $value) = each($array)) {
echo "$key: $value\n";
}

// 修正後のコード
foreach ($array as $key => $value) {
echo "$key: $value\n";
}

split()

split()関数は正規表現を用いた文字列分割に使われていましたが、
PHP7.0で非推奨となり、PHP8.0で削除されました。
代わりにpreg_split()を使用します。

例:

// 非推奨のコード
$parts = split('/\s+/', $string);

// 修正後のコード
$parts = preg_split('/\s+/', $string);

mysql_*関数

mysql_*関数群はPHP5.5で非推奨となり、PHP7.0で削除されましたが、
まだ古いコードでは使用されていることがあります。
これらの関数はmysqli_*関数またはPDOに置き換える必要があります。

例:

// 非推奨のコード
$connection = mysql_connect($host, $user, $password);

// 修正後のコード(MySQLi)
$connection = mysqli_connect($host, $user, $password);

// 修正後のコード(PDO)
$connection = new PDO("mysql:host=$host;dbname=$dbname", $user, $password);

get_category()

get_category()関数はカテゴリオブジェクトを取得するために使用されますが、
PHP8.0以降ではより安全で推奨される方法を使用することが求められます。
特に、キャッシュを考慮した関数への変更が推奨されます。

例:

// 推奨されないコード
$category = get_category($cat_id);

// 推奨されるコード
$category = get_term($cat_id, 'category');

カテゴリリストの取得

カテゴリリストを取得する際には、
従来のwp_list_categories()関数を引き続き使用することができますが、
オプション設定やエスケープ処理に注意が必要です。

例:

// カテゴリリストの出力(従来の方法)
wp_list_categories();

// エスケープ処理を追加した安全な方法
$categories = get_categories();
foreach ($categories as $category) {
echo esc_html($category->name);
}

ereg()eregi()、および ereg_replace()

これらの関数は正規表現による文字列検索や置換に使用されていましたが、
PHP 7.0で削除されました。
代わりにpreg_match()preg_replace()などのPCRE関数を使用します。

例:

// 非推奨のコード
if (ereg("^[a-zA-Z0-9_]+$", $string)) {
echo "Valid string";
}

// 修正後のコード
if (preg_match("/^[a-zA-Z0-9_]+$/", $string)) {
echo "Valid string";
}

get_magic_quotes_gpc()

get_magic_quotes_gpc()関数はPHP 5.4で非推奨となり、
PHP 7.0で削除されました。
代わりに、手動でエスケープ処理を行う必要があります。

例:

// 非推奨のコード
if (get_magic_quotes_gpc()) {
$string = stripslashes($string);
}

// 修正後のコード
$string = addslashes($string);

implode()の順序変更

PHP 7.4以前では、implode()関数の引数の順序が厳密ではありませんでしたが、
PHP 8.0では引数の順序が厳密にチェックされます。

例:

// 非推奨のコード(PHP 7.4以前では動作するが、PHP 8.0ではエラー)
$glue = ', ';
$array = ['apple', 'banana', 'cherry'];
echo implode($array, $glue);

// 修正後のコード
echo implode($glue, $array);

strrpos()の非推奨の使い方

PHP 8.0では、strrpos()関数のneedleに空文字列を渡すことが非推奨となりました。

例:

// 非推奨のコード
$position = strrpos($haystack, '');

// 修正後のコード
$position = $haystack !== '' ? strrpos($haystack, '') : false;

assert()の変更

PHP 8.0では、assert()関数の挙動が変更され、常に有効な評価式が必要となります。
また、assert()の実行時にはエラーが発生する場合があります。

例:

// 非推奨のコード
assert('$a === $b');

// 修正後のコード
assert($a === $b);

get_called_class()の使用制限

PHP 8.0では、get_called_class()関数はオブジェクトコンテキスト内でのみ呼び出すことができます。
スタティックコンテキストでは使用できません。

例:

// 非推奨のコード
class Foo {
public static function bar() {
return get_called_class();
}
}

// 修正後のコード
class Foo {
public static function bar() {
return static::class;
}
}

list()の括弧の使用

PHP 7.1以降、list()構文で括弧の省略が非推奨となり、PHP 8.0で削除されました。
括弧を使用する必要があります。

例:

// 非推奨のコード
list($a, $b) = [1, 2];

// 修正後のコード
[$a, $b] = [1, 2];

ob_start()のハンドラの引数

PHP 8.0では、ob_start()のハンドラに引数を渡すことが非推奨となりました。

例:

// 非推奨のコード
ob_start('output_handler', 4096, PHP_OUTPUT_HANDLER_STDFLAGS);

// 修正後のコード
ob_start('output_handler');

image2wbmp()

PHP 8.0では、image2wbmp()関数の引数の順序が変更されました。

例:

// 非推奨のコード
image2wbmp($image, $filename, $threshold);

// 修正後のコード
image2wbmp($image, $filename, (int)$threshold);

implode()の逆引数の順序

PHP 8.0では、implode()関数の引数の順序が逆になっています。

例:

// 非推奨のコード
echo implode($array, $glue);

// 修正後のコード
echo implode($glue, $array);

mbstringのエンコーディング検出

PHP 8.0では、mbstring拡張の一部関数が非推奨となり、エンコーディングの検出が変更されました。

例:

// 非推奨のコード
$encoding = mb_detect_encoding($str, "auto");

// 修正後のコード
$encoding = mb_detect_encoding($str);

define()の定数名に数字のみを使用

PHP 8.0では、define()で数字のみの定数名を使用することが禁止されました。

例:

// 非推奨のコード
define('123', 'value');

// 修正後のコード
define('CONST_123', 'value');

strtolower()およびstrtoupper()のエラーハンドリング

PHP 8.0では、strtolower()およびstrtoupper()関数に無効な文字列を渡すと、エラーが発生します。

例:

// 非推奨のコード
echo strtolower(null); // エラー

// 修正後のコード
$input = null;
echo $input !== null ? strtolower($input) : '';

array_key_exists()nullを渡す

PHP 8.0では、array_key_exists()関数の引数にnullを渡すと、エラーが発生します。

例:

// 非推奨のコード
array_key_exists(null, $array); // エラー

// 修正後のコード
$key = null;
if ($key !== null && array_key_exists($key, $array)) {
// 処理
}

compact()関数の変更

PHP 8.0では、compact()関数に無効な変数名を渡すと、エラーが発生します。

例:

// 非推奨のコード
$var = 'value';
compact('var', 'nonexistent'); // エラー

// 修正後のコード
$var = 'value';
compact('var'); // 正しい使用法

count()関数のエラーハンドリング

PHP 8.0では、count()関数に無効な引数(例えばnull)を渡すと、エラーが発生します。

例:

// 非推奨のコード
count(null); // エラー

// 修正後のコード
$array = null;
echo is_array($array) ? count($array) : 0;

fgetcsv()のパラメータの変更

PHP 8.0では、fgetcsv()関数の第3引数escapeが必須になりました。

例:

// 非推奨のコード
$csv = fopen('file.csv', 'r');
while (($data = fgetcsv($csv, 1000, ",")) !== FALSE) {
// 処理
}

// 修正後のコード
$csv = fopen('file.csv', 'r');
while (($data = fgetcsv($csv, 1000, ",", '"', "\\")) !== FALSE) {
// 処理
}

gettype()関数の変更

PHP 8.0では、gettype()関数がresource型の返り値としてresource (closed)を返すようになりました。

例:

// 非推奨のコード
$type = gettype(fopen('file.txt', 'r'));
// 'resource'

// 修正後のコード
$type = gettype(fopen('file.txt', 'r'));
// 'resource (closed)' など、返り値に注意

get_magic_quotes_runtime()set_magic_quotes_runtime()

これらの関数はPHP 5.4で非推奨となり、PHP 7.0で削除されましたが、まだ古いコードでは使用されていることがあります。これらは完全に削除されました。

例:

// 非推奨のコード
set_magic_quotes_runtime(0);

// 修正不要(機能自体が削除されたため)

realpath_cache_size

PHP 8.0では、realpath_cache_sizeディレクティブが削除されました。このディレクティブを設定しているphp.iniの設定を見直す必要があります。

例:

; 非推奨の設定
realpath_cache_size = 16k

; 修正後の設定(削除)
; realpath_cache_size = 16k

implode()の引数順序の厳密化

PHP 8.0では、implode()関数の引数の順序が厳密にチェックされます。

例:

// 非推奨のコード
echo implode($array, $glue); // 引数の順序が逆

// 修正後のコード
echo implode($glue, $array);

strrpos()の変更

PHP 8.0では、strrpos()関数に空の検索文字列を渡すことが禁止されました。

例:

// 非推奨のコード
$pos = strrpos($haystack, '');

// 修正後のコード
$pos = $haystack !== '' ? strrpos($haystack, '') : false;

image2wbmp()関数の引数順序変更

PHP 8.0では、image2wbmp()関数の引数の順序が変更されました。

例:

// 非推奨のコード
image2wbmp($image, $filename, $threshold);

// 修正後のコード
image2wbmp($image, $filename, (int)$threshold);

ob_start()の変更

PHP 8.0では、ob_start()のコールバックハンドラに引数を渡すことが非推奨となりました。

例:

// 非推奨のコード
ob_start('output_handler', 4096, PHP_OUTPUT_HANDLER_STDFLAGS);

// 修正後のコード
ob_start('output_handler');

array_key_exists()の変更

PHP 8.0では、array_key_exists()関数の引数にnullを渡すことが禁止されました。

例:

// 非推奨のコード
array_key_exists(null, $array);

// 修正後のコード
$key = null;
if ($key !== null && array_key_exists($key, $array)) {
// 処理
}

compact()の変更

PHP 8.0では、compact()関数に無効な変数名を渡すとエラーが発生します。

例:

// 非推奨のコード
$var = 'value';
compact('var', 'nonexistent'); // エラー

// 修正後のコード
$var = 'value';
compact('var'); // 正しい使用法

count()の変更

PHP 8.0では、count()関数に無効な引数(例えばnull)を渡すとエラーが発生します。

例:

// 非推奨のコード
count(null); // エラー

// 修正後のコード
$array = null;
echo is_array($array) ? count($array) : 0;

fgetcsv()の変更

PHP 8.0では、fgetcsv()関数の第3引数escapeが必須になりました。

例:

// 非推奨のコード
$csv = fopen('file.csv', 'r');
while (($data = fgetcsv($csv, 1000, ",")) !== FALSE) {
// 処理
}

// 修正後のコード
$csv = fopen('file.csv', 'r');
while (($data = fgetcsv($csv, 1000, ",", '"', "\\")) !== FALSE) {
// 処理
}

gettype()の変更

PHP 8.0では、gettype()関数がresource型の返り値としてresource (closed)を返すようになりました。

例:

// 非推奨のコード
$type = gettype(fopen('file.txt', 'r'));
// 'resource'

// 修正後のコード
$type = gettype(fopen('file.txt', 'r'));
// 'resource (closed)' など、返り値に注意

assert()の変更

PHP 8.0では、assert()関数の仕様が変更され、常に有効な評価式が必要となります。
また、assert()の実行時にはエラーが発生する場合があります。

例:

// 非推奨のコード
assert('$a === $b');

// 修正後のコード
assert($a === $b);

convert_cyr_string()

PHP 7.4で非推奨となり、PHP 8.0で削除されました。
代替手段として、マルチバイト文字列関数(mb_convert_encoding())を使用します。

例:

// 非推奨のコード
$newstr = convert_cyr_string($str, 'w', 'a');

// 修正後のコード
$newstr = mb_convert_encoding($str, 'koi8-r', 'windows-1251');

restore_include_path()

restore_include_path()関数はPHP 8.0で削除されました。
代わりにset_include_path()を使用して明示的に設定を変更する必要があります。

例:

// 非推奨のコード
restore_include_path();

// 修正後のコード
set_include_path(get_include_path());

create_function()の削除

create_function()はPHP 7.2で非推奨となり、PHP 8.0で削除されました。
代わりに無名関数を使用します。

例:

// 非推奨のコード
$callback = create_function('$a', 'return $a * 2;');

// 修正後のコード
$callback = function($a) {
return $a * 2;
};

each()関数の削除

each()関数はPHP 7.2で非推奨となり、PHP 8.0で削除されました。
代わりにforeachループを使用します。

例:

// 非推奨のコード
while (list($key, $value) = each($array)) {
echo "$key: $value\n";
}

// 修正後のコード
foreach ($array as $key => $value) {
echo "$key: $value\n";
}

mbstringのエンコーディング検出の変更

PHP 8.0では、mbstring拡張の一部関数が非推奨となり、エンコーディングの検出が変更されました。

例:

// 非推奨のコード
$encoding = mb_detect_encoding($str, "auto");

// 修正後のコード
$encoding = mb_detect_encoding($str);

strrpos()の非推奨の使い方

PHP 8.0では、strrpos()関数のneedleに空文字列を渡すことが非推奨となりました。

例:

// 非推奨のコード
$position = strrpos($haystack, '');

// 修正後のコード
$position = $haystack !== '' ? strrpos($haystack, '') : false;

set_socket_blocking()

set_socket_blocking()は非推奨となり、代わりにstream_set_blocking()を使用します。

例:

// 非推奨のコード
set_socket_blocking($socket, false);

// 修正後のコード
stream_set_blocking($socket, false);

hebrevc()

PHP 8.0では、hebrevc()関数が削除されました。
代わりに、より汎用的な文字列操作関数を使用します。

例:

// 非推奨のコード
echo hebrevc("טקסט בעברית");

// 修正後のコード
echo strrev("טקסט בעברית");

mysqli_real_escape_string()のパラメータ変更

PHP 8.0では、mysqli_real_escape_string()のパラメータが変更されました。
エスケープする前に必ず接続リソースをチェックする必要があります。

例:

// 非推奨のコード
$escaped_string = mysqli_real_escape_string($string);

// 修正後のコード
$escaped_string = mysqli_real_escape_string($link, $string);

create_function()の削除

create_function()はPHP 7.2で非推奨となり、PHP 8.0で削除されました。
代わりに無名関数を使用します。

例:

// 非推奨のコード
$callback = create_function('$a', 'return $a * 2;');

// 修正後のコード
$callback = function($a) {
return $a * 2;
};

each()関数の削除

each()関数はPHP 7.2で非推奨となり、PHP 8.0で削除されました。
代わりにforeachループを使用します。

例:

// 非推奨のコード
while (list($key, $value) = each($array)) {
echo "$key: $value\n";
}

// 修正後のコード
foreach ($array as $key => $value) {
echo "$key: $value\n";
}

split()関数の削除

split()関数はPHP 7.0で削除されました。
代わりにpreg_split()を使用します。

例:

// 非推奨のコード
$parts = split('/\s+/', $string);

// 修正後のコード
$parts = preg_split('/\s+/', $string);

virtual()関数の削除

virtual()関数はPHP 7.0で削除されました。
この関数はApacheのサーバサイドインクルード(SSI)を呼び出すために使用されました。

例:

// 非推奨のコード
virtual('/header.html');

// 修正不要(機能自体が削除されたため)

mbregex拡張の変更

PHP 8.0では、mbregex拡張の一部関数が削除されました。
代替手段として、標準のPCRE関数を使用します。

例:

// 非推奨のコード
mb_ereg("pattern", $string);

// 修正後のコード
preg_match("/pattern/", $string);

image2wbmp()関数の引数順序変更

PHP 8.0では、image2wbmp()関数の引数の順序が変更されました。

例:

// 非推奨のコード
image2wbmp($image, $filename, $threshold);

// 修正後のコード
image2wbmp($image, $filename, (int)$threshold);

fgetcsv()の変更

PHP 8.0では、fgetcsv()関数の第3引数escapeが必須になりました。

例:

// 非推奨のコード
$csv = fopen('file.csv', 'r');
while (($data = fgetcsv($csv, 1000, ",")) !== FALSE) {
// 処理
}

// 修正後のコード
$csv = fopen('file.csv', 'r');
while (($data = fgetcsv($csv, 1000, ",", '"', "\\")) !== FALSE) {
// 処理
}

implode()の引数順序の厳密化

PHP 8.0では、implode()関数の引数の順序が厳密にチェックされます。

例:

// 非推奨のコード
echo implode($array, $glue); // 引数の順序が逆

// 修正後のコード
echo implode($glue, $array);

strrpos()の変更

PHP 8.0では、strrpos()関数に空の検索文字列を渡すことが禁止されました。

例:

// 非推奨のコード
$pos = strrpos($haystack, '');

// 修正後のコード
$pos = $haystack !== '' ? strrpos($haystack, '') : false;

ob_start()の変更

PHP 8.0では、ob_start()のコールバックハンドラに引数を渡すことが非推奨となりました。

例:

// 非推奨のコード
ob_start('output_handler', 4096, PHP_OUTPUT_HANDLER_STDFLAGS);

// 修正後のコード
ob_start('output_handler');

array_key_exists()の変更

PHP 8.0では、array_key_exists()関数の引数にnullを渡すことが禁止されました。

例:

// 非推奨のコード
array_key_exists(null, $array);

// 修正後のコード
$key = null;
if ($key !== null && array_key_exists($key, $array)) {
// 処理
}

compact()の変更

PHP 8.0では、compact()関数に無効な変数名を渡すとエラーが発生します。

例:

// 非推奨のコード
$var = 'value';
compact('var', 'nonexistent'); // エラー

// 修正後のコード
$var = 'value';
compact('var'); // 正しい使用法

count()の変更

PHP 8.0では、count()関数に無効な引数(例えばnull)を渡すとエラーが発生します。

例:

// 非推奨のコード
count(null); // エラー

// 修正後のコード
$array = null;
echo is_array($array) ? count($array) : 0;

restore_include_path()

restore_include_path()関数はPHP 8.0で削除されました。
代わりにset_include_path()を使用して明示的に設定を変更する必要があります。

例:

// 非推奨のコード
restore_include_path();

// 修正後のコード
set_include_path(get_include_path());

strtolower()およびstrtoupper()のエラーハンドリング

PHP 8.0では、strtolower()およびstrtoupper()関数に無効な文字列を渡すと、エラーが発生します。

例:

// 非推奨のコード
echo strtolower(null); // エラー

// 修正後のコード
$input = null;
echo $input !== null ? strtolower($input) : '';

gettype()の変更

PHP 8.0では、gettype()関数がresource型の返り値としてresource (closed)を返すようになりました。

例:

// 非推奨のコード
$type = gettype(fopen('file.txt', 'r'));
// 'resource'

// 修正後のコード
$type = gettype(fopen('file.txt', 'r'));
// 'resource (closed)' など、返り値に注意

hebrevc()の削除

hebrevc()関数はPHP 8.0で削除されました。代わりに、文字列操作関数を使用する必要があります。

例:

// 非推奨のコード
echo hebrevc("טקסט בעברית");

// 修正後のコード
echo strrev("טקסט בעברית");

mbregex拡張の削除

PHP 8.0では、mbregex拡張の一部関数が削除されました。
代替手段として、標準のPCRE関数を使用します。

例:

// 非推奨のコード
mb_ereg("pattern", $string);

// 修正後のコード
preg_match("/pattern/", $string);

is_real()の削除

PHP 8.0では、is_real()関数が削除されました。
代わりに、is_float()を使用します。

例:

// 非推奨のコード
if (is_real($var)) {
// 処理
}

// 修正後のコード
if (is_float($var)) {
// 処理
}

stream_context_set_option()の変更

PHP 8.0では、stream_context_set_option()関数の引数が厳密にチェックされるようになりました。

例:

// 非推奨のコード
stream_context_set_option($context, 'ssl', 'verify_peer', false);

// 修正後のコード
stream_context_set_option($context, ['ssl' => ['verify_peer' => false]]);

hash_init()の変更

PHP 8.0では、hash_init()関数の第2引数にnullを渡すことが禁止されました。

例:

// 非推奨のコード
$context = hash_init('md5', null);

// 修正後のコード
$context = hash_init('md5');

mysqli_stmt::bind_result()の変更

PHP 8.0では、mysqli_stmt::bind_result()メソッドの引数にnullを渡すことが禁止されました。

例:

// 非推奨のコード
$stmt->bind_result($column1, null, $column3);

// 修正後のコード
$stmt->bind_result($column1, $dummy, $column3);

xml_parse()の変更

PHP 8.0では、xml_parse()関数の第3引数にnullを渡すことが禁止されました。

例:

// 非推奨のコード
xml_parse($parser, $data, null);

// 修正後のコード
xml_parse($parser, $data, true);

get_cfg_var()の変更

PHP 8.0では、get_cfg_var()関数の引数が厳密にチェックされるようになりました。

例:

// 非推奨のコード
$value = get_cfg_var(null);

// 修正後のコード
$value = get_cfg_var('cfg_var_name');

openssl_x509_read()の変更

PHP 8.0では、openssl_x509_read()関数の引数に無効な証明書を渡すと、エラーが発生します。

例:

// 非推奨のコード
$cert = openssl_x509_read($invalid_cert);

// 修正後のコード
if ($cert !== false) {
// 処理
}

extract()の変更

PHP 8.0では、extract()関数に無効な変数名を渡すと、エラーが発生します。

例:

// 非推奨のコード
extract(['1invalid' => 'value']); // エラー

// 修正後のコード
extract(['valid' => 'value']);

fputs()の削除

PHP 8.0では、fputs()関数が削除されました。
代わりに、fwrite()を使用します。

例:

// 非推奨のコード
fputs($fp, $data);

// 修正後のコード
fwrite($fp, $data);

gzgetss()の削除

PHP 8.0では、gzgetss()関数が削除されました。
代わりに、gzgets()を使用してからstrip_tags()を使用します。

例:

// 非推奨のコード
$data = gzgetss($gz, 4096);

// 修正後のコード
$data = strip_tags(gzgets($gz, 4096));

imap_header()の変更

PHP 8.0では、imap_header()関数がimap_headerinfo()に置き換えられました。

例:

// 非推奨のコード
$header = imap_header($imap_stream, $msg_number);

// 修正後のコード
$header = imap_headerinfo($imap_stream, $msg_number);

ldap_sort()の削除

PHP 8.0では、ldap_sort()関数が削除されました。
代わりに、検索結果を手動でソートする必要があります。

例:

// 非推奨のコード
ldap_sort($link_identifier, $result_identifier, 'attribute');

// 修正後のコード
// 手動でソートするコードを追加

imap_timeout()の変更

PHP 8.0では、imap_timeout()関数の第2引数が必須になりました。

例:

// 非推奨のコード
imap_timeout(IMAP_OPENTIMEOUT);

// 修正後のコード
imap_timeout(IMAP_OPENTIMEOUT, 30);

date_sunrise()date_sunset()の変更

PHP 8.0では、date_sunrise()date_sunset()関数のzenith引数のデフォルト値が変更されました。

例:

// 非推奨のコード
$sunrise = date_sunrise(time(), SUNFUNCS_RET_STRING);

// 修正後のコード
$sunrise = date_sunrise(time(), SUNFUNCS_RET_STRING, ini_get("date.default_latitude"), ini_get("date.default_longitude"), 90);

implode()の引数順序の厳密化

PHP 8.0では、implode()関数の引数の順序が厳密にチェックされます。

例:

// 非推奨のコード
echo implode($array, $glue); // 引数の順序が逆

// 修正後のコード
echo implode($glue, $array);

strrpos()の変更

PHP 8.0では、strrpos()関数に空の検索文字列を渡すことが禁止されました。

例:

// 非推奨のコード
$pos = strrpos($haystack, '');

// 修正後のコード
$pos = $haystack !== '' ? strrpos($haystack, '') : false;

ob_start()の変更

PHP 8.0では、ob_start()のコールバックハンドラに引数を渡すことが非推奨となりました。

例:

// 非推奨のコード
ob_start('output_handler', 4096, PHP_OUTPUT_HANDLER_STDFLAGS);

// 修正後のコード
ob_start('output_handler');

array_key_exists()の変更

PHP 8.0では、array_key_exists()関数の引数にnullを渡すことが禁止されました。

例:

// 非推奨のコード
array_key_exists(null, $array);

// 修正後のコード
$key = null;
if ($key !== null && array_key_exists($key, $array)) {
// 処理
}

compact()の変更

PHP 8.0では、compact()関数に無効な変数名を渡すとエラーが発生します。

例:

// 非推奨のコード
$var = 'value';
compact('var', 'nonexistent'); // エラー

// 修正後のコード
$var = 'value';
compact('var'); // 正しい使用法

count()の変更

PHP 8.0では、count()関数に無効な引数(例えばnull)を渡すとエラーが発生します。

例:

// 非推奨のコード
count(null); // エラー

// 修正後のコード
$array = null;
echo is_array($array) ? count($array) : 0;

restore_include_path()

restore_include_path()関数はPHP 8.0で削除されました。代わりにset_include_path()を使用して明示的に設定を変更する必要があります。

例:

// 非推奨のコード
restore_include_path();

// 修正後のコード
set_include_path(get_include_path());

strtolower()およびstrtoupper()のエラーハンドリング

PHP 8.0では、strtolower()およびstrtoupper()関数に無効な文字列を渡すと、エラーが発生します。

例:

// 非推奨のコード
echo strtolower(null); // エラー

// 修正後のコード
$input = null;
echo $input !== null ? strtolower($input) : '';

gettype()の変更

PHP 8.0では、gettype()関数がresource型の返り値としてresource (closed)を返すようになりました。

例:

// 非推奨のコード
$type = gettype(fopen('file.txt', 'r'));
// 'resource'

// 修正後のコード
$type = gettype(fopen('file.txt', 'r'));
// 'resource (closed)' など、返り値に注意

session_name()の変更

PHP 8.0では、session_name()関数に無効なセッション名を渡すことが禁止されました。

例:

// 非推奨のコード
session_name('123invalid');

// 修正後のコード
session_name('valid_name');

filter_var()の変更

PHP 8.0では、filter_var()関数で不正なフラグが渡された場合にエラーが発生します。

例:

// 非推奨のコード
filter_var('example', FILTER_VALIDATE_EMAIL, 'invalid_flag'); // エラー

// 修正後のコード
filter_var('example', FILTER_VALIDATE_EMAIL);

in_array()の厳密な型チェック

PHP 8.0では、in_array()関数において、厳密な型チェックがデフォルトで有効になります。

例:

// 非推奨のコード
in_array('1', [1, 2, 3]); // 厳密な型チェックが必要

// 修正後のコード
in_array('1', [1, 2, 3], true); // 厳密な型チェックを有効にする

json_decode()の変更

PHP 8.0では、json_decode()関数において、無効なJSONデータを渡すとエラーが発生します。

例:

// 非推奨のコード
$json = json_decode("{invalid: 'json'}"); // エラー

// 修正後のコード
$json = json_decode('{"valid": "json"}');

fgetcsv()の変更

PHP 8.0では、fgetcsv()関数の第3引数escapeが必須になりました。

例:

// 非推奨のコード
$csv = fopen('file.csv', 'r');
while (($data = fgetcsv($csv, 1000, ",")) !== FALSE) {
// 処理
}

// 修正後のコード
$csv = fopen('file.csv', 'r');
while (($data = fgetcsv($csv, 1000, ",", '"', "\\")) !== FALSE) {
// 処理
}

アップデートの手順

互換性の確認

まず、使用しているテーマやプラグインがPHP 8.0以上に対応しているか確認します。
公式のWordPressプラグインディレクトリやテーマフォーラムで互換性情報を確認することができます。

バックアップ

PHPバージョンをアップデートする前に、必ずサイト全体のバックアップを取ります。
これは、何か問題が発生した場合に元に戻せるようにするためです。

テスト環境での検証

本番サイトに変更を加える前に、テスト環境でPHP 8.0以上へのアップデートを試し、
問題がないか確認します。

アップデート

テスト環境で問題がなければ、本番環境でPHPのバージョンをアップデートします。

コードの修正

上記で述べた非推奨または削除された関数やタグを使っている場合は、対応する修正を行います。

まとめ

PHPのバージョンアップは、WordPressサイトのセキュリティと
パフォーマンスを向上させるために重要ですが、
一部の古いPHPタグや関数はPHP 8.0以上で使えなくなります。
サイトのコードを定期的に見直し、最新のPHPバージョンに対応するようにすることが大切です。
特にカテゴリの出力に関するコードの見直しやエスケープ処理の追加が求められます。