[英]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.