2011-07-04 54 views
6

我只是很好奇PHP是否可以在飛行中創建對象。我以爲我以前看過它。當然,我可以將它分配給一個變量,但只是想知道這是否可能。用PHP創建對象而不用變量賦值使用PHP

new className()->someMethod(); 

當然這會拋出一個語法錯誤,所以顯然它沒有這樣做(如果甚至可能的話)。 我應該把它分配給一個變量,因爲我真的沒有問題,我只是好奇嗎?


只是一些進一步的細節。靜態方法並不是真正的選擇,因爲我正在嘗試這樣做的類是PHP的ReflectionMethod類。

+6

你嘗試過'(new className()) - > someMethod();'? – jerluc

+0

@jerluc:它不會工作 – zerkms

+0

是的,它不工作就像那個jerluc。 –

回答

1

這隻適用於如果您使用單例模式來實例化對象的情況。如果您不知道如何實現單例模式,則必須在網絡上搜索。但是這樣一來,將工作:

className::getInstance()->someMethod(); 

編輯

正如zerkms表示工廠方法也將是可能的:

class ReflectionFactory 
{ 
    public static function factory($arguments) 
    { 
     return new ReflectionClass($arguments); 
    } 
} 

// Then in your code for example 
ReflectionFactory::factory()->getConstants(); 
+1

+1這將是首選的方法。但是,這隻有在單身人士適合OP的情況下才是正確的。 – jerluc

+0

這種方法很好,但不可能,因爲我正在嘗試爲PHP ReflectionMethod類做到這一點。 –

+2

@jerluc:如果它不合適 - 那麼工廠可以取代它;-) – zerkms

0

目前在PHP是不可能實例化新對象並在一個表達式中調用它的方法。

所以顯然你需要將它分配給一些變量。

+0

這值得一試。 :) –

0

您可以在不將類的實例保存到變量的情況下在類上使用靜態方法。

class testClass{ 
    public static function staticMethod(){ 
     echo "Static method"; 
    } 
} 

testClass::staticMethod(); 
-1

我不知道爲什麼PHP不允許鏈接的構造函數。如果你真的需要這樣做,可以嘗試下面的內容,並進行必要的調整。

<?php 
class A { 
    public function b() 
    { 
    echo "a->B is called"; 
    } 
    public static function factory() 
    { 
    return new self; 
    } 

} 
$a = A::factory()->b(); 
?> 
9

此用法在Java中是典型的,但在PHP 5.3之前不可用。現在它是PHP 5.4中的一個新功能。請檢查PHP 5.4 new features。和使用應該是:

(new Foo)->bar() 
+0

這是(現在)這裏正確的答案。 – James

+0

令人驚歎!無需爲每個類編寫'create()'! – zjuwujunchao