phpoopphp-5.3

What is the difference between self::$bar and static::$bar in PHP?


What is the difference between using self and static in the example below?

class Foo
{
    protected static $bar = 1234;

    public static function instance()
    {
        echo self::$bar;
        echo "\n";
        echo static::$bar;
    }

}

Foo::instance();

produces

1234
1234

Solution

  • When you use self to refer to a class member, you're referring to the class within which you use the keyword. In this case, your Foo class defines a protected static property called $bar. When you use self in the Foo class to refer to the property, you're referencing the same class.

    Therefore if you tried to use self::$bar elsewhere in your Foo class but you had a Bar class with a different value for the property, it would use Foo::$bar instead of Bar::$bar, which may not be what you intend:

    class Foo
    {
        protected static $bar = 1234;
    }
    
    class Bar extends Foo
    {
        protected static $bar = 4321;
    }
    

    When you call a method via static, you're invoking a feature called late static bindings (introduced in PHP 5.3).

    In the above scenario, using self will result in Foo::$bar(1234). And using static will result in Bar::$bar (4321) because with static, the interpreter takes into account the redeclaration within the Bar class during runtime.

    // self
    var_dump(Foo::$bar);
    // (int) 1234
    
    // static
    var_dump(Bar::$bar);
    // (int) 4321
    

    You typically use late static bindings for methods or even the class itself, rather than properties, as you don't often redeclare properties in subclasses; an example of using the static keyword for invoking a late-bound constructor can be found in this related question: New self vs. new static

    However, that doesn't preclude using static with properties as well.