Is a property default value of null the same as no default value?

Is a property default value of null the same as no default value?

Yes

as per the docs:

The special NULL value represents a variable with no value.

null is a concept of a variable that has not been set to any particular value. It is relatively easy to make mistakes when differentiating between null and empty1 values.

private $foo = null; is exactly equivalent to private $foo;. In both cases the class attribute is defined with a value of null.

isset will correctly return false for both declarations of $foo; isset is the boolean opposite of is_null, and those values are, as per above, null.

For reference, I recommend reviewing the PHP type comparison tables.

1: In this case I am referring to typed values that return true for the empty function, or which are otherwise considered "falsey". I.E. null, 0, false, the empty array (array()), and the empty string (''). '0' is also technically empty, although I find it to be an oddity of PHP as a language.


Untyped properties

Simple answer, yes. See http://php.net/manual/en/language.types.null.php

The special NULL value represents a variable with no value. NULL is the only possible value of type null.

You can easily test by performing a var_dump() on the property and you will see both instances it will be NULL

class Blah1
{
    private $foo;

    function test()
    {
        var_dump($this->foo);
    }
}

$test1 = new Blah1();
$test1->test(); // Outputs NULL


class Blah2
{
    private $foo = NULL;

    function test()
    {
        var_dump($this->foo);
    }
}

$test2 = new Blah2();
$test2->test(); // Outputs NULL

Typed properties

PHP 7.4 adds typed properties which do not default to null by default like untyped properties, but instead default to a special "uninitialised" state which will cause an error if the property is read before it is written. See the "Type declarations" section on the PHP docs for properties.


Apart from the accepted answer that is still true, with the addition of typed properties in PHP 7.4 there are new things to consider.

Given the following code

class A {
    public ?DateTime $date;
}

$a = new A();
$a->date;

You will get the error

PHP Fatal error: Uncaught Error: Typed property A::$date must not be accessed before initialization

That means that the property $date is not automatically initialized with null even though this would be a valid value. You'll have to initialize it directly like public ?DateTime $date = null; or use the constructor to do so.