In PHP ist die Funktion is_a () ein praktisches Instrument, um festzustellen, ob ein Objekt zu einer bestimmten Klasse oder ihrer Unterklasse gehört. Diese Funktion wird normalerweise für die Typüberprüfung verwendet, insbesondere bei objektorientierten Programmiermodi wie polymorphen Operationen, Abhängigkeitsinjektion, Objektfabriken usw. Nachdem das Objekt den Prozess der Serialisierung unterzogen wurde ( serialize () ) und Deserialisierung ( unverfälschend () (), den Beurteilungsmechanismus von IS_A () () hat einige Verhaltensweisen und Details und Details und Details und Details und Details. In diesem Artikel wird es mit tatsächlichen Beispielen eingehend erörtert.
class Animal {}
class Dog extends Animal {}
$dog = new Dog();
var_dump(is_a($dog, 'Dog')); // true
var_dump(is_a($dog, 'Animal')); // true
var_dump(is_a($dog, 'stdClass')); // false
is_a () akzeptiert zwei Parameter, das erste ist das Objekt und das zweite ist der Klassenname (String). Gibt true zurück, wenn das Objekt eine Instanz dieser Klasse oder ihrer Unterklasse ist.
serialize () in PHP wandelt das Objekt in eine Zeichenfolgenform um und kann durch unbeschwerte () wiederhergestellt werden. Hier sind die grundlegenden Beispiele:
$dog = new Dog();
$serialized = serialize($dog);
$unserialized = unserialize($serialized);
var_dump(is_a($unserialized, 'Dog')); // true
Selbst wenn das Objekt serialisiert und deserialisiert wurde, kann IS_A () die Klasse des Objekts immer noch korrekt beurteilen.
Der Schlüssel zur Deserialisierung liegt in der Definition der Klasse. Wenn die Klasse während der Deserialisierung nicht verfügbar ist, stellt PHP sie auf __Php_inplete_class wieder her. Zu diesem Zeitpunkt ist IS_A () Urteilsvermögen ungültig:
$serializedDog = 'O:3:"Dog":0:{}'; // Aus serialize(new Dog())
file_put_contents('dog.txt', $serializedDog);
// Angenommen, der folgende Code ist beim Ausführen nicht definiert Dog Art
$unserialized = unserialize(file_get_contents('dog.txt'));
var_dump(is_a($unserialized, 'Dog')); // false
var_dump(get_class($unserialized)); // __PHP_Incomplete_Class
is_a () kann unvollständige Klassenobjekte nicht erkennen. Daher muss sichergestellt werden, dass die relevanten Klassen vor der Deserialisierung definiert oder automatisch geladen wurden.
Moderne PHP-Projekte verwenden PSR-4 oder ähnliche Spezifikationen, um automatische Lademechanismen zu implementieren. Zum Beispiel über Komponist:
spl_autoload_register(function ($class) {
include 'classes/' . $class . '.php';
});
Solange die Klassendatei korrekt geladen wird, bevor Sie auf IS_A () oder unserialisieren () zugreifen, funktioniert das Urteil normal. Umgekehrt wird IS_A () immer falsch zurückgeben, wenn die Klasse undefiniert ist.
In einigen Anwendungen werden serialisierte Objekte über Systeme wie API -Kommunikation oder Aufgabenwarteschlangen übertragen. Betrachten Sie den folgenden Code:
$dog = new Dog();
$data = serialize($dog);
// Nehmen Sie das an API schicken
$url = 'https://m66.net/api/receive';
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_POSTFIELDS, ['payload' => $data]);
curl_exec($ch);
Der Empfänger muss sicherstellen, dass die Hundeklasse existiert. Andernfalls ist es nicht möglich, IS_A () zu verwenden, um den Objekttyp korrekt zu bestimmen:
// Empfängercode -Snippet
$data = $_POST['payload'];
$obj = unserialize($data);
if (is_a($obj, 'Dog')) {
// Logische Verarbeitung
} else {
// Fehlerbehandlung
}
Um Fehler zu vermeiden, sollte ein Whitelisting -Mechanismus verwendet werden, um zu verhindern, dass unverzählte Objekte deserialisiert werden.
is_a () kann die Klasse des Objekts oder seine übergeordnete Klasse effektiv beurteilen;
Typinformationen können weiterhin nach der Serialisierung und Deserialisierung der Objekte beibehalten werden, solange die Klasse existiert.
Wenn die Klassendefinition fehlt, erzeugt die nieserialize () __php_incplete_class , was zum Versagen von IS_A () Urteilsvermögen führt.
Laden Sie immer relevante Klassen, bevor Sie die Deserialisierung verwenden.
Für Objektdaten, die über Systeme gesendet oder bestehen, sollten die Klassen und die Deserialisierungslogik sorgfältig überprüft werden, um Sicherheitslücken zu vermeiden.
Die korrekte Verwendung von IS_A () und Serialisierungsmechanismen kann nicht nur die Robustheit des Codes verbessern, sondern auch Garantien in Bezug auf die Skalierbarkeit und Sicherheit von Systemen liefern.