Aktueller Standort: Startseite> Neueste Artikel> IS_A () Hinweise beim Erkennen der Implementierung der Schnittstelle

IS_A () Hinweise beim Erkennen der Implementierung der Schnittstelle

M66 2025-06-05

Grundnutzung

Die grundlegende Syntax der Funktion is_a () lautet wie folgt:

<Code> is_a (Objekt | String $ object_or_class, String $ class, bool $ degling_string = false): bool </code
  • $ object_or_class kann ein Objekt oder ein Klassenname (eine Zeichenfolge) sein.

  • $ class ist der Zielklassen- oder Schnittstellenname, der erkannt wird.

  • $ degly_string bestimmt, ob der erste Parameter eine Zeichenfolge (Klassenname) sein darf, und standardmäßig zu False .

Beispiel:

<Code> Schnittstelle loggerinterface {}

Klasse filelogger implementiert loggerinterface {}

$ logger = neuer filelogger ();

var_dump (is_a ($ logger, loggerinterface :: class)); // Ausgabe: bool (true)
</code>


Dinge zu beachten

1. Es erkennt die Implementierung und erbt nicht die übergeordnete Schnittstelle in der Kette

Bei Verwendung von IS_A () , um eine Schnittstelle zu überprüfen, wird nur festgestellt, ob das Objekt die Schnittstelle implementiert, und überprüft nicht, ob seine übergeordnete Klasse die Schnittstelle indirekt implementiert. Dies unterscheidet sich von einigen statischen Analysetools Verhalten.

<Code> Schnittstelle A {} Schnittstelle B erweitert A {}

Klasse Myclass implementiert B {}

$ obj = new MyClass ();

// richtig
var_dump (is_a ($ obj, b :: class)); // bool (wahr)

// auch korrekt, weil B a erbt a
var_dump (is_a ($ obj, a :: class)); // bool (wahr)
</code>

Schlussfolgerung: Die Interface -Vererbungskette wird von IS_A () berücksichtigt, was sich von einigen Möglichkeiten unterscheidet, die nur "direkte" Schnittstellenimplementierungen überprüfen.


2. Beim Übergeben in Saiten als Objekterkennung muss $ degling_string aktiviert sein

Wenn die Klassenname -Zeichenfolge übergeben wird, nicht das Objekt, muss der dritte Parameter $ degfter_string auf true gesetzt werden, andernfalls gibt IS_A () immer false zurück.

<Code> Schnittstellendienst {}

Klasse Apiservice implementiert Service {}

$ className = apiservice :: class;

var_dump (is_a ($ className, service :: class, true)); // bool (wahr)
</code>

Sobald der dritte Parameter weggelassen oder auf false eingestellt ist, gibt der obige Code FALSE zurück.


3. Die Schnittstellenname muss ein voll qualifizierter Name sein

Bei der Verwendung von is_a () sollte der Schnittstellename ein voll qualifizierter Klassenname sein (d. H. einschließlich des Namespace). Dies ist besonders wichtig, wenn Autoladierungsmechanismen oder komplexere Namespace -Strukturen verwendet werden.

Zum Beispiel:

<Code> Namespace App \ Services;

Schnittstelle Paymentinterface {}

Klasse PayPalservice implementiert PaymentInterface {}
</code>

Achten Sie auf den Test:

<Code> app \ Services \ paypalservice verwenden; Verwenden Sie App \ Services \ PaymentInterface;

$ service = new paypalservice ();

var_dump (is_a ($ service, paymentInterface :: class)); // bool (wahr)
</code>

Andernfalls kann Falsch zurückgegeben werden, insbesondere wenn der Schnittstellenname falsch ist oder die Verwendung nicht importiert wird.


4.. Es wird nicht empfohlen, die Instanz für die Objektprüfung zu ersetzen

Obwohl Is_a () bei der Inspektion von Objektinstanzen konsistent mit Instanz von der Leistung und der Code -Lesbarkeit besser ist. Zum Beispiel:

<Code> if ($ logger InstanceOf loggerinterface) {// Empfohlen} </code>

Wenn Sie den Klassennamen nicht dynamisch in Zeichenfolgenformular beurteilen müssen, wird empfohlen, zuerst Instanz zu verwenden.


5. Überprüfen Sie, ob die Schnittstelle eine andere Schnittstelle implementiert

Obwohl die Schnittstelle selbst nicht instanziiert werden kann, können Sie überprüfen, ob eine Schnittstelle eine andere erbt. Dies ist nützlich, wenn Sie Kurse in Containern reflektieren oder automatisch registrieren.

<Code> interface baseInterface {} Schnittstelle Subinterface erweitert BaseInterface {}

var_dump (is_a (subinterface :: class, baseInterface :: class, true)); // bool (wahr)
</code>

Diese Verwendung wird normalerweise mit Funktionen wie class_implements () verwendet und eignet sich besonders für das Scannen von Containern:

<Code> $ classes = ['m66.net/service/alphaservice.php', 'm66.net/service/betaservice.php'];

foreach ($ classes als $ classPath) {
// Überprüfen Sie, ob sie nach dem Reflektieren oder dynamisch geladenen Klassen eine Schnittstelle implementiert
$ class = get_class_from_file ($ classPath); // Angenommen, Sie implementieren diese Funktion

 if (is_a($class, \App\Contracts\HandlerInterface::class, true)) {
    // Dienst anmelden
}

}
</code>