2013-03-06 2 views
3

Я довольно новичок в пространствах имен (и да, я прочитал раздел пространств имен документации PHP). Мне интересно, какова область пространств имен в отношении нескольких файлов. Является ли пространство имен допустимым для одного файла, когда я включаю или требую этот файл в файле с глобальным кодом? И, кроме того, как это влияет на глобальный код? Я был бы вынужден изменить что-либо синтаксически с глобальным кодом.Несколько файлов и пространств имен Область

Например, допустим, что у меня есть файл A.php. То, что я хочу быть в состоянии иметь это:

namespace A; 
class Abc { ... } 

А потом скажем, у меня есть файл с глобальным кодом, называют его main.php:

include("A.php"); 
class Abc { ... } 
$abc = new Abc(); // Should be global Abc, right? 
$abcFromNameSpace = new A\Abc(); // Should be namespace Abc, right? 
... 

Как последующей вопрос, Мне также интересно, что произойдет с областью видимости, если я должен включить файл с пространствами имен внутри другого файла с пространствами имен, в отличие от вышеприведенного примера, где main.php имеет только глобальный код. Будет ли эта работа, как это:

namespace A; 
class Abc { ... } 

А потом скажем, у меня есть файл с глобальным кодом, назовем его B.php:

namespace B; 
include("A.php"); 
class Abc { ... } 
$abc = new B\Abc(); // Should be namepsace B Abc, right? 
$abcFromNameSpace = new A\Abc(); // Should be namespace A Abc, right? 

ответ

4

В любое время вы обратитесь к классу, который находится за пределами текущий файл или класс область применения, использовать его пространство имен:

<?php 
namespace B; 

$class = new \A\Abc(); 

Но если вы «использовать» пространство имен в сценарии, вы можете оставить его:»

<?php 
namespace B; 

use A\Abc; 

$class = new Abc(); 
+0

Просто, чтобы уточнить, поэтому область пространств имен ограничена файлом? В случае глобального примера (первый пример), в main.php, если я делаю $ class = new Abc(); то я имею в виду глобальный класс. И если я хочу обратиться к классу Abc пространства имен A, я должен сделать $ class = new \ A \ Abc(); Да? –

+0

правильный. если вы не определяете пространство имен в верхней части файла, имена классов просматриваются в глобальной области. В противном случае 'Abc()' будет искать только в пространстве имен файлов (если вы не добавили обратную косую черту для утверждения глобального пространства имен). –

+1

Я вижу. Мне кажется странным, что область видимости имен не выходит за пределы файла, который они определены, когда этот файл включен в другой файл. Я имею в виду, что весь другой код становится частью файла, который он включен в строку, в которую входит оператор include. –

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