如何从父命名空间调用PHP一个类?

use*_*300 7 php namespaces

我有以下命名空间结构与以下类文件

Application
|->App.php
|->Top
   |->Start.php
   |->Process.php
   |->Child
      |->Plugin.php
Run Code Online (Sandbox Code Playgroud)

所以我在App.php中声明过

namespace Application;
Run Code Online (Sandbox Code Playgroud)

在Startp.php声明

namespace Application\Top;
Run Code Online (Sandbox Code Playgroud)

在Plugin.php声明

namespace Application\Top\Child;
Run Code Online (Sandbox Code Playgroud)

我看到我可以从App.php中调用Plugin.php类

$object = new Top\Child\Plugin();
Run Code Online (Sandbox Code Playgroud)

如果它是一个子/孙子命名空间,但是如果我想从Plugin.php调用Process.php,这是来自分支的父命名空间呢?是否有类似双点".."的东西来表示命名空间中的上部父目录?我试着打电话

File: Plugin.php

$object = new ..\Process();
Run Code Online (Sandbox Code Playgroud)

它没有用,看起来我只能从根开始一路就好

$object = new \Application\Top\Process()
Run Code Online (Sandbox Code Playgroud)

这是唯一的选择吗?谢谢!

kli*_*ach 8

正如它在这里提到的http://www.php.net/manual/en/language.namespaces.basics.php(在评论中),只有一种方法来指定名称空间 - 来自root.您不能使用.. \来缩短名称空间调用.要缩短代码中的调用,您可以使用

use \Application\Top\Process as SomeProcess;
Run Code Online (Sandbox Code Playgroud)

并使用,首先在您的代码

$object = new SomeProcess();
Run Code Online (Sandbox Code Playgroud)

您也可以编写类加载器.要调用$ object = new ..\Process(); 这是草图:

$classPath = explode("\\", __NAMESPACE__);
array_pop($classPath);
$newClassPath = implode("\\", $classPath) . '\'. 'Process';
$object = new $newClassPath();
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,实际上我已经阅读了所有这些,我只是惊讶于命名空间不像我想的那样灵活,所以只是为了确认我是否没有遗漏某些东西. (2认同)