可能重复:
新的自我与新的静态
什么是两者的区别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
。 当您使用self
在Foo
类指的财产,如果引用相同的类。
因此,如果你试图用self::$bar
在其他地方Foo
类,但你有一个Bar
类的属性不同的值,它会使用Foo::$bar
代替Bar::$bar
,这可能不是你打算:
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
用于调用后期绑定构造关键字可以在此相关的问题中找到: 新自身对新的静态
然而,这并不排除使用static
与性能以及。
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.自这两种方法,因为它是在一个的实施方法定义绑定到,而静态的,尽管事实上绑定到调用的类,它也是在A的实施方法。
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
文章来源: What is the difference between self::$bar and static::$bar in PHP? [duplicate]