在下面的例子中使用self
和static
有什么区别?
class Foo
{
protected static $bar = 1234;
public static function instance()
{
echo self::$bar;
echo "\n";
echo static::$bar;
}
}
Foo::instance();
生产
1234
1234
在下面的例子中使用self
和static
有什么区别?
class Foo
{
protected static $bar = 1234;
public static function instance()
{
echo self::$bar;
echo "\n";
echo static::$bar;
}
}
Foo::instance();
1234
1234
当你用self
来指代一个类成员时,你指的是你在其中使用关键字的类.在本例中,Foo
类定义了一个名为$bar
的受保护静态属性.当您在Foo
类中使用self
来引用属性时,您引用的是同一个类.
因此,如果您试图在Foo
类中的其他地方使用self::$bar
,但您的Bar
类具有不同的属性值,那么它将使用Foo::$bar
而不是Bar::$bar
,这可能不是您想要的:
class Foo
{
protected static $bar = 1234;
}
class Bar extends Foo
{
protected static $bar = 4321;
}
当您通过static
创建一个方法时,您正在调用一个名为late static bindings的特性(在PHP5.3中引入).
在上述场景中,使用self
将得到Foo::$bar
(1234).
// self
var_dump(Foo::$bar);
// (int) 1234
// static
var_dump(Bar::$bar);
// (int) 4321
您通常对方法甚至类本身使用后期静态绑定,而不是属性,因为您不经常在子类中重新声明属性;使用static
关键字调用后期绑定构造函数的示例可以在这个相关问题中找到:New self vs. new static
然而,这并不排除在属性中使用static
.