PHP controlla se esiste una proprietà nell'oggetto o nella classe


159

Comprendo che PHP non ha una variabile oggetto pura, ma voglio verificare se una proprietà si trova nell'oggetto o nella classe dati.

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

o

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

In JS, posso scrivere questo per verificare se aesiste una variabile in un oggetto:

if ('a' in ob)

In PHP, si può fare qualcosa del genere?

Grazie mille per il consiglio.


2
Solo menzionando ... quando facciamo OOP, diciamo che la proprietà non è variabile, come diciamo metodo, non funzione.
Christopher Bonitz,

Risposte:


254

property_exists (misto $ class, stringa $ property)

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

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

if (isset($ob->a))

isset () restituirà false se la proprietà è null

Esempio 1:

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

Esempio 2:

class Foo
{
   public $bar = null;
}

$foo = new Foo();

var_dump(property_exists($foo, 'bar')); // true
var_dump(isset($foo->bar)); // false

12
Non necessariamente, se la proprietà esiste, ma non è definita isset () restituirà false. us3.php.net/manual/en/types.comparisons.php
Mitchell

isset () può essere combinato con empty () per controllare sia la proprietà che il valore.

4
Mentre isset () è la risposta sbagliata, se si è consapevoli dell'avvertimento, è notevolmente più veloce di property_exists ()
Nico Westerdale,

è questa una situazione in cui empty()è una soluzione migliore? !empty($var)?
b_dubb,

1
@b_dubb no, array vuoto, 0, false, null, '' tutti restituiscono true con `empty () '
Peter

61

Per verificare se la proprietà esiste e se è anche nulla, è possibile utilizzare la funzione property_exists().

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

A differenza di isset (), property_exists () restituisce VERO anche se la proprietà ha il valore NULL.

bool property_exists (misto $ class, stringa $ property)

Esempio:

if (property_exists($testObject, $property)) {
    //do something
}

7
Questo dovrebbe essere contrassegnato come risposta accettata poiché risponde in modo molto preciso alla risposta esplicita. isset non è utile per verificare l'esistenza di una proprietà in un oggetto.
Christopher Bonitz,

11

issetproperty_exists funzionano per me.

  • isset restituisce false se la proprietà esiste ma è NULL.
  • property_exists restituisce true se la proprietà fa parte della definizione della classe dell'oggetto, anche se non è stata impostata.

Ho finito per andare con:

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

Esempio:

    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
        }
    }

property_exist + la proprietà unset potrebbe causare un comportamento errato. Questo sembra essere il metodo più sicuro
Thanh Trung,

array_key_exists () è obsoleto in php 7.4
Ali_Hr

La parola chiave in "L'uso di array_key_exists () sugli oggetti è obsoleta" è oggetti. get_object_vars () restituisce un array, quindi siamo ancora bravi.
smariot,

7

Soluzione

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

Per mostrare come ciò apparirebbe in un'istruzione if per maggiore chiarezza su come funziona.

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

Spiegazione

Il modo tradizionale PHP per verificare l'esistenza di qualcosa è fare:

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

O per un modo più specifico di classe:

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

Entrambi vanno bene in dichiarazioni di forma lunga ma in dichiarazioni ternarie diventano inutilmente ingombranti in questo modo:

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

Puoi anche raggiungere questo obiettivo solo con l'operatore ternario in questo modo:

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

Ma ... se il valore non esiste (non è impostato) genererà una E_NOTICEe non è la migliore pratica. Se il valore è, nullnon genererà l'eccezione.

Pertanto, l'operatore ternario in soccorso rende questa una piccola risposta chiara:

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


Grande spiegazione!
DasBen,

4

Se vuoi sapere se esiste una proprietà in un'istanza di una classe che hai definito, combina semplicemente property_exists()con isset().

public function hasProperty($property)
{
    return property_exists($this, $property) && isset($this->$property);
}

1
La chiamata property_exists($this, $property)è un po 'ridondante qui, poiché il tuo codice avrà sempre lo stesso risultato di isset($this->$property)solo.
MarthyM,

Questo è un esame più completo dei fatti perché isset()non puoi dirti se una proprietà è un vero membro della definizione della classe. Guarderò di nuovo più tardi per essere sicuro.
Anthony Rutledge,

Questo è vero, l'output sarà lo stesso per le proprietà della classe effettiva. Se hai proprietà virtuali con __get()e, soprattutto __isset(), metodi magici, l'output sarà diverso in alcuni casi.
MarthyM,

1

Per verificare se qualcosa esce, puoi usare la funzione PHP isset () vedi php.net . Questa funzione verificherà se la variabile è impostata e non è NULL.

Esempio:

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

Se è necessario verificare l'esistenza di una proprietà in una classe, è possibile utilizzare la funzione build in property_exists ()

Esempio:

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

1

L'uso di array_key_exists () sugli oggetti è obsoleto in php 7.4

Invece dovrebbe essere usato isset () o property_exists ()

riferimento: php.net


0

Metto qui i miei 2 centesimi.

Data la seguente classe:

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);
  }
}

succederà quanto segue:

$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

Spero che questo possa aiutare chiunque

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.