传递给类名的PHP在传递给函数时会变成一个字符串

时间:2010-01-04 17:43:21

标签: 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 line 15

使用$model检查var_dump时,结果是一个字符串。在第一个示例中,如果我在$ query行上将$model更改为Account,则可以正常工作。

如何取一个字符串并将其转回一个类?

修改:更新了示例和标题以反映问题不在于self

解决方案:由于我没有使用PHP5.3,我不得不求助于使用eval()来获得我想要的东西。谢谢大家!

6 个答案:

答案 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'的字符串。

编辑:你可以发布实例化对象的类和代码吗?