PHP prüft, ob eine Eigenschaft in einem Objekt oder einer Klasse vorhanden ist

159

Ich verstehe, dass PHP keine reine Objektvariable hat, aber ich möchte überprüfen, ob sich eine Eigenschaft in dem angegebenen Objekt oder der angegebenen Klasse befindet.

$ob = (object) array('a' => 1, 'b' => 12); 

oder

$ob = new stdClass;
$ob->a = 1;
$ob->b = 2;

In JS kann ich dies schreiben, um zu überprüfen, ob eine Variable ain einem Objekt vorhanden ist:

if ('a' in ob)

In PHPKann so etwas gemacht werden?

Vielen Dank für Ihren Rat.

Micah
quelle
2
Nur erwähnen ... wenn wir OOP machen, sagen wir, dass Eigenschaft nicht variabel ist, wie wir sagen, Methode, nicht Funktion.
Christopher Bonitz

Antworten:

254

property_exists (gemischte $ class, string $ property)

if (property_exists($ob, 'a')) 

isset (gemischte $ var [, gemischte $ ...])

if (isset($ob->a))

isset () gibt false zurück, wenn die Eigenschaft null ist

Beispiel 1:

$ob->a = null
var_dump(isset($ob->a)); // false

Beispiel 2:

class Foo
{
   public $bar = null;
}

$foo = new Foo();

var_dump(property_exists($foo, 'bar')); // true
var_dump(isset($foo->bar)); // false
Peter
quelle
12
Nicht unbedingt, wenn die Eigenschaft vorhanden ist, aber nicht definiert ist, gibt isset () false zurück. us3.php.net/manual/en/types.comparisons.php
Mitchell
isset () kann mit empty () kombiniert werden, um sowohl die Eigenschaft als auch den Wert zu überprüfen .
4
Während isset () die falsche Antwort ist, ist es, wenn Sie sich der Einschränkung bewusst sind, erheblich schneller als property_exists ()
Nico Westerdale
Ist dies eine Situation, in der empty()eine bessere Lösung ist? !empty($var)?
b_dubb
1
@b_dubb nein, leeres Array, 0, falsch, null, '' alle geben wahr durch 'leer ()' zurück
Peter
61

Mit der Funktion können Sie überprüfen, ob die Eigenschaft vorhanden ist und ob sie auch null ist property_exists().

Dokumente: http://php.net/manual/en/function.property-exists.php

Im Gegensatz zu isset () gibt property_exists () TRUE zurück, auch wenn die Eigenschaft den Wert NULL hat.

bool property_exists (gemischte $ class, string $ property)

Beispiel:

if (property_exists($testObject, $property)) {
    //do something
}
Chiara Perino
quelle
7
Dies sollte als akzeptierte Antwort markiert werden, da es die explizite Antwort sehr genau beantwortet. isset ist nicht nützlich, um das Vorhandensein einer Eigenschaft in einem Objekt zu testen.
Christopher Bonitz
11

Weder isset noch property_exists funktionieren für mich.

  • isset gibt false zurück, wenn die Eigenschaft vorhanden ist, aber NULL ist.
  • property_exists gibt true zurück, wenn die Eigenschaft Teil der Klassendefinition des Objekts ist, auch wenn sie nicht festgelegt wurde.

Am Ende ging ich mit:

    $exists = array_key_exists($property, get_object_vars($obj));

Beispiel:

    class Foo {
        public $bar;

        function __construct() {
            $property = 'bar';

            isset($this->$property); // FALSE
            property_exists($this, $property); // TRUE
            array_key_exists($property, get_object_vars($this)); // TRUE

            unset($this->$property);

            isset($this->$property); // FALSE
            property_exists($this, $property); // TRUE
            array_key_exists($property, get_object_vars($this)); // FALSE

            $this->$property = 'baz';

            isset($this->$property); // TRUE
            property_exists($this, $property); // TRUE
            array_key_exists($property, get_object_vars($this));  // TRUE
        }
    }
Smariot
quelle
property_exist + unset property kann fehlerhaftes Verhalten verursachen. Dies scheint die sicherste Methode zu sein
Thanh Trung
array_key_exists () ist in PHP 7.4
Ali_Hr
Das Schlüsselwort in "Die Verwendung von array_key_exists () für Objekte ist veraltet" lautet "Objekte". get_object_vars () gibt ein Array zurück, also sind wir immer noch gut.
Smariot
7

Lösung

echo $person->middleName ?? 'Person does not have a middle name';

Um zu zeigen, wie dies in einer if-Anweisung aussehen würde, um mehr Klarheit darüber zu erhalten, wie dies funktioniert.

if($person->middleName ?? false) {
    echo $person->middleName;
} else {
    echo 'Person does not have a middle name';
}

Erläuterung

Die traditionelle PHP-Methode, um die Existenz von etwas zu überprüfen, besteht darin, Folgendes zu tun:

if(isset($person->middleName)) {
    echo $person->middleName;
} else {
    echo 'Person does not have a middle name';
}

ODER für einen klassenspezifischeren Weg:

if(property_exists($person, 'middleName')) {
    echo $person->middleName;
} else {
    echo 'Person does not have a middle name';
}

Diese sind beide in langen Aussagen in Ordnung, aber in ternären Aussagen werden sie unnötig umständlich wie folgt:

isset($person->middleName) ? echo $person->middleName : echo 'Person does not have a middle name';

Sie können dies auch nur mit dem ternären Operator erreichen:

echo $person->middleName ?: 'Person does not have a middle name';

Aber ... wenn der Wert nicht existiert (nicht gesetzt ist), wird ein ausgelöst E_NOTICEund dies ist keine bewährte Methode. Wenn der Wert ist null, wird die Ausnahme nicht ausgelöst.

Daher ternäre Bediener zur Rettung machen dies eine nette kleine Antwort:

echo $person->middleName ?? 'Person does not have a middle name';

rauben
quelle
Tolle Erklärung!
DasBen
4

Wenn Sie wissen möchten, ob eine Eigenschaft in einer Instanz einer von Ihnen definierten Klasse vorhanden ist, kombinieren Sie sie einfach property_exists()mit isset().

public function hasProperty($property)
{
    return property_exists($this, $property) && isset($this->$property);
}
Anthony Rutledge
quelle
1
Das Aufrufen property_exists($this, $property)ist hier irgendwie überflüssig, da Ihr Code immer das gleiche Ergebnis wie isset($this->$property)allein hat.
MarthyM
Dies ist eine umfassendere Untersuchung der Fakten, da Sie isset()nicht feststellen können, ob eine Eigenschaft ein echtes Mitglied der Klassendefinition ist. Ich werde später noch einmal nachsehen, um sicherzugehen.
Anthony Rutledge
Das heißt, die Ausgabe ist für die tatsächlichen Klasseneigenschaften gleich. Wenn Sie virtuelle Eigenschaften mit __get()und vor allem __isset()magische Methoden haben, ist die Ausgabe in einigen Fällen unterschiedlich.
MarthyM
1

Um zu überprüfen, ob etwas beendet wird, können Sie die PHP-Funktion isset () verwenden, siehe php.net . Diese Funktion prüft, ob die Variable gesetzt und nicht NULL ist.

Beispiel:

if(isset($obj->a))
{ 
  //do something
}

Wenn Sie überprüfen müssen, ob eine Eigenschaft in einer Klasse vorhanden ist, können Sie die eingebaute Funktion property_exists () verwenden.

Beispiel:

if (property_exists('class', $property)) {
    //do something
}
Tjoene
quelle
1

Die Verwendung von array_key_exists () für Objekte ist in PHP 7.4 veraltet

Stattdessen sollte entweder isset () oder property_exists () verwendet werden

Referenz: php.net

Ali_Hr
quelle
0

Ich lege nur meine 2 Cent hierher.

Gegeben die folgende Klasse:

class Foo
{
  private $data;

  public function __construct(array $data)
  {
    $this->data = $data;
  }

  public function __get($name)
  {
    return $data[$name];
  }

  public function __isset($name)
  {
    return array_key_exists($name, $this->data);
  }
}

Folgendes wird passieren:

$foo = new Foo(['key' => 'value', 'bar' => null]);

var_dump(property_exists($foo, 'key'));  // false
var_dump(isset($foo->key));  // true
var_dump(property_exists($foo, 'bar'));  // false
var_dump(isset($foo->bar));  // true, although $data['bar'] == null

Hoffe das wird jedem helfen

Sieger
quelle