256

I understand PHP does not have a pure object variable, but I want to check whether a property is in the given object or class.

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

or

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

In JS, I can write this to check if variable a exists in an object:

if ('a' in ob)

In PHP, can anything like this be done?

1
  • 5
    Just mentioning... when we do OOP, we say property not variable, like we say method, not function. Commented Feb 6, 2017 at 7:55

11 Answers 11

433

property_exists( mixed $class , string $property )

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

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

NOTE : Mind that isset() will return false if property is null

if (isset($ob->a))

Example 1:

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

Example 2:

class Foo
{
   public $bar = null;
}

$foo = new Foo();

var_dump(property_exists($foo, 'bar')); // true
var_dump(isset($foo->bar)); // false
Sign up to request clarification or add additional context in comments.

7 Comments

Not necessarily, if the property exists, but is not defined isset() will return false. us3.php.net/manual/en/types.comparisons.php
isset() can be combined with empty() to check both property and value.
While isset() is the wrong answer, if you are aware of the caveat it is is considerably faster than property_exists()
is this a situation where empty() is a better solution? !empty($var) ?
@b_dubb no, empty array, 0, false, null, '' all return true by `empty()'
|
81

To check if the property exists and if it's null too, you can use the function property_exists().

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

As opposed with isset(), property_exists() returns TRUE even if the property has the value NULL.

bool property_exists ( mixed $class , string $property )

Example:

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

2 Comments

This should be marked as the accepted answer since it answers the explicit answer very precise. isset is not useful for testing existence of a property in an object.
However property_exists return true if the property is declared but not defined (so in fact, is not yet existing).
21

Neither isset or property_exists work for me.

  • isset returns false if the property exists but is NULL.
  • property_exists returns true if the property is part of the object's class definition, even if it has been unset.

I ended up going with:

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

Example:

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

5 Comments

property_exist + unset property maybe cause buggy behaviour. This seems to be the safest method
array_key_exists() is Deprecated in php 7.4
The keyword in "Using array_key_exists() on objects is deprecated" is objects. get_object_vars() returns an array, so we're still good.
@Ali_Hr Don't know where you saw it in the docs. array_key_exists isn't deprecated in PHP 7.4.
@Thanh Trung Why do you want to unset a class property? property_exists works like expected. If you unset a class property it is internal set to null. Regarding the docs property_exists also returns true if the property is null. So I'm confused what you expected. Also mentionable that property_exist didn't work if the magical method __get is implemented.
20

Solution

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

To show how this would look in an if statement for more clarity on how this is working.

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

Explanation

The traditional PHP way to check for something's existence is to do:

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

OR for a more class specific way:

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

These are both fine in long form statements but in ternary statements they become unnecessarily cumbersome like so:

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

You can also achieve this with just the ternary operator like so:

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

But... if the value does not exist (is not set) it will raise an E_NOTICE and is not best practise. If the value is null it will not raise the exception.

Therefore ternary operator to the rescue making this a neat little answer:

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

3 Comments

The "Elvis operator" (?:) does NOT check if the property exists! And ?? is the null coalescing operator.
@mickmackusa if you had actually read my description you would see that I had mentioned that about ?:.
I guess I don't see any reason to mention ?: on this page, since the title explicitly says: PHP check whether property exists in object or class
5

To check if something exits, you can use the PHP function isset() see php.net. This function will check if the variable is set and is not NULL.

Example:

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

If you need to check if a property exists in a class, then you can use the build in function property_exists()

Example:

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

Comments

4

If you want to know if a property exists in an instance of a class that you have defined, simply combine property_exists() with isset().

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

3 Comments

Calling property_exists($this, $property) is kind of redundant here, since your code will always have the same result as isset($this->$property) alone.
This is a more complete examination of the facts because isset() cannot tell you if a property is a true member of the class definition. I will look up again later to make sure.
That is true, the output will be the same for actual class properties. If you have virtual properties with __get() and more importantly __isset() magic methods, the output will be different in some cases.
4

Usually I use kind of custom helper

    /**
     * @param Object $object
     * @param string $property as a string with nested properties 'prop1.nesterdProp.deepvalue'
     * @param mixed $default
     * @return mixed
     */
    function getPropertyOrDefault(Object $object, string $property, $default = null)
    {
        $value = $object;
        $path = explode('.', $property);
        foreach ($path as $prop) {
            if (is_object($value) && property_exists($value, $prop)) {
                $value = $value->{$prop};
            } else {
                return $default;
            }
        }
        return $value;
    }

Keep in mind that if property is empty you will get empty value and no default value.

BTW the similar helper works in JS as well.

Comments

3

This is quite new, so be sure you are running PHP 8:

$ob?->a

Reference link

3 Comments

It will not check the property exsistence.
ya i was trying to use this but strangely it does not work it will throw an error if the property does not exist
This only changes the behavior based on whether $ob is defined/null or not in this case. It has nothing to do with the property itself.
2

Using array_key_exists() on objects is Deprecated in php 7.4

Instead either isset() or property_exists() should be used

reference : php.net

Comments

0

Just putting my 2 cents here.

Given the following class:

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

the following will happen:

$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

Hope this will help anyone

Comments

0

Usually I use kind of custom helper

/**
 * @param Object $object
 * @param string $property as a string with nested properties 'prop1.nesterdProp.deepvalue'
 * @param mixed $default
 * @return mixed
 */
function getPropertyOrDefault(Object $object, string $property, $default = null)
{
    $value = $object;
    $path = explode('.', $property);
    foreach ($path as $prop) {
        if (is_object($value) && property_exists($value, $prop)) {
            $value = $value->{$prop};
        } else {
            return $default;
        }
    }
    return $value;
}

Keep in mind that if property is empty you will get empty value and no default value

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.