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

8
我有以下的命名空间结构和相应的类文件。
Application
|->App.php
|->Top
   |->Start.php
   |->Process.php
   |->Child
      |->Plugin.php

在App.php中,我已经声明了:
namespace Application;

在 Startp.php 中声明

namespace Application\Top;

在Plugin.php中声明

namespace Application\Top\Child;

我发现可以在App.php中调用Plugin.php类,如下所示:
$object = new Top\Child\Plugin();

如果它是子/孙命名空间,但如果我想从Plugin.php调用Process.php,而Plugin.php是来自该分支的父命名空间呢?是否有类似于双点“..”表示命名空间中上级目录的方法?我正在尝试调用类似于以下内容的内容:

File: Plugin.php

$object = new ..\Process();

它没起作用,看起来我只能从根目录开始启动。

$object = new \Application\Top\Process()

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


你尝试过使用 "usings" 吗:use Application\Top; 然后调用 $object = new Child\Process(); - Saul Martínez
@Saul 谢谢你的回答,但我已经知道了,我正在尝试找出是否有一种更短的方法从子级别调用位于父级别正上方的类。 - user702300
我明白了。我从来没有想过,哈哈。我习惯把我的“using”放在顶部,甚至是命名空间的上面。 - Saul Martínez
1个回答

13

正如在这里提到的 http://www.php.net/manual/zh/language.namespaces.basics.php(评论中),只有一种指定命名空间的方式 - 从根目录开始。您不能使用 ..\ 来缩短命名空间调用。要在代码中缩短调用,可以使用

use \Application\Top\Process as SomeProcess;

然后在你的代码中使用

$object = new SomeProcess();

你也可以编写自己的类加载器。要调用 $object = new ..\Process(); 可以按照以下大纲进行:

$classPath = explode("\\", __NAMESPACE__);
array_pop($classPath);
$newClassPath = implode("\\", $classPath) . '\\'. 'Process';
$object = new $newClassPath();

在单引号中使用反斜杠时,请确保使用两个反斜杠。


2
谢谢,实际上我已经阅读了所有这些内容,只是让我惊讶的是命名空间并不像我想象的那么灵活,所以只是想确认一下我是否漏掉了什么。 - user702300

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接