Prüfen Sie, ob es eine Eigenschaft gibt, die auf magisch-set Eigenschaften
Es gibt eine Menge von Fragen über das Thema, insbesondere diese eine, aber es hilft mir nicht.
Gibt es eine Mehrdeutigkeit zwischen property_exists
und isset
also, bevor Sie Fragen, meine Frage, werde ich darauf hinzuweisen:
property_exists
property_exists prüft, ob ein Objekt enthält eine Eigenschaft, ohne zu suchen am Wert, Sie sieht nur seine Sichtbarkeit.
So im folgenden Beispiel:
<?php
class testA
{
private $a = null;
}
class testB extends testA
{
}
$test = new testA();
echo var_dump(property_exists($test, 'a')); //true
//parent's private property becomes invisible for its child
$test = new testB();
echo var_dump(property_exists($test, 'a')); //false
isset
isset prüft, ob ein Wert vorhanden ist, in einer Eigenschaft, wenn man bedenkt, dass wird nicht gesetzt, wenn ein Wert gleich false
undnull
.
<?php
$var = null;
echo var_dump(isset($var)); //false
$var = '';
echo var_dump(isset($var)); //true
$var = false;
echo var_dump(isset($var)); //true
$var = 0;
echo var_dump(isset($var)); //true
$var = '0';
echo var_dump(isset($var)); //true
isset
und property_exists
's Verhalten auf Magische Weise Hinzugefügt Eigenschaften
Einer Eigenschaft bestehen kann, mit einem null
Wert, so kann ich nicht verwenden __isset
Magische Methode wissen, ob eine Eigenschaft vorhanden ist oder nicht. Ich kann mir auch nicht verwenden property_exists
als Eigenschaften Hinzugefügt werden, mithilfe von magischen Praktiken.
Hier ist ein Beispiel, aber dies ist nur ein Beispiel, weil in meiner app, Eigenschaften magisch-set gespeichert sind, außerhalb des Objekts.
class test {
private $data = array();
public function __get($key) {
echo "get $key\n";
return array_key_exists($key, $data) ? $data[$key] : null;
}
public function __set($key, $value) {
echo "set $key = $value\n";
$this->data[$key] = $value;
}
public function __isset($key) {
echo sprintf("isset $key ( returns %b )", isset($this->data[$key]));
return isset($this->data[$key]);
}
}
$test = new test();
$test->x = 42;
isset($test->x); //1
$test->y = null;
isset($test->y); //0
property_exists($test, 'y'); //0
So, hier ist meine Frage :
Gibt es eine Magische Methode oder ein SPL-interface zu implementieren
property_exist
mit magisch-Eigenschaften Hinzugefügt ?
- Vorschlag: verwenden Sie
var_dump()
, nichtecho sprintf....
- Auch
printf
macht genauecho sprintf
Du musst angemeldet sein, um einen Kommentar abzugeben.
Glaube ich nicht, es ist eine Art zu verändern die Funktionalität von property_exists() mit magic-Methoden; hier ist eine Liste der verfügbaren magic-Methoden in PHP. Jedoch, Sie sollten in der Lage sein zu ändern isset() verwenden einer Logik, die Sie mögen.
Diese effektiv behebt das (nervige) problem mit isset und null-Werte durch überschreiben Ihre Funktionalität durch die Magische Methode. Anstelle der Verwendung von isset() innerhalb von __isset() wir verwenden allerdings array_key_exists (die Griffe Nullen als Sie erwarten würden). So __isset() gibt das erwartete Ergebnis, wenn ein null-Wert gesetzt ist.
Diese hat einen Nachteil, nämlich, dass die überschriebenen Funktionen nicht produzieren die gleichen Ergebnisse wie die Standard-isset () - Funktionalität. Also, wenn dieses Objekt verwendet werden muss transparent mit den anderen (vielleicht stdClass) Objekte, dann isset() true zurück für null-Werte in Objekte dieser Klasse, und false für null-Werte in normale Objekte.
Je nach Bedarf dann diese kann oder kann nicht eine praktikable Lösung. Wenn das oben genannte Problem ist ein Hindernis, dann eine weitere option könnte sein, zu definieren, die eine Schnittstelle mit einem keyIsSet () - Eigenschaft, und wenden Sie die Schnittstelle für alle Objekte getestet werden. Dann verwenden Sie $obj->keyIsSet('key') anstatt isset($obj->$key). Nicht so elegant, aber ein bisschen besser oo.
array_key_exists
vor. Danke.Problem ist mit der Umsetzung der
__set
und__get
Funktionen habe ich geändert und funktioniert sowohl fürisset
undproperty_exists
properties magically set are stored outside the object
. Trotzdem danke.