In PHP wird die Funktion is_a () verwendet, um festzustellen, ob ein Objekt zu einer bestimmten Klasse oder Unterklasse einer Klasse gehört. Die Syntax ist wie folgt:
is_a(object $object, string $class_name, bool $allow_string = false): bool
Unter ihnen muss der erste Parameter der Objekt- oder Objektname sein, und der zweite Parameter ist der Klassenname. Wenn die Reihenfolge dieser beiden Parameter umgekehrt ist, was wird der Code dann haben? In diesem Artikel werden Beispiele verwendet, um die Leistung und potenzielle Risiken von IS_A () bei der Verwendung der falschen Parameterreihenfolge zu analysieren.
Angenommen, es gibt zwei Kategorien:
class Animal {}
class Dog extends Animal {}
$dog = new Dog();
var_dump(is_a($dog, 'Animal')); // true,Dog Ja Animal Unterklassen von
var_dump(is_a($dog, 'Dog')); // true,$dog Ja Dog Beispiele
In diesem Code wird IS_A ($ Dog, 'Animal') wahr zurückkehren, was darauf hinweist, dass das $ Dog -Objekt zur Tierklasse oder ihrer Unterklasse gehört.
Wenn Sie die Parameterreihenfolge umgekehrt schreiben, zum Beispiel:
var_dump(is_a('Animal', $dog)); // Fehlerdemonstration
Was passiert zu diesem Zeitpunkt? Lassen Sie uns analysieren:
Das erste Argument ist das Zeichenfolge 'Tier' , nicht das Objekt.
Der zweite Parameter ist Object $ Dog , nicht Klassenname -Zeichenfolge.
Gemäß der Definition von IS_A () erwartet die Funktion, dass der erste Parameter ein Objekt ist und der zweite Parameter ein Name der Zeichenfolgeklasse ist und die Reihenfolge umgekehrt ist, um Typenfehler zu verursachen.
Php 7.2 und höher wirft Warnungen oder Fehler wie folgt auf:
Warning: is_a() expects parameter 1 to be object, string given
Die Funktion gibt falsch zurück und kann nicht korrekt beurteilt werden.
Die Codelogik schlägt fehl, was zu einem Urteilsfehler führt.
Beispielcode:
$dog = new Dog();
var_dump(is_a('Animal', $dog)); // false,Und eine Warnung
IS_A () ermöglicht es dem dritten Parameter $ degly_string auf true , um den ersten Parameter zu unterstützen, der in die Klassennamenzeichenfolge anstelle des Objekts übergeht:
var_dump(is_a('Dog', 'Animal', true)); // true,Urteil Dog Ja否继承 Animal
Aber auch in diesem Fall muss der zweite Parameter immer noch der Name der String -Klasse sein, und die umgekehrte Reihenfolge immer noch Fehler:
var_dump(is_a('Animal', $dog, true)); // Immer noch falsch,Parameterreihenfolge invertiert
Der erste Parameter der Funktion is_a () muss ein Objekt sein (oder wenn $ degfter_string wahr ist, handelt es sich um eine Klassenname -Zeichenfolge), und der zweite Parameter muss eine Klassenname -Zeichenfolge sein.
Das Umkehren der Parameterreihenfolge verursacht Typenfeindlichkeit, PHP wird aufmerksam und zurückgegeben , und das Urteil ist ungültig.
Besonderes Augenmerk sollte der Parameterauftrag in der Entwicklung gelegt werden, um logische Schwachstellen zu vermeiden, die aufgrund von Parameterübertragungsfehlern schwer zu erkennen sind.