PHP의 MBString Extension은 멀티 바이트 스트링을 처리 할 때 매우 중요한 역할을합니다. 그 중에서 MB_GET_INFO ()는 현재 인코딩, 감지 순서 등과 같은 현재 MBString 의 구성 정보를 보는 데 일반적으로 사용되는 기능입니다.
PHP가 7.x 시대에서 8.x로 전이함에 따라 MB_GET_INFO ()는 미묘하지만 중요한 변화를 겪습니다. 이 기사는 이러한 변경 사항과 호환성 문제에 대해 자세히 설명합니다.
php 7.x에는 mb_get_info ()가 두 가지 호출 방법이 있습니다.
매개 변수없이 호출 : 모든 MBString 구성 정보를 반환하면 결과는 연관 배열입니다.
매개 변수로 호출 : '내부_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 () 는 다음을 조정합니다.
일부 구성 정보 필드는 폐기됩니다 .
예를 들어, MBString이 더 이상 HTTP 입력 및 출력을 처리하지 않기 때문에 과거의 일부 오래된 필드 (예 : http_input , http_output )가 PHP 8에서 완전히 제거되었습니다. 이 내용은 이제 PHP 스트림 및 입력 필터에 균일하게 전달됩니다.
반환 된 필드 수가 줄어 듭니다 .
코드가 http_output 과 같은 더 이상 사용되지 않은 키 이름에 의존하는 경우 Php 8에서 mb_get_info ()를 사용하면 다시 반환되지 않습니다.
유형 선언이 강화됩니다 .
PHP 8에서 MB_GET_INFO () 의 리턴 값 유형이 더 엄격하며 이전과 같이 거짓 또는 기타 이상한 결과를 반환하지 않습니다.
오류 처리 방법이 변경되었습니다 .
유효하지 않은 매개 변수가 전달되면 이전에 조용히 거짓으로 반환되었을 수 있으며 이제는 PHP 8에서 타입 원자 또는 ValueError가 던져 질 수 있습니다.
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/php/manual/en/function.mb-get-info.php를 방문하십시오.
PHPSTAN 또는 PSALM과 같은 도구를 사용하여 프로젝트를 업그레이드하여 잠재적 인 API 호환성 문제를 즉시 발견하기 전에 정적 코드 분석을 수행하는 것이 좋습니다.
전반적으로 MB_GET_INFO ()는 PHP 8.X에서 더 깨끗하고 엄격하며 현대화되지만 호환성 문제도 가져옵니다. 프로젝트, 특히 다국어 및 캐릭터 인코딩 민감한 시스템과 관련된 시스템을 업그레이드 할 때는 이러한 변경 사항을 신중하게 점검하고 시작한 후 이상한 캐릭터 처리 문제를 피하기 위해 조정해야합니다.
기억하십시오 : 코딩 처리의 문제는 종종 무시하기가 가장 쉽지만 가장 영향력이 있습니다.