web-dev-qa-db-fra.com

PHP vérifier si la propriété existe dans un objet ou une classe

Je comprends que PHP n'a pas de variable d'objet pur, mais je veux vérifier si une propriété est dans l'objet ou la classe donnée.

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

ou

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

Dans JS, je peux écrire ceci pour vérifier si la variable a existe dans un objet:

if ('a' in ob)

En PHP, peut-on faire quelque chose comme ça?

Merci beaucoup pour votre conseil.

115
Micah

property_exists (mixed $ class, string $ property)

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

isset (mixed $ var [ mixed $ ...]))

if (isset($ob->a))

isset () retournera false si la propriété est null

Exemple 1:

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

Exemple 2:

class Foo
{
   public $bar = null;
}

$foo = new Foo();

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

Pour vérifier si la propriété existe et si elle est également nulle, vous pouvez utiliser la fonction property_exists().

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

Property_exists (), contrairement à isset (), renvoie TRUE même si la propriété a la valeur NULL.

bool property_exists (mixed $ class, string $ property)

Exemple:

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

Ni isset ou property_exists ne fonctionne pour moi.

  • isset renvoie false si la propriété existe mais est NULL.
  • property_exists renvoie true si la propriété fait partie de la définition de classe de l'objet, même si elle n'a pas été définie.

J'ai fini par aller avec:

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

Exemple:

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

Si vous voulez savoir si une propriété existe dans une instance d'une classe que vous avez définie, combinez simplement property_exists() avec isset().

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

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

OR

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

Explication

Le moyen traditionnel PHP de vérifier l'existence de quelque chose consiste à faire:

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

OU pour une manière plus spécifique à la classe:

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

Ce sont deux choses bien dans les déclarations longues, mais dans les déclarations ternaires, elles deviennent inutilement lourdes isset($person->middleName) ? echo $person->middleName : echo 'Person does not have a middle name';

Vous pouvez également y parvenir uniquement avec l'opérateur ternaire, tel que so echo $person->middleName ?: 'Person does not have a middle name';, mais si la valeur n'existe pas (n'est pas définie), une E_NOTICE est générée et ce n'est pas la meilleure pratique. Si la valeur est null, l'exception ne sera pas levée.

C'est pourquoi l'opérateur ternaire est à la rescousse, ce qui en fait une réponse simple:

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

4
Rob

Pour vérifier si quelque chose se termine, vous pouvez utiliser la fonction PHP isset () voir php.net . Cette fonction vérifiera si la variable est définie et n'est pas NULL.

Exemple:

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

Si vous devez vérifier si une propriété existe dans une classe, vous pouvez utiliser la fonction de construction property_exists ()

Exemple:

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