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它会发出警告.

解决方法:

PHP 5.3开始,您可以使用变量来引用带有::运算符的类. The manual显示变量是字符串的用法,但实际上也可以在其位置使用对象;引用的类是对象是其实例的类.静态手册中有一个例子:http://php.net/manual/en/language.oop5.static.php#language.oop5.static.properties.

所以,所有这些解决了同样的事情:

$foo = new Foo;
$foo::bar();

$foo = 'Foo';
$foo::bar();

Foo::bar();

这些方法总是被静态调用;对于已经静态的方法,这按预期工作,while for non-static methods an E_STRICT notice will be raised.

就我而言,这主要是为了方便;你已经拥有了一个特定类的对象,现在你想要引用该类的一些静态项 – 只需使用你已经拥有的对象.这也允许子类化的一些更动态的行为.例如.:

$foo = new SomeClassWithAVeryLongName;
$foo->bar($foo::BAZ); // much more concise than repeating SomeClassWithAVeryLongName::

相关文章

统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
前言 之前做了微信登录,所以总结一下微信授权登录并获取用户...
FastAdmin是我第一个接触的后台管理系统框架。FastAdmin是一...
之前公司需要一个内部的通讯软件,就叫我做一个。通讯软件嘛...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...