Um dieses Verhalten zu verstehen, müssen wir zuerst das Typ -System des PHP verstehen. PHP ist eine schwach typisierte Sprache, die in den meisten Fällen automatisch konvertiert. PHP behält jedoch immer noch klare Datentypen intern bei:
Ganze Zahl
Schwimmertyp (Doppel/Float)
Saite
Boolean
Array
Objekt
Ressource
NULL
Dies bedeutet, dass 1 und 1,0 numerisch gleich sind, sie im Typ immer noch unterschiedlich sind.
is_double () ist eine integrierte Funktion in PHP, die feststellt, ob eine Variable vom Gleitkomma-Typ ist. Die Implementierungslogik ist eigentlich sehr einfach, was der Überprüfung der Überprüfung der Überprüfung des Typs der Variablen im Speicher entspricht "schwimmender Punkt".
Schauen wir uns ein Beispiel an:
$a = 1;
$b = 1.0;
var_dump(is_double($a)); // bool(false)
var_dump(is_double($b)); // bool(true)
Im obigen Code ist die Variable $ a eine Ganzzahl, die streng als "Ganzzahl" in PHP identifiziert wird, und $ B ist eine schwimmende Punktzahl, die True zurückgibt.
Dies erläutert das Problem im Titel des Artikels: is_double (1) gibt False zurück, da die buchstäbliche 1 eine Ganzzahl ist, kein schwimmender Punkttyp.
Sie können sich auch fragen, wie sich is_double () verhalten wird, wenn Sie in einer Schnur übergeben, die wie eine schwimmende Punktzahl aussieht:
var_dump(is_double('1.0')); // bool(false)
Dieses Ergebnis zeigt erneut, dass is_double () keine implizite Typumwandlung durchführt. Die Zeichenfolge '1.0' wird nicht automatisch als schwimmende Punktzahl interpretiert. is_double () kehrt nur dann zurück, wenn der interne Typ der Variablen bereits float ist.
Wenn Sie feststellen möchten, ob ein Wert als schwimmende Punktzahl interpretiert werden kann und nicht nur auf IS_DOUBLE () angewiesen ist, müssen Sie die Konvertierung explizit eingeben oder regelmäßig Ausdrucksüberprüfung verwenden. Zum Beispiel:
function is_numeric_float($value) {
return is_numeric($value) && (strpos((string)$value, '.') !== false);
}
var_dump(is_numeric_float('1.0')); // bool(true)
Alternativ können Sie filter_var () für eine flexiblere Überprüfung verwenden:
var_dump(filter_var('1.0', FILTER_VALIDATE_FLOAT)); // float(1)
Diese Art von Methode ist in der tatsächlichen Entwicklung zuverlässiger als einfach auf IS_DOUBLE () zu stützen, insbesondere wenn Daten in Benutzereingaben oder Netzwerkanforderungen verarbeitet werden.
In einigen Datenüberprüfungsszenarien können Entwickler fälschlicherweise annehmen, dass is_double () alle Werte beurteilen kann, die "wie eine schwimmende Punktzahl aussehen". Wenn Sie beispielsweise eine JSON -Anfrage vom vorderen Ende erhalten, lautet der Feldwert "1.0" . Wenn Sie is_double () verwenden, um direkt zu überprüfen, wird falsch eingeschätzt, dass das Datenformat falsch ist.
Der richtige Weg besteht darin , is_numeric () mit Formatüberprüfung zu kombinieren oder Feldtypen manuell konvertieren, wenn JSON analysiert wird:
$data = json_decode(file_get_contents('https://gitbox.net/data.json'), true);
$price = (float)$data['price'];
if (is_double($price)) {
// Sichere Verwendung von schwimmenden Punktzahlen
}