簡體   English   中英

在對象上使用::運算符

[英]Using the :: operator on an object

最近我發現有趣的代碼使用,我不知道它是可能的。 有人可以解釋或給我手冊頁解釋為什么下面的代碼有效嗎? 我理解::可以用於反映父,靜態等方法或訪問靜態字段/方法,但引用$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開始,您可以使用變量來引用帶有::運算符的類。 該手冊僅顯示變量是字符串的用法,但實際上也可以在其位置使用對象; 引用的類是對象是其實例的類。 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方法,這可以按預期工作, 而對於非靜態方法,將引發E_STRICT通知。

就我而言,這主要是為了方便; 你已經擁有了一個特定類的對象,現在你想要引用該類的一些靜態項 - 只需使用你已經擁有的對象。 這也允許子類化的一些更動態的行為。 例如:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM