PHP:你什么时候需要self :: keyword?

时间:2013-11-17 20:32:29

标签: php static-methods

我刚刚问过this question about the self:: keyword并且没有意识到存在static::关键字。

在我看来,如果您需要明确引用某个特定类,则可以使用ClassName::,否则您希望self::表示调用该方法的类。我正在考虑一个例子,说明何时需要self::,而不能只使用ClassName::

您是否可以将所有self::替换为ClassName::,其中ClassName是其找到的类附件的名称?并非它更好或者甚至在语义上等同,但功能更多......

3 个答案:

答案 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