当传递给函数时,传递类名的PHP将变成字符串
以下是我想做的:当传递给函数时,传递类名的PHP将变成字符串,php,Php,以下是我想做的: public function all($model) { $query = 'SELECT ' . implode(', ', $model::$fields) ....; } 这样称呼: $thing->all(Account); 我得到这个错误: Parse error: syntax error, unexpected T_PAAMAYIM_NEKUDOTAYIM in /home/mark/public_html/*/account.php on lin
public function all($model) {
$query = 'SELECT ' . implode(', ', $model::$fields) ....;
}
这样称呼:
$thing->all(Account);
我得到这个错误:
Parse error: syntax error, unexpected T_PAAMAYIM_NEKUDOTAYIM in /home/mark/public_html/*/account.php on line 15
当使用var\u dump
检查$model
时,结果显示它是一个字符串。在第一个示例中,如果我在$query行中将$model
更改为Account
,则效果良好
如何将字符串转换回类
编辑:更新示例和标题以反映问题不在self
中
解决方案:因为我没有使用PHP5.3,所以我不得不使用eval()来获得我想要的。谢谢大家 试试“$this”而不是self Self在PHP中就是这样工作的。PHP认为它遇到了一个找不到的未知常量,然后假设它是一个包含“self”的字符串
编辑:您可以在实例化对象的地方发布类和代码吗?您不能这样使用
self
:它只能在静态上下文(即静态方法内部)中使用,以指向类,而不是其名称
如果您使用的是非静态方法(看起来是),那么应该使用$this
,而不是self
实际上,在PHP5.3之前,您不能使用带有“动态”(即包含在变量中)类名的静态方法/数据——请参见页面上的示例:对于这种操作,它们仅适用于PHP5.3 这意味着代码的一部分如下:
class ClassA {
public static $data = 'glop';
}
$className = 'ClassA';
var_dump($className::$data);
将不适用于PHP<5.3类在PHP中不是一等公民,因此它们可能不会存储在变量中、作为函数参数传递或从函数返回 但是,在某些情况下,PHP允许您使用包含类名称的字符串模拟一等公民:
$class = "Account";
$instance = new $class(); // You can create instances
call_user_func(array($class, 'frobnicate')); // You can call static functions
这就是PHP<5.3中的全部内容。但是,使用,您还可以:
$class::frobnicate(); // cleanly call static functions
$fields = $class::$fields; // access static variables
请参阅网页上的维基百科。特别是关于PHP和希伯来语的部分。我也遇到过这样的致命错误:
未找到类“MyClass”
当你的类有一个特定的名称空间时,可能是名称空间。您还需要在字符串变量中提到名称空间
$class = "App\MyClass"; // mention the namespace too
$instance = new $class();
我发现我的Laravel应用程序中也有类似的代码:
$thing->all(new Account);
我不认为是这样的-如果我传递类名也不行。self确实存在于php中。self指的是在静态上下文中使用的当前对象类类型。我实际上在使用静态类函数的内部,但如果我传递类名,它也不起作用。@Mark:yes;这是因为您无法使用PHP<5.3;,执行类似于
$className::$data
的操作;;只有当PHP>=5.3时才有可能,您使用的是什么版本的PHP?我想您需要使用PHP5.3来使用变量作为类名来访问该类中的静态变量。“Frobnite”是我最喜欢的新词。好的,我正在尝试访问静态变量,所以看起来我需要PHP5.3。谢谢。我不应该给出这个建议,因为eval
是邪恶的。。。但是您可以通过适当的预防措施使用eval('return'.$class.::$fields;')
来获取该静态变量。或者改用静态函数。:)这正是我最后要做的。不过,大家都同意这是邪恶的;)由于PHP5.5,您还可以使用“class”静态成员访问完全限定名,例如Account::class
。看:我得到了你想要的。维基文章并没有解释我为什么不能做上述工作。