最近我发现有趣的代码用法,我不知道这是可能的。有人可以解释或给我手册页解释为什么下面的代码有效吗?我理解::
可用于反映父,静态等方法或访问静态字段/方法,但参考$this
它似乎很奇怪,因为方法a()
不是静态的
class Test
{
private function a()
{
echo 'a works';
}
public static function c()
{
echo 'c works';
}
public function b()
{
$this::a(); // this is weird
$this::c(); // also this
$this->a(); // normal usage
self::a(); // as expected
static::a(); // same as above
Test::c(); // as expected
}
}
(new Test)->b();
我试图找到一些我自己的信息,但没有运气。
修改
我知道::
我知道如果启用了E_STRICT,它会发出警告。
答案 0 :(得分:4)
从PHP 5.3开始,您可以使用变量来引用具有::
运算符的类。 The manual仅显示变量是字符串的用法,但实际上也可以在其位置使用对象;引用的类是对象是其实例的类。 static
:http://php.net/manual/en/language.oop5.static.php#language.oop5.static.properties手册中有一个例子。
所以,所有这些都解决了同样的问题:
$foo = new Foo;
$foo::bar();
$foo = 'Foo';
$foo::bar();
Foo::bar();
这些方法将永远被静态调用;对于已经static
已按预期工作的方法,while for non-static methods an E_STRICT
notice will be raised.
就我而言,这主要是为了方便;你已经拥有了一个特定类的对象,现在你想要引用该类的一些静态项 - 只需使用你已经拥有的对象。这也允许子类化的一些更动态的行为。 E.g:
$foo = new SomeClassWithAVeryLongName;
$foo->bar($foo::BAZ); // much more concise than repeating SomeClassWithAVeryLongName::