In PHP müssen wir häufig die Eigenschaften eines Objekts überprüfen, um sicherzustellen, dass beim Zugriff auf oder manipulierter Eigenschaften zur Laufzeit keinen Typ Fehler auftritt. Obwohl PHP eine dynamische Sprache ist, ist es immer noch ein wichtiges Mittel, um die Robustheit des Codes zu gewährleisten.
In diesem Artikel wird die Verwendung von Property_Exists () und Get_Class () vorgestellt, um die Existenz und die spezifischen Arten von Objekteigenschaften genau zu beurteilen.
Angenommen, Sie entwickeln ein Geschäftssystem, das sich auf polymorphe Objektstrukturen beruht, und verschiedene Arten von Objekten können denselben Namen, aber verschiedene Arten von Eigenschaften haben. Zum Beispiel:
class User {
public Profile $profile;
}
class Admin {
public AdminProfile $profile;
}
class Guest {
// NEIN profile Eigentum
}
Sie möchten jedes Objekt weitergeben und feststellen, ob es über ein Profilattribut und den spezifischen Klassennamen des Attributs verfügt, ohne die Sicherheit vom Typ zu brechen.
Property_Exists () ist eine PHP-integrierte Funktion, mit der wir erkennen können, ob eine Eigenschaft in einem Objekt oder einer Klasse vorhanden ist. Die Syntax ist wie folgt:
bool property_exists(object|string $object_or_class, string $property)
Beispiel:
if (property_exists($object, 'profile')) {
// Im Beschreibungsobjekt definiert profile Eigentum
}
Beachten Sie jedoch, dass es nicht beurteilt, ob das Eigentum initialisiert wurde, nur ob es deklariert wird.
Sobald wir bestätigen, dass das Objekt über diese Eigenschaft verfügt, können wir versuchen, seinen Wert zu erhalten und Get_class () zu verwenden, um den spezifischen Typ des Werts zu bestimmen.
if (property_exists($object, 'profile')) {
$profileValue = $object->profile;
if (is_object($profileValue)) {
$profileClass = get_class($profileValue);
echo "Eigentum profile Die Art von: $profileClass";
} else {
echo "Eigentum profile existieren,Aber nicht das Objekt。";
}
}
Hier ist eine praktische Funktion, die willkürliche Objekte akzeptiert und versucht zu bestimmen, ob sie angegeben haben, und den Klassennamen des Attributs ausgeben:
function getObjectPropertyClass(object $object, string $property): ?string {
if (property_exists($object, $property)) {
$value = $object->$property ?? null;
if (is_object($value)) {
return get_class($value);
}
}
return null;
}
Beispiel der Nutzung:
$user = new User();
$user->profile = new Profile();
$className = getObjectPropertyClass($user, 'profile');
if ($className) {
echo "profile Der Klassenname ist:$className";
} else {
echo "该Eigentum不existieren或不是对象。";
}
Wenn in PHP 7.4+ die Eigenschaft eingegeben und nicht zugewiesen wird, wirft der Zugriff auf sie direkt einen Fehler aus. Sie können ReflectionProperty verwenden, um anmutig festzustellen, ob die Eigenschaft initialisiert wurde.
function isPropertyInitialized(object $object, string $property): bool {
try {
$ref = new ReflectionProperty($object, $property);
return $ref->isInitialized($object);
} catch (ReflectionException $e) {
return false;
}
}
Verwenden Sie in Kombination:
if (property_exists($object, 'profile') && isPropertyInitialized($object, 'profile')) {
$profile = $object->profile;
if (is_object($profile)) {
echo "Typ ist:" . get_class($profile);
}
}
Wenn Sie beispielsweise ein Datenobjekt verarbeiten, das von einer Remote -API zurückgegeben wird (z. B. https://api.gitbox.net/users/123 ), können Sie die obige Methode verwenden, um dynamisch zu bestimmen, ob es Eigenschaften wie Profil und Einstellungen enthält, und sie weiter verarbeiten.
Dieser Ansatz ist ideal für die Deserialisierung oder Verarbeitung von Datenschnittstellen, die keine standardisierten Objektstrukturen sind.
Kombinieren Sie Property_Exists () und get_class () , kombiniert mit der fortgeschrittenen Verwendung von ReflectionProperty , können wir sicher und genau die Existenz von Objekteigenschaften und ihre spezifischen Typen in PHP beurteilen. Dieser Ansatz ist besonders für Programmierszenarien geeignet, die sich auf datengesteuerte Design, Schnittstellenantwortverarbeitung oder Reflexion beziehen. Es hat einen sehr praktischen Wert, um die Robustheit und Wartbarkeit des Codes zu verbessern.