这就是我想要做的事情:
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
使用$model
检查var_dump
时,结果是一个字符串。在第一个示例中,如果我在$ query行上将$model
更改为Account
,则可以正常工作。
如何取一个字符串并将其转回一个类?
修改:更新了示例和标题以反映问题不在于self
。
解决方案:由于我没有使用PHP5.3,我不得不求助于使用eval()来获得我想要的东西。谢谢大家!
答案 0 :(得分:28)
类不是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。但是,使用PHP 5.3,您还可以:
$class::frobnicate(); // cleanly call static functions
$fields = $class::$fields; // access static variables
答案 1 :(得分:1)
我还遇到了这样的致命错误:Class 'MyClass' not found
当你的班级有特定的命名空间时,它可能就是命名空间。您还需要在String变量中提及命名空间。
$class = "App\MyClass"; // mention the namespace too
$instance = new $class();
答案 2 :(得分:0)
你不能以这种方式使用self
:它只能在静态上下文中使用(即在静态方法中)指向类 - 而不是它的名字。
如果您正在使用非静态方法(似乎是),则应使用$this
,而不是self
。
实际上,在PHP 5.3之前,你不能使用带有“动态”(即包含在变量中)类名的静态方法/数据 - 请参阅页面Static Keyword上的示例:它们仅适用于PHP 5.3,那种操纵。
这意味着像这样的代码的一部分:
class ClassA {
public static $data = 'glop';
}
$className = 'ClassA';
var_dump($className::$data);
无法使用PHP< 5.3
答案 3 :(得分:0)
在scope resolution operator上查看维基百科。特别是关于PHP和希伯来语的部分。
答案 4 :(得分:-1)
我发现这条相似的系列适用于我的Laravel应用程序:
$thing->all(new Account);
答案 5 :(得分:-2)
尝试'$ this'而非self。
Self在PHP中以这种方式工作。 PHP认为它遇到了一个无法找到的未知常量,然后它假定它是一个包含'self'的字符串。
编辑:你可以发布实例化对象的类和代码吗?