使用变量类名和命名空间创建对象

时间:2017-07-24 16:41:22

标签: php class object namespaces php-7

我正在尝试创建一个带有参数的对象来加载函数,同时在其中使用缩短命名空间路径。它就像,

    use Com\Core\Service\Impl as Impl;

    class Load {
        public static function service(String $class, array $params = array()){
            try {
                $ucfirstclass = ucfirst($class);
                if (interface_exists('\\Com\\Core\\Service\\' . $ucfirstclass)) {
                    $ref = "Impl\\".$ucfirstclass;
                    return new $ref();
                } else {
                    throw new Exception("Service with name $class not found");
                }
            } catch (\Throwable $ex) {
                echo $ex->getMessage();
            }
        }
    }

虽然称之为,

    $userService = Load::service("user"); 

它正在抛出异常

    Class 'Impl\User' not found

如果我只是替换" Impl"它会正常工作。在Load :: service()实现中使用完整路径" Com \ Core \ Service \ Impl"。

我对此很新。有人可以帮助我为什么不能使用缩短路径" Com \ Core \ Service \ Impl作为Impl" ?

2 个答案:

答案 0 :(得分:2)

  

在其中使用缩短命名空间路径。

没有"短命名空间"。命名空间或类由其完整路径确定,从根命名空间开始。

use Com\Core\Service\Impl as Impl;
上面代码片段中的

Implclass or namespace alias。别名在编译时解析,并且仅在声明它的文件中有效。

在运行时期间无法使用别名。在运行时期间引用类名的唯一方法是生成其绝对路径(从根命名空间开始) 你已经发现了这个。

详细了解namespace aliases/importing

答案 1 :(得分:1)

当将类名称称为string时,您始终必须使用完全限定的类名。

试试这个:

$ucfirstclass = ucfirst($class);

if (interface_exists('Com\\Core\\Service\\' . $ucfirstclass)) {
    $ref = 'Com\\Core\\Service\\Impl\\' .$ucfirstclass;

    return new $ref();
}

供参考,见: