在对象

时间:2016-03-24 09:13:12

标签: php

最近我发现有趣的代码用法,我不知道这是可能的。有人可以解释或给我手册页解释为什么下面的代码有效吗?我理解::可用于反映父,静态等方法或访问静态字段/方法,但参考$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,它会发出警告。

1 个答案:

答案 0 :(得分:4)

从PHP 5.3开始,您可以使用变量来引用具有::运算符的类。 The manual仅显示变量是字符串的用法,但实际上也可以在其位置使用对象;引用的类是对象是其实例的类。 statichttp://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::