2013-10-18 31 views
1

假設你可以在PHP5.4做(new Object)->method() +我想知道爲什麼我不能做到這一點:PHP分配返回值

<?php 

class Item { 
    public $property = 'test'; 
} 

class Container 
{ 
    public function getItem() 
    { 
     return new Item(); 
    } 
} 

echo get_class(($object = (new Container())->getItem())); // returns Item 

// this comes up with error 
echo ($object = (new Container())->getItem())->property; 

爲什麼代碼的最後一行觸發PHP Parse error: syntax error, unexpected '->' (T_OBJECT_OPERATOR)

編輯:

看起來我需要澄清我的問題,因爲我看到完全與我的問題無關的答案。我不問如何擺脫語法錯誤。我的問題是: 爲什麼我無法訪問表達式($object = (new Container())->getItem())上的屬性,而get_class()告訴我這是一個Item的實例?

+0

即使它是可能的,你爲什麼要? – HamZa

+0

那又怎麼樣:'echo(new Container()) - > getItem() - > property;'???或者使它與你的assingment一起工作:echo $ property =(new Container()) - > getItem() - > property;' – shadyyx

+0

@HamZa我不想這樣做,我只是想知道爲什麼get_class告訴我我有Item類的對象,但我無法訪問它的屬性。 –

回答

6

只能間接引用在PHP 5.4函數的返回值(我相信在5.5你可以解引用新創建的陣列狀['x','y','z'][$index]

由於分配不是一個函數,你不能取消對它的引用。

+0

你能提供更多細節嗎?根據[PHP手冊](http://php.net/manual/en/language.operators.assignment.php):_賦值表達式的值是分配的值。也就是說,「$ a = 3」的值是3._我認爲'($ object =(new Container()) - > getItem())'的值等價於'$ object'。這就是'get_class'所說的。 –

+2

解引用是一種特殊的語法,它發生在解析階段(執行ANY代碼之前)。解析器不能「看到」賦值是可以被解除引用的東西,因爲這取決於運行時發生的事情。 –

0

爲什麼不使用擴展類?

class Item { 
public $Val = "Testing"; 

} 

class Container extends Item { 

    public function getItem() 
    { 
     return new Item(); 
    } // This method is no longer needed 

} 


$Object = new Container(); 
echo $Object->Val; // Output of: Testing 

這因爲PHP4

Manual For Extends

已經提供或者,如果你想要初始化從OOP範圍對象:

Class Item { 
public $Val = "SomeString"; 
} 

class Container { 
public $Instance; 
public function __construct(){ 
    $this->Instance = new Item(); 
} 

} 
$Object = new Container(); 
echo $Object->Instance->Val;