一尘不染

具有动态类名称的PHP名称空间

php

想知道是否有人在使用新功能通过PHP 5.3对类进行命名空间时是否遇到了此问题。

我正在使用单独的类来生成动态类调用,以在应用程序中定义用户类型。基本上,类定义器采用类型的整数表示形式并解释它们,返回一个包含要用作该用户模型的类名的字符串。

我在全局范围内定义了具有该名称的用户类型的对象模型,但是在Editor名称空间中,该用户的编辑器具有另一个名称相同的对象。由于某些原因,PHP不允许我进行如下命名空间的动态调用。

$definition = Definer::defineProfile($_SESSION['user']->UserType);
new \Editor\$definition();

相同的语法可用于在全局名称空间中调用全局基本对象模型,我在整个应用程序中都以这种方式可靠地使用了它。

$definition = Definer::defineProfile($_SESSION['user']->UserType);
new $definition();

这将正确调用动态所需的类。

两者是否有不同的表现是有原因的,还是由于此功能是新功能而尚未在此庄园中实现对名称空间的动态调用?是否有另一种方法可以从另一个名称空间动态调用类,而无需在变量中显式地将其名称放入代码中呢?


阅读 286

收藏
2020-05-29

共1个答案

一尘不染

好吧,只需在字符串中说明名称空间:

$definition = Definer::defineProfile($_SESSION['user']->UserType);
$class = '\\Editor\\' . $definition;
$foo = new $class();

如果它是子名称空间(如注释中所示),则只需在名称空间前添加__NAMESPACE__

$class = __NAMESPACE__ . '\\Editor\\' . $definition;

因此,如果当前名称空间是\Foo\Bar,并且$definition是“ Baz”,则结果类将是\Foo\Bar\Editor\Baz

2020-05-29