Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当传递给函数时,传递类名的PHP将变成字符串_Php - Fatal编程技术网

当传递给函数时,传递类名的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
。看:我得到了你想要的。维基文章并没有解释我为什么不能做上述工作。