【问题标题】:Using variable with Scope Resolution Operator in PHP在 PHP 中使用具有范围解析运算符的变量
【发布时间】:2015-11-10 21:29:21
【问题描述】:

我遇到的情况是,我必须使用静态方法,但我的类名存储在某个变量中。

根据此链接:http://php.net/manual/en/keyword.paamayim-nekudotayim.php#50310 我不能将变量与:: 一起使用。

作为参考,我的代码如下所示,我正在使用 Yii2 来处理这些东西:

$modelName = "User";

$query = $modelName::find();

显然它给了我错误,我给出的链接从现在开始已经有 10 年了,所以只是想检查一下这种情况是否有其他选择。

更新:

$query = AdminUser::find(); // Works Fine

$name = 'AdminUser';
$query = call_user_func("$name::find");
// Giving Below Error
call_user_func() expects parameter 1 to be a valid callback, class 'AdminUser' not found

【问题讨论】:

  • 根据link,从 php 5.3 开始,您可以将类名存储在变量中。你得到什么错误?您调用的函数是否定义为静态的?
  • @bryant 是的,我正在调用静态方法。
  • 在 2005 年写评论时,你不能。你的 PHP 版本是多少?
  • @ÁlvaroG.Vicario 我使用的是 5.5.12
  • 然后it should work。您可以编辑问题并粘贴错误消息吗?请使用剪贴板复制实际的错误信息,不要只用自己的话来描述。

标签: php oop yii2 static-methods scope-resolution


【解决方案1】:

您需要指定包含命名空间的类名。请参阅php docs。所以你的电话应该是这样的:

$name = __NAMESPACE__ . '\AdminUser';
$query = call_user_func("$name::find");

注意__NAMESPACE__ 常量返回当前命名空间。因此,如果您的 AdminUser 类属于不同的命名空间,您需要指定它。例如:

//your current namespace:
namespace app\controllers;
//and somewhere in your method:
$name = 'common\models\AdminUser';
$query = call_user_func("$name::find");

【讨论】:

    猜你喜欢
    • 2015-09-14
    • 2010-09-09
    • 2010-10-07
    • 1970-01-01
    • 1970-01-01
    • 2012-04-20
    • 2011-10-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多