PHP中self :: $ bar和static :: $ bar有什么不同?
可能重复:
新的自我与新的静态
在下面的例子中,使用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 (在PHP 5.3中引入)的特性。
在上面的场景中,使用static
而不是self
会导致使用Bar::$bar
而不是Foo::$bar
,因为解释器会考虑Bar
类中的重新声明。
你通常使用晚期的静态绑定方法,甚至是类本身,而不是属性,因为你不经常重新声明子类中的属性; 在这个相关的问题中可以find一个使用static
关键字来调用late-bound构造函数的例子: New self vs. new 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.
在下面的例子中,Binheritance了A的两个方法,self被绑定到A,因为它在A的第一个方法的实现中被定义,而static被绑定到了被调用的类(也参见get_called_class())。
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