2015-07-03 77 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(),但它不允许你想要做的事情。我也不清楚在调用静态方法这种不寻常的方式时你看到了什么好处。 –