PHPのMbString拡張機能は、マルチバイト文字列を処理する際に非常に重要な役割を果たします。その中で、 MB_GET_INFO()は、現在のエンコード、検出順序など、現在のMBSTRINGの構成情報を表示するために一般的に使用される関数です。
PHPが7.x ERAから8.xに移行すると、 MB_GET_INFO()も微妙だが重要な変更を受けます。この記事では、これらの変更とそれらがもたらす可能性のある互換性の問題について詳しく説明します。
PHP 7.Xでは、 MB_Get_Info()には2つの呼び出し方法があります。
パラメーターなしで呼び出します:すべてのmbstring構成情報を返し、結果は連想配列です。
パラメーターを使用して呼び出します: 「internal_encoding」などの文字列パラメーターを渡して、対応する構成情報を返すことができます。
サンプルコード:
<?php
// すべてを取得します mbstring 構成情報
$info = mb_get_info();
print_r($info);
// 得る特定的構成情報
$internalEncoding = mb_get_info('internal_encoding');
echo "Internal Encoding: " . $internalEncoding;
?>
この情報は、特に国際的なアプリケーションを扱う場合、開発者が現在の環境のキャラクター設定を理解するのに役立ちます。
PHP 8.Xを入力した後、 MB_GET_INFO()は次の調整を行います。
一部の構成情報フィールドは破棄されます。
たとえば、過去のいくつかの時代遅れのフィールド( http_input 、 http_outputなど)は、 mbstringがHTTP入力と出力を処理しなくなったため、PHP 8で完全に削除されています。これらの内容は、PHPストリームと入力フィルターに均一に引き渡されます。
返されるフィールドの数は減少します。
コードがhttp_outputなどの一部の非推奨キー名に依存している場合、PHP 8でMB_GET_INFO()を使用しても再び返されません。
タイプ宣言が強化されます。
PHP 8では、 mb_get_info()の返品値タイプはより厳しく、以前と同じようにfalseまたは他の奇妙な結果をゆるく返しません。
エラー処理方法が変更されました。
無効なパラメーターが渡された場合、それは以前に静かに偽りを返した可能性があり、現在、 TypeRrorまたはValueErrorがPHP 8にスローされる可能性があります。
PHP 8.xサンプルコード:
<?php
// すべてを取得します mbstring 構成情報
$info = mb_get_info();
foreach ($info as $key => $value) {
echo "{$key} : {$value}\n";
}
// 得る internal_encoding 情報
try {
$encoding = mb_get_info('internal_encoding');
echo "Internal Encoding: " . $encoding;
} catch (ValueError $e) {
echo "Caught error: " . $e->getMessage();
}
?>
コードをPHP 7.xからPHP 8.xにアップグレードする予定がある場合は、 MB_GET_INFO()を使用する場合、次の互換性の問題に注意する必要があります。
このような放棄されたフィールドに直接アクセスするためのコードにロジックがある場合:
<?php
$httpOutput = mb_get_info()['http_output'];
?>
次に、PHP 8で直接エラーが報告され、未定義の配列キーが求められます。
回避策:これらの消滅するキー名に依存しないように、書き直す必要があります。
<?php
$info = mb_get_info();
if (isset($info['http_output'])) {
$httpOutput = $info['http_output'];
} else {
$httpOutput = 'default'; // または、合理的なデフォルト値を指定します
}
?>
パラメーターをコードでMB_GET_INFO()に自由に渡すと、PHP 7でFALSEを返すだけですが、PHP 8では例外が直接スローされます。例えば:
<?php
// PHP 7.x 返すことができます false
var_dump(mb_get_info('non_existing_field'));
// PHP 8.x 投げます ValueError
?>
提案:例外キャプチャロジックを追加して、コードの堅牢性を向上させます。
コードのセットがPHP 7とPHP 8で同時に実行できるようにするために、次の記述方法を参照できます。
<?php
function safe_mb_get_info(string $option = null) {
try {
if ($option !== null) {
return mb_get_info($option);
}
return mb_get_info();
} catch (Throwable $e) {
// ロギング,または、デフォルト値を返します
error_log("mb_get_info error: " . $e->getMessage());
return null;
}
}
// 使用
$encoding = safe_mb_get_info('internal_encoding');
echo $encoding ?? 'utf-8';
?>
mbstringとmb_get_info()について詳しく知る必要がある場合は、 https://gitbox.net/manual/en/function.mb-get-info.phpにアクセスできます。
PHPSTANや詩編などのツールを使用して静的コード分析を実行する前に、プロジェクトをアップグレードして潜在的なAPI互換性の問題を迅速に発見することをお勧めします。
全体として、 MB_GET_INFO()はPHP 8.Xでクリーナー、より厳しく、モダンになりますが、互換性の課題ももたらします。プロジェクトをアップグレードする場合、特に多言語およびキャラクターをエンコードする機密システムを含むシステムは、これらの変更を慎重にチェックして調整する必要があります。
覚えておいてください:コーディング処理の問題はしばしば無視するのが最も簡単ですが、最も衝撃的です。