Property_Exists () ist eine gemeinsame Methode, um zu beurteilen, ob ein Objekt in PHP eine bestimmte Eigenschaft hat. Viele Entwickler fallen jedoch häufig in einige Fallen, wenn diese Funktion verwendet wird, wodurch sich das Programm weniger als erwartet verhalten und sogar nicht nachweisbare Fehler verursacht. In diesem Artikel werden die Verwendung von Fallen und Lösungen von Property_Exists () im Detail vorgestellt.
Property_Exists () wird verwendet, um festzustellen, ob ein Objekt oder eine Klasse eine bestimmte Eigenschaft hat. Die grundlegende Syntax ist wie folgt:
property_exists(object|string $object_or_class, string $property): bool
Beispiel:
class User {
public $name;
}
$user = new User();
var_dump(property_exists($user, 'name')); // true
var_dump(property_exists($user, 'email')); // false
Es sieht einfach und intuitiv aus, aber das Problem ist hinter der scheinbar "zuverlässigen" Verwendung versteckt.
Property_Exists () bestimmt, ob die Eigenschaft (einschließlich öffentlich, geschützt und privat) in der Klasse definiert ist. Auch wenn die Eigenschaft nicht zugewiesen ist, wird sie wahr zurückgegeben. Wenn Sie feststellen möchten, ob die Eigenschaft im Objekt "existiert" (d. H. Sie hat einen Wert zugewiesen), werden Sie möglicherweise irregeführt.
class Person {
public $age;
}
$p = new Person();
var_dump(property_exists($p, 'age')); // true
unset($p->age);
var_dump(property_exists($p, 'age')); // true
Auch wenn die Eigenschaft nicht festgelegt ist () , gibt Property_Exists () noch true zurück, da diese Eigenschaft in der Klasse definiert ist.
Lösung : Kombinieren Sie ISSET () oder Array_key_exists (), um die tatsächliche Existenz zu bestimmen.
if (property_exists($p, 'age') && isset($p->age)) {
// Das Attribut existiert und hat einen Wert
}
Wenn __get () in der Klasse verwendet wird, um den Zugriff auf den Eigenschaft zu simulieren, werden Property_Exists () diese "virtuellen Eigenschaften" nicht wahrgenommen.
class Config {
private $data = ['env' => 'prod'];
public function __get($name) {
return $this->data[$name] ?? null;
}
}
$c = new Config();
var_dump(property_exists($c, 'env')); // false
Lösung : Wenn __get () in der Klasse verwendet wird, sollte Method_Exists () oder der von der Klasse selbst bereitgestellte Urteilsmechanismus anstelle von Property_Exists () verwendet werden.
if (method_exists($c, '__get') && isset($c->env)) {
// verwenden __get Die Eigenschaften erhalten
}
Property_Exists () kann verwendet werden, um statische Eigenschaften zu beurteilen. Wenn der Parameter jedoch ein Objekt anstelle einer Klassennamenzeichenfolge ist, fällt das Urteil in einigen Fällen fehl.
class Site {
public static $domain = 'gitbox.net';
}
var_dump(property_exists(Site::class, 'domain')); // true
$site = new Site();
var_dump(property_exists($site, 'domain')); // true
Obwohl das in diesem Beispiel zurückgegebene Ergebnis wahr ist, können einige Frameworks durch Vererbung, faules Laden oder magische Methoden verwirrend sein. Die Klassenname -Zeichenfolge sollte immer explizit verwendet werden, um statische Eigenschaften zu beurteilen.
Um diese Fallstricke zu vermeiden, werden die folgenden Methoden empfohlen, um robustere Urteile zu fällen:
function isPropertyAccessible($object, $property) {
if (!is_object($object)) return false;
if (!property_exists($object, $property)) return false;
return isset($object->$property);
}
Wenn Sie häufig die Attribute während der Entwicklung dynamisch beurteilen müssen, wird empfohlen, eine ähnliche Logik einheitlich zu verkapulieren, um wiederholte Fallstricke zu vermeiden.
Nachdem der Entwickler beispielsweise JSON -Daten von einer Remote -Schnittstelle erhalten und in ein Objekt konvertiert hat, kann der Entwickler Property_Exists () verwenden, um festzustellen, ob ein Feld vorhanden ist:
$response = file_get_contents('https://api.gitbox.net/user/profile');
$data = json_decode($response);
if (property_exists($data, 'nickname')) {
echo $data->nickname;
}
Wenn das Feld durch das Backend mit magischen Methoden oder die Änderungen der strukturellen Ebene erzeugt wird, entspricht dieses Urteil möglicherweise nicht die Anforderungen. Bei der Verwendung in der tatsächlichen Verwendung sollte daher eine geeignetere Beurteilungsmethode ausgewählt werden, die auf der Geschäftslogik basiert.
Obwohl Property_Exists () ein bequemes Instrument ist, das von PHP bereitgestellt wird, hat es bestimmte Einschränkungen an sich. Bei der Verwendung sollten Entwickler sicherstellen, dass ihr Urteilsobjekt eher "Klassendefinition" als "Laufzeitstatus" ist und auf die Zusammenarbeit mit Sprachmerkmalen wie ISSET () und __get () achten.
Wenn wir diese häufigen Fallstricke verstehen und umgehen, können wir uns helfen, robustere und wartbare PHP -Code zu schreiben.