2015-07-03 118 views
1

返回在Laravel(4 & 5)動態的類名的情況下,我試圖使用動態類名,然後直接調用它們,但在接收一個致命的錯誤,如果沒有第一它們存儲在一個本地字符串變量。Laravel錯誤使用方法

假設我有一個基本類:

class SimpleModel { 
    private $modelName; 

    function __construct($id) { 

     $this->modelName = AnotherModel::getName($id); 

    } 
} 

中的方法,我可以很容易做到

$modelName = $this->modelName; 
$modelName::find(1); 

,但我得到一個致命的錯誤嘗試以下時:

$this->modelName::find(1); 

這觸發一個Symfony\Component\Debug\Exception\FatalErrorException

消息3210
syntax error, unexpected '::' (T_PAAMAYIM_NEKUDOTAYIM) 

基本上T_PAAMAYIM_NEKUDOTAYIM是從::符號生成的語法錯誤。

不能完成我的周圍爲什麼Laravel(或PHP一般)使用局部變量(在方法中),而不是一類變量時,可以實現動態的類名頭。

我也試過把它在一個seprate方法getModelName()方法,但得到同樣的錯誤。

$this->getModelName()::find(1); 

每次(new $this->modelName)Instanciating一個新的類不是一個很好的解決方案。

我一直在尋找到使用PHP的Reflection但不知道如何做纔不至於每次instanciating一個新的類。 因爲它在使用本地字符串時正在工作,所以看起來Reflection可能是一個過度殺手。

回答

1

這是由於PHP解析器如何工作(高達PHP 5)。該T_PAAMAYIM_NEKUDOTAYIM令牌(::T_STRING後只允許(即代表一個類名,而不是引號內的字符串)或,因爲PHP 5.3,T_VARIABLE

您的代碼將在PHP 7,其中解析器已經從根本上重新設計工作(見:https://wiki.php.net/rfc/abstract_syntax_tree

演示:https://3v4l.org/sdBss

+0

感謝您解釋這一點。 – Yani

1

您可以使用call_user_funccall_user_func_array調用類的方法,其名稱都存儲在對象的屬性:

call_user_func(array($this->modelName, 'find'), 1) 

OR

call_user_func_array(array($this->modelName, 'find'), array(1)) 
+0

這樣的作品,但仍然沒有解釋爲什麼會發生。任何想法? – Yani

+2

因爲它根本不被支持。 – CBroe

+1

從PHP 5.3開始,它允許調用靜態方法並使用存儲在變量中的動態類名稱來訪問靜態屬性,例如:$ a :: foo(),但它不允許你想要做的事情。我也不清楚在調用靜態方法這種不尋常的方式時你看到了什麼好處。 –