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:”之间有什么区别吗