【问题标题】:How to call PHP a class from parent namespace?如何从父命名空间调用 PHP 类?
【发布时间】:2013-12-31 18:30:55
【问题描述】:

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

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 怎么办?是否有类似双点“..”的东西来表示命名空间中的上层父目录?我正在尝试调用类似的东西

File: Plugin.php

$object = new ..\Process();

没用,看来只能从root一路开始就好了

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

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

【问题讨论】:

  • 你试过“usings”:use Application\Top;然后调用$object = new Child\Process();
  • @Saul 感谢您的回答,但我已经知道了,我正在尝试找出是否有更短的方法可以从子级别调用位于父级别正上方的类
  • 我明白了。我从来没想过,哈哈。我习惯把我的“usings”放在最上面,甚至是上面的命名空间。

标签: php namespaces


【解决方案1】:

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

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();

当你想在单引号中使用它们时,一定要使用双反斜杠。

【讨论】:

  • 谢谢,实际上我已经阅读了所有这些内容,这让我感到惊讶,命名空间并不像我想象的那样灵活,所以只是为了确认我是否没有遗漏什么。
猜你喜欢
  • 1970-01-01
  • 2012-08-22
  • 1970-01-01
  • 2013-09-07
  • 1970-01-01
  • 2020-06-08
  • 1970-01-01
  • 1970-01-01
  • 2014-08-12
相关资源
最近更新 更多