【问题标题】:PHP Using variable to call namespacePHP使用变量调用命名空间
【发布时间】:2017-05-20 04:39:06
【问题描述】:

是否可以使用变量调用命名空间?

例如:

$class_name     = strtolower( $interface_name );
$return['html'] = \interfaces\$class_name::get_loginForm();

但是,这会返回错误:

解析错误:语法错误,意外的 '$class_name' (T_VARIABLE), 期望标识符 (T_STRING)

我正在连接几个 3rd 方 API,它们都做同样的事情,但以自己独特的方式。在加入我们的网站之前,用户已经连接到他们首选的 API。不同 API 的中间件将存储在同一命名空间下的定制文件中。

有可能解决在接口名称上运行开关并调用相关命名空间的问题,但这意味着每次出现新 API 时都必须定位并添加到开关,因此任何帮助这个问题将不胜感激。干杯。

【问题讨论】:

  • $return['html'] = '\\interfaces\\'.$class_name.''::get_loginForm();

标签: php class variables scope namespaces


【解决方案1】:

你可以这样运行它:

这是一个测试代码和 live demo

<?php
namespace App\animal;
$animal = 'animal';

class dog{
    function __construct()
    {
        echo __METHOD__,"\n";
    }
    public function data(){return 'dog';}
    static function cat(){return 'cat';}
}

$name = '\App\\'.$animal.'\\dog';
$dog = new $name;
echo $dog->data();
echo "\n";
echo $name::cat();

【讨论】:

  • 感谢您的帮助!可悲的是,它仍然返回一个错误:Uncaught Error: Class 'bromcom' not found in /path/classes/Model.php:643 ...。模型在它自己的命名空间中,这可能会导致范围问题?
  • 非常感谢您的帮助!完美运行。赞成。 John 提出的方法使用原生 PHP 函数更简洁一些,所以我选择了它作为接受的答案。
【解决方案2】:

@Kris Roofe 的答案应该有效,但我会使用 call_user_func_array 函数 http://php.net/manual/de/function.call-user-func-array.php 以不同的方式处理它

例子:

call_user_func_array( $function_as_string.'::'.$method_as_string, $params );

$params 是一个数据数组,将作为方法参数传递给所述函数。

所以在你的例子中它会是

call_user_func_array('\\interfaces\\'.$class_name.'::get_loginForm');

【讨论】:

    猜你喜欢
    • 2013-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-08
    相关资源
    最近更新 更多