PHP:什么时候需要self::关键字?
我只是问了一下,没有意识到PHP:什么时候需要self::关键字?,php,static-methods,Php,Static Methods,我只是问了一下,没有意识到静态::关键字存在 在我看来,如果需要显式引用某个特定的类,可以使用ClassName::,否则您可能希望self::表示调用该方法的类。我想举一个例子,当你需要self::时,你不能只使用ClassName:: 您是否可以将所有出现的self::替换为ClassName::,其中ClassName是它所在的类外壳的名称?并不是说它在语义上更好,甚至是等价的,而是从功能上说 self转发静态调用,而ClassName不转发静态调用,换句话说:它解析为当前类实例 在某些情
静态::
关键字存在
在我看来,如果需要显式引用某个特定的类,可以使用ClassName::
,否则您可能希望self::
表示调用该方法的类。我想举一个例子,当你需要self::
时,你不能只使用ClassName::
您是否可以将所有出现的
self::
替换为ClassName::
,其中ClassName是它所在的类外壳的名称?并不是说它在语义上更好,甚至是等价的,而是从功能上说 self
转发静态调用,而ClassName
不转发静态调用,换句话说:它解析为当前类实例
在某些情况下,您可能希望引用当前实例而不是类的扩展实例
这只对后期静态绑定(见PHP5.3及以上版本)以及引入
static
关键字的原因非常重要 简短回答:是
我很好奇这是否会受到名称空间更改、继承或函数的受保护状态的影响,但事实并非如此。我想不出还有什么能影响它
我认为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
时,我可能会将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
正如您所说,
self::
直接引用方法所在的类,ClassName::
可能是一种效率较低的方法。我想这就像是通过代理在您自己的服务器上链接图像一样,解决了为什么要使用静态
,但我仍然在寻找为什么需要self
。唯一有用的用法是在处理类常量时。在所有其他情况下,这都是一个迹象,表明你一定做错了什么。PS:oooops,这是一个1年前的答案。当你想让一个方法调用它自己的类常量或静态方法,而不是孩子的类常量或静态方法时,它很有用。转发静态调用是什么意思?你能举个例子吗?通过转发静态调用,我的意思是将静态方法解析为当前类。您在上一个问题中的示例应该已经足够了,但我可以更深入地解释一下吗?我会将上一个示例解释为:self::
未转发静态调用<代码>静态::执行。所以我想我把这个概念弄糊涂了。啊,对-基本上,我想说的是self::
指的是类的当前实例<代码>静态::引用最新实例(如果扩展)。如果使用了MyClassName::
而不是self::
它将始终解析为该类实例。我将尝试编写一个代码示例,并将其粘贴到答案中。这与在非静态函数中使用self::
有关吗?问题不是“self::”是什么,而是“self:”和“ClassName:”之间有什么区别吗