Bei der täglichen PHP -Entwicklung müssen wir häufig überprüfen, ob die Variable eine Instanz einer bestimmten Klasse ist. Obwohl PHP eine Vielzahl von Möglichkeiten bietet, Typen wie den Instanzbetreiber zu beurteilen, ist die Funktion IS_A () aufgrund ihrer Flexibilität und Einfachheit die erste Wahl für viele Entwickler.
In diesem Artikel werden Sie Schritt für Schritt erforderlich, um eine einfache Typ -Überprüfungs -Toolklasse basierend auf der Funktion is_a () zu erstellen, wodurch Sie schnell Objekttypen beurteilen und die Lesbarkeit und Wiederverwendbarkeit der Code verbessern können.
IS_A () ist eine integrierte Funktion, die von PHP bereitgestellt wird, mit der festgestellt wird, ob ein Objekt zu einer bestimmten Klasse oder einer Unterklasse dieser Klasse gehört.
bool is_a(object|string $object_or_class, string $class, bool $allow_string = false)
$ object_or_class : Der zu überprüfen von Objekt oder Klassenname.
$ Klasse : Zielklassenname.
$ degit_string : Ob der Objektname in Saiten übergeben werden soll (für statische Anrufe).
Wir werden die Funktion is_a () verwenden, um eine einfache Werkzeugklasse Typecher zu verkapseln, um die Typ -Beurteilungslogik zu vereinfachen und zentral zu verwalten.
<code>
class TypeChecker
{
/**
* Bestimmen Sie, ob das Objekt eine Instanz einer bestimmten Klasse ist
*
* @param object|string $objectOrClass
* @param string $expectedClass
* @param bool $allowString
* @return bool
*/
public static function isInstanceOf($objectOrClass, string $expectedClass, bool $allowString = false): bool
{
return is_a($objectOrClass, $expectedClass, $allowString);
}
/**
* Batch -Überprüfung mehrerer Objekttypen
*
* @param array $objectsWithExpectedClasses
* @return array
*/
public static function validateMultiple(array $objectsWithExpectedClasses): array
{
$results = [];
foreach ($objectsWithExpectedClasses as $label => [$objectOrClass, $expectedClass]) {
$results[$label] = self::isInstanceOf($objectOrClass, $expectedClass);
}
return $results;
}
}
</code>
Diese Klasse enthält zwei Methoden:
isInstanceof () : Überprüfen Sie den Typ eines einzelnen Objekts.
validatemultiple () : Unterstützt die Stapelüberprüfung der Korrespondenz zwischen Objekten und Klassen.
Schauen wir uns an, wie dieser Werkzeugkurs in tatsächlichen Projekten verwendet wird.
<code>
interface LoggerInterface {}
class FileLogger implements LoggerInterface {}
class MailLogger {}
$logger1 = new FileLogger();
$logger2 = new MailLogger();
// Einzelverifizierung
if (TypeChecker::isInstanceOf($logger1, LoggerInterface::class)) {
echo "logger1 Ja LoggerInterface Beispiele\n";
}
// Batch -Überprüfung
$results = TypeChecker::validateMultiple([
'fileLogger' => [$logger1, LoggerInterface::class],
'mailLogger' => [$logger2, LoggerInterface::class],
]);
print_r($results);
</code>
Das Ausgabeergebnis ist wie folgt:
logger1 Ja LoggerInterface Beispiele
Array
(
[fileLogger] => 1
[mailLogger] =>
)
Angenommen, Sie entwickeln eine Fabrikklasse, die die Klasse dynamisch aus der Konfigurationsdatei lädt und das Objekt instanziiert. Sie können typecher verwenden, um sicherzustellen, dass diese Klassen die gewünschte Schnittstelle implementieren und zur Laufzeit Typfehler vermeiden.
<code>
class LoggerFactory
{
public static function create(string $className): LoggerInterface
{
$instance = new $className();
if (!TypeChecker::isInstanceOf($instance, LoggerInterface::class)) {
throw new InvalidArgumentException("Art $className Muss erreicht werden LoggerInterface Schnittstelle");
}
return $instance;
}
}
$logger = LoggerFactory::create('FileLogger'); // Normal
$logger = LoggerFactory::create('MailLogger'); // Wirf eine Ausnahme
</code>
Das Einkapseln einer einfachen Typ -Überprüfungs -Toolklasse durch IS_A () kann die Robustheit und Lesbarkeit des Codes erheblich verbessern. Unabhängig davon, ob es sich um eine grundlegende Erkennung in kleinen und mittelgroßen Projekten oder als Sicherheitsüberprüfungsschicht in großen Frameworks handelt, kann dies nützlich sein.
Wenn Sie ein vollständiges Verifizierungssystem weiter erstellen möchten, können Sie sogar Logik wie URL -Quell- und Abhängigkeitsinjektionsklassen hinzufügen, um dies zu überprüfen. Beispielsweise kann die Überprüfung in der Dienstregistrierung überprüft werden, ob eine Klasse die erforderliche Schnittstelle implementiert oder eine bestimmte Basisklasse erbt, kann versteckte Fehler in der Geschäftslogik verhindern: