关于oop:PHP中的self :: $ bar和static :: $ bar有什么区别?

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

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
New self vs. new static

在下面的示例中,使用selfstatic有什么区别?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Foo
{
    protected static $bar = 1234;

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

}

Foo::instance();

生产

1
2
1234
1234


当使用self引用类成员时,您指的是使用关键字的类。在这种情况下,您的Foo类定义了一个名为$bar的受保护静态属性。当在Foo类中使用self引用属性时,您引用的是同一个类。

因此,如果你试图在你的Foo类中的其他地方使用self::$bar,但你的Bar类对财产有不同的价值,它将使用Foo::$bar而不是Bar::$bar,这可能不是你想要的:

1
2
3
4
5
6
7
8
9
class Foo
{
    protected static $bar = 1234;
}

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

当您使用static时,您将调用一个称为后期静态绑定(在php 5.3中引入)的特性。

在上述场景中,使用static而不是self,将导致使用Bar::$bar而不是Foo::$bar,因为解释器会考虑到Bar类中的重新声明。

通常对方法甚至类本身使用后期静态绑定,而不是属性,因为您不经常在子类中重新声明属性;在这个相关问题中可以找到使用static关键字调用后期绑定构造函数的示例:new self与new static

但是,这并不排除使用具有属性的static


1
2
3
self - refers to the same class whose method the new operation takes place in.

static - in PHP 5.3's late static binding refers to whatever class in the hierarchy which you call the method on.

在下面的示例中(请参见get_called_class()),类B继承了类A中的两个方法。self绑定到a,因为它是在a的方法实现中定义的,而static绑定到被调用的类,尽管它也在a的方法实现中。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class A {
    public static function get_A() {
        return new self();
    }

    public static function get_me() {
        return new static();
    }
}

class B extends A {}

echo get_class(B::get_A());  // A
echo get_class(B::get_me()); // B
echo get_class(A::get_me()); // A