Die Mbstring -Erweiterung von PHP spielt bei der Verarbeitung von Multibyte -Zeichenfolgen eine äußerst wichtige Rolle. Unter ihnen ist mb_get_info () eine häufig verwendete Funktion, um die Konfigurationsinformationen des aktuellen Mbstring anzuzeigen, z. B. die aktuelle Codierung, Erkennungsreihenfolge usw.
Da PHP von der 7.x -Ära zu 8.x übersieht, erfährt MB_Get_info () auch einige subtile, aber wichtige Änderungen. In diesem Artikel werden diese Änderungen und die Kompatibilitätsprobleme beschrieben, die sie möglicherweise mit sich bringen.
In PHP 7.x hat MB_Get_info () zwei Anrufe:
Rufen Sie ohne Parameter auf : Gibt alle Mbstring -Konfigurationsinformationen zurück, und das Ergebnis ist ein assoziatives Array.
Rufen Sie mit Parametern auf : Sie können einen String -Parameter wie "Internal_encoding" übergeben, um die entsprechenden Konfigurationsinformationen zurückzugeben.
Beispielcode :
<?php
// Holen Sie sich alles mbstring Konfigurationsinformationen
$info = mb_get_info();
print_r($info);
// Erhalten特定的Konfigurationsinformationen
$internalEncoding = mb_get_info('internal_encoding');
echo "Internal Encoding: " . $internalEncoding;
?>
Diese Informationen können den Entwicklern helfen, die Charakter -Set -Einstellungen der aktuellen Umgebung zu verstehen, insbesondere wenn es sich um internationale Anwendungen handelt.
Nach dem Eingeben von PHP 8.x führt mb_get_info () die folgenden Anpassungen vor:
Einige Konfigurationsinformationsfelder werden verworfen .
Beispielsweise wurden einige veraltete Felder in der Vergangenheit (wie http_input , http_output ) in PHP 8 vollständig entfernt, da Mbstring den HTTP -Eingang und -ausgang nicht mehr verarbeitet. Diese Inhalte werden jetzt gleichmäßig an den PHP -Stream und die Eingangsfilter übergeben.
Die Anzahl der zurückgegebenen Felder wird reduziert .
Wenn Ihr Code auf einigen veralteten Schlüsselnamen wie http_output basiert, gibt es mit MB_Get_Info () in Php 8 sie nicht erneut zurück.
Typdeklaration stärkt .
In Php 8 ist der Rückgabewerttyp von mb_get_info () strenger und gibt keine falschen oder andere seltsame Ergebnisse so locker wie zuvor zurück.
Die Fehlerbehandlungsmethode hat sich geändert .
Wenn ein ungültiger Parameter übergeben wird, hat er möglicherweise schon einmal leise falsch zurückgegeben, und jetzt kann ein Typeerror oder ValueError in Php 8 geworfen werden.
PHP 8.x Beispielcode :
<?php
// Holen Sie sich alles mbstring Konfigurationsinformationen
$info = mb_get_info();
foreach ($info as $key => $value) {
echo "{$key} : {$value}\n";
}
// Erhalten internal_encoding Information
try {
$encoding = mb_get_info('internal_encoding');
echo "Internal Encoding: " . $encoding;
} catch (ValueError $e) {
echo "Caught error: " . $e->getMessage();
}
?>
Wenn Sie vorhaben, Ihren Code von PHP 7.x auf PHP 8.x zu aktualisieren, müssen Sie bei Verwendung von mb_get_info () auf die folgenden Kompatibilitätsprobleme achten:
Wenn der Code eine Logik gibt, um direkt auf solche aufgegebenen Felder zugreifen zu können:
<?php
$httpOutput = mb_get_info()['http_output'];
?>
Anschließend wird ein Fehler direkt in Php 8 gemeldet, was für einen undefinierten Array -Schlüssel auffordert.
Problemumgehung : Muss neu geschrieben werden, um nicht auf diese verschwindenden Schlüsselnamen zu stützen.
<?php
$info = mb_get_info();
if (isset($info['http_output'])) {
$httpOutput = $info['http_output'];
} else {
$httpOutput = 'default'; // Oder einen angemessenen Standardwert geben
}
?>
Wenn Sie die Parameter an mb_get_info () nach Belieben im Code übergeben, kann dies nur in Php 7 False zurückgeben, aber in Php 8 wird die Ausnahme direkt ausgelöst. Zum Beispiel:
<?php
// PHP 7.x Möglich zurückkehren false
var_dump(mb_get_info('non_existing_field'));
// PHP 8.x Wird werfen ValueError
?>
Vorschlag : Fügen Sie die Ausnahme -Erfassungslogik hinzu, um die Code -Robustheit zu verbessern.
Um sicherzustellen, dass ein Code -Satz gleichzeitig in Php 7 und Php 8 ausgeführt werden kann, können Sie sich auf die folgende Schreibmethode beziehen:
<?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) {
// Protokollierung,Oder geben Sie den Standardwert zurück
error_log("mb_get_info error: " . $e->getMessage());
return null;
}
}
// verwenden
$encoding = safe_mb_get_info('internal_encoding');
echo $encoding ?? 'utf-8';
?>
Wenn Sie mehr über Mbstring und mb_get_info () erfahren müssen, können Sie https://gitbox.net/php/manual/en/function.mb-get-info.php besuchen.
Es wird empfohlen, Tools wie Phpstan oder Psalm zu verwenden, um eine statische Codeanalyse durchzuführen, bevor das Projekt aktualisiert wird, um potenzielle API -Kompatibilitätsprobleme umgehend zu ermitteln.
Insgesamt wird mb_get_info () in PHP 8.x sauberer, strenger und modern, bringt aber auch Kompatibilitätsprobleme. Bei der Upgrade von Projekten, insbesondere von Systemen, die mehrsprachige und Charakter -codierende sensible Systeme beinhalten, müssen diese Änderungen sorgfältig überprüft und angepasst werden, um seltsame Probleme mit der Charakterverarbeitung nach dem Start zu vermeiden.
Denken Sie daran: Die Probleme der Codierungsverarbeitung sind oft am einfachsten zu ignorieren, aber am wirkungsvollsten.