2013-12-13 2 views
3

У меня есть следующая структура имен со следующими файлами классовКак вызвать PHP класс из родительского пространства имен?

Application 
|->App.php 
|->Top 
    |->Start.php 
    |->Process.php 
    |->Child 
     |->Plugin.php 

Так app.php я объявил

namespace Application; 

в Startp.php заявил

namespace Application\Top; 

в плагине .php

namespace Application\Top\Child; 

Я вижу, что я могу назвать класс plugin.php из app.php как

$object = new Top\Child\Plugin(); 

, если это ребенок/внучат пространство имен, но что, если я хочу, чтобы позвонить process.php из plugin.php, который является родительским пространством имен из ветки? Есть ли что-то вроде двойных точек «..», чтобы указать верхний родительский каталог в пространстве имен? Я пытаюсь вызвать что-то вроде

File: Plugin.php 

$object = new ..\Process(); 

он не работает, он выглядит, как я могу начать только весь путь от корня, как

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

Это единственный вариант? Спасибо!

+0

Вы пробовали "usings": 'Использование Application \ Top;' и затем вызвать '$ объект = новый дочерний \ Process();' –

+0

@Saul Спасибо за ответ, но Я уже знаю это, я пытаюсь выяснить, есть ли более короткий способ вызвать класс, который находится прямо над родительским уровнем от дочернего уровня – user702300

+0

. Я никогда не думал об этом, ха-ха. Я привык ставить свои «заголовки» наверху, даже пространство имен выше. –

ответ

5

Как указано здесь http://www.php.net/manual/en/language.namespaces.basics.php (в комментариях) существует только один способ указать пространства имен - от root. Вы не можете использовать .. \ для сокращения вызовов пространства имен. Для того, чтобы сократить звонки в вас код, который вы можете использовать

use \Application\Top\Process as SomeProcess; 

и использовать объект $ = новый SomeProcess();

Также вы можете написать свой загрузчик классов. Вызов $ object = new .. \ Process(); Вот эскиз:

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

Спасибо, на самом деле я все это прочитал, меня просто поражает, что пространство имен не является гибким, как я думал, поэтому просто чтобы подтвердить, что у меня что-то не хватает. – user702300

Смежные вопросы