我刚刚问过this question about the self::
keyword并且没有意识到存在static::
关键字。
在我看来,如果您需要明确引用某个特定类,则可以使用ClassName::
,否则您希望self::
表示调用该方法的类。我正在考虑一个例子,说明何时需要self::
,而不能只使用ClassName::
。
您是否可以将所有self::
替换为ClassName::
,其中ClassName是其找到的类附件的名称?并非它更好或者甚至在语义上等同,但功能更多......
答案 0 :(得分:0)
self
转发静态调用,而ClassName
则没有,换句话说:它解析为当前的类实例。
在某些情况下,您可能希望引用当前实例而不是类的扩展实例。
这仅适用于PHP 5.3及更高版本中的后期静态绑定,以及引入static
关键字的原因。
答案 1 :(得分:0)
简答:是
我很好奇这是否会受到命名空间更改,继承或函数受保护状态的影响,但事实并非如此。我无法想到任何可能影响它的事情。
我认为self
优于ClassName
只是因为如果更改封闭类上的类名或将代码粘贴到新类中,它会继续有效。
证明:
namespace Foo;
Class B{
protected static function printOut()
{
echo "Defined in Foo\B name: ".__CLASS__."\n";
}
}
Class A extends B{
public static function testClassName(){
A::printOut();
}
public static function testSelf(){
self::printOut();
}
public static function testStatic(){
static::printOut();
}
}
namespace Bar;
use Foo\A as B;
Class A extends B{
protected static function printOut(){
echo "Defined in Bar\A name: ".__CLASS__."\n";
}
}
$a = new A();
$b = new B();
$a->testClassname(); //Defined in Foo\B name: Foo\B
$a->testSelf(); //Defined in Foo\B name: Foo\B
$a->testStatic(); //Defined in Bar\A name: Bar\A
$b->testClassname(); //Defined in Foo\B name: Foo\B
$b->testSelf(); //Defined in Foo\B name: Foo\B
$b->testStatic(); //Defined in Foo\B name: Foo\B
如您所见,调用Bar \ A-> printOut()的唯一时间是在Foo \ A中使用static
时
答案 2 :(得分:0)
我可能会将self::
描述为忽略被覆盖或多态的类,因为它总是会使用父类,即使它被覆盖了。
class A{
public function foo(){
echo "hello Mike";
}
}
class B extends A{
public function foo(){
echo "this will be ignore";
}
}
$tryThis = new B();
$tryThis->foo();
// Above will print out
// Hello Mike