从变量名创建对象

4

如何从变量中创建单行的类对象:

$strClassName = 'CMSUsers';
$strModelName = $strClassName.'Model';
$strModelObj = new $strModelName();

以上代码成功创建了我的CMSUsersModel类对象,但是当我尝试:
$strClassName = 'CMSUsers';
$strModelObj = new $strClassName.'Model'();

出现错误提示,内容为:

Parse error: syntax error, unexpected '(' in 

为什么需要这个“优化”? - biakaveron
在对象实例化时不能进行字符串连接。 - Shameer
可能是从变量实例化新对象的重复问题。 - Tomas Gonzalez
3个回答

14

创建对象时不能使用字符串连接。

如果你使用

class aa{}

$str = 'a';
$a = new $str.'a';   // Fatal error : class a not found



class aa{}

$str = 'a';
$a = new $str.$str; // Fatal error : class a not found

所以你应该使用

$strModelName = $strClassName.'Model';
$strModelObj = new $strModelName();

1

我不确定,因为我对类和PHP不是很了解,但我认为$strModelName是类定义,因此我认为你必须使用一两行或者写出像这样的代码:

$strModelName = 'CMSUsers'.'Model'; $strModelObj = new $strModelName();

0
从PHP 8.0.0开始,支持使用任意表达式进行new实例化。这允许更复杂的实例化,如果表达式产生一个字符串的话。(示例#4 使用任意表达式创建实例
然而,表达式必须用括号括起来。new运算符的优先级高于字符串连接.(参见运算符优先级),所以$strModelObj = new $strClassName.'Model'();意味着$strModelObj = (new $strClassName).('Model'());。正确的括号应该是$strModelObj = new ($strClassName.'Model')();
PHP 8的最小工作示例(MWE):
<?php
class CMSUsersModel {}
$strClassName = 'CMSUsers';
$strModelObj = new ($strClassName.'Model')();
var_dump($strModelObj);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接