donglie9067 2016-01-08 15:10
浏览 58
已采纳

如何做动态php命名空间

OK, Here is the actual issue broken down:

using namespacing:

 \home\Homecontroller::get(); // returns what I want

Without using namespacing:

$str = "Homecontroller@get"
$caller = explode('@', $str);
$caller[0]::$caller[1](); // returns what I want

Every attempt to do this dynamically fails

\$namespace\$caller[0]::$caller[1](); // fails
eval("\\${namespace}\\${caller[0]}::${caller[1]}()"); // fails

in the homecontroller.php file I have:

<?php
namespace home;
class Homecontroller {
    public function Homecontroller()
    {
        throw new Exception("Homecontroller is a static class");
    }
    public static function jsonify($data)
    {
        header('Cache-Control: no-cache, must-revalidate');
        header('Expires: Mon, 26 Jul 2016 05:00:00 GMT');
        header('Content-type: application/json');
        print json_encode ($data);
        exit();
    }
    public static function get()
    {
        $data = [];
        $data['message'] = "You have called the GET function";
        self::jsonify($data);
    }
}

I am building a framework that needs to respect the namespacing, but not specifically aware of them. I need to keep the namespaces listed in an external config file.

  • 写回答

1条回答 默认 最新

  • dongwei2030 2016-01-08 15:17
    关注

    Build the fully qualified class name as a string, then call the method on it:

    namespace home;
    class Homecontroller {
        private function __construct()
        {}
        public static function jsonify($data)
        {
            header('Cache-Control: no-cache, must-revalidate');
            header('Expires: Mon, 26 Jul 2016 05:00:00 GMT');
            header('Content-type: application/json');
            print json_encode ($data);
            exit();
        }
        public static function get()
        {
            $data = [];
            $data['message'] = "You have called the GET function";
            self::jsonify($data);
        }
    }
    $namespace = "home";
    $str = "Homecontroller@get";
    $caller = explode('@', $str);
    $cls = "\\$namespace\\$caller[0]";
    $method = $caller[1];
    
    $cls::$method();
    //or use call_user_func
    call_user_func([$cls, $method]);
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 公交车和无人机协同运输
  • ¥15 stm32代码移植没反应
  • ¥15 matlab基于pde算法图像修复,为什么只能对示例图像有效
  • ¥100 连续两帧图像高速减法
  • ¥15 组策略中的计算机配置策略无法下发
  • ¥15 如何绘制动力学系统的相图
  • ¥15 对接wps接口实现获取元数据
  • ¥20 给自己本科IT专业毕业的妹m找个实习工作
  • ¥15 用友U8:向一个无法连接的网络尝试了一个套接字操作,如何解决?
  • ¥30 我的代码按理说完成了模型的搭建、训练、验证测试等工作(标签-网络|关键词-变化检测)