Определение пространства имён

Пространство имён определяется посредством ключевого слова namespace, которое должно находиться в самом начале файла. Пример:

Пример #1 Определение пространства имён.

<?php
     namespace MyProject
::DB;

     const 
CONNECT_OK 1;

     class 
Connection /* ... */ }

     function 
connect() { /* ... */  }

     
?>
Это пространство имён может быть использовано в разных файлах.

Пространства имён могут включать определения классов, констант и функций. Но не должны включать обычного кода.

Определение пространства имён работает так:

  • Внутри пространства имён все имена классов, функций и констант автоматически будут префиксированы именем пространства имён. Имена классов при вызове должны быть полными, так например при вызове класса из примера выше должно использоваться следующее имя MyProject::DB::Connection.
  • Определения констант создают константы, состоящие из имени пространства имён и имени константы. Как и константы классов - константы пространства имён могут содержать данные только скалярного типа.
  • Поиск неквалифицированного имени класса (т.е. не содержащего ::) осуществляется в следующей последовательности:

    1. Попытка найти класс в текущем пространстве имён (т.е. префиксирование класса именем текущего пространства имён) без попытки автозагрузки (autoload).
    2. Попытка найти класс в глобальном пространстве имён без попытки автозагрузки (autoload).
    3. Попытка автозагрузки в текущем пространстве имён.
    4. В случае неудачи предыдущего - отказ.

  • Поиск неквалифицированного имени функции (т.е. не включающего ::) во время выполнения производится сначала в текущем пространстве имён, затем в глобальном пространстве имён.

  • Поиск неквалифицированного имени константы производится сначала в текущем пространстве имён, затем среди глобально объявленных констант.

Смотри так же правила разбора имён.

Коментарии

Автор:
@ RS: Also, you can specify how your __autoload() function looks for the files. That way another users namespace classes cannot overwrite yours unless they replace your file specifically.
2008-04-01 14:11:34
http://php5.kiev.ua/manual/ru/language.namespaces.definition.html
Автор:
There is nothing wrong with PHP namespaces, except that those 2 instructions give a false impression of package management.
... while they just correspond to the "with()" instruction of Javascript.

By contrast, a package is a namespace for its members, but it offers more (like deployment facilities), and a compiler knows exactly what classes are in a package, and where to find them.
2008-05-14 15:47:03
http://php5.kiev.ua/manual/ru/language.namespaces.definition.html
Автор:
I agree with SR, the new namespaces feature has solved a number of problems for me which would have required horrible coding to solve otherwise.

An example use:
Say you are making a small script, and write a class to connect to a database, calling it 'connection'. If you find your script useful and gradually expand it into a large application, you may want to rename the class. Without namespaces, you have to change the name and every reference to it (say in inheriting objects), possibly creating a load of bugs. With namespaces you can drop the related classes into a namespace with one line of code, and less chance of errors.

This is by no means one of the biggest problems namespaces solve; I would suggest reading about their advantages before citicising them. They provide an elegant solutions to several problems involved in creating complex systems.
2008-09-07 08:56:02
http://php5.kiev.ua/manual/ru/language.namespaces.definition.html
Regarding constants defined with define() inside namespaces...

define() will define constants exactly as specified.  So, if you want to define a constant in a namespace, you will need to specify the namespace in your call to define(), even if you're calling define() from within a namespace.  The following examples will make it clear.

The following code will define the constant "MESSAGE" in the global namespace (i.e. "\MESSAGE").

<?php
namespace test
;
define('MESSAGE''Hello world!');
?>

The following code will define two constants in the "test" namespace.

<?php
namespace test
;
define('test\HELLO''Hello world!');
define(__NAMESPACE__ '\GOODBYE''Goodbye cruel world!');
?>
2009-04-14 15:02:21
http://php5.kiev.ua/manual/ru/language.namespaces.definition.html
You should not try to create namespaces that use PHP keywords. These will cause parse errors. 

Examples:

<?php
namespace Project
/Classes/Function; // Causes parse errors
namespace Project/Abstract/Factory// Causes parse errors
?>
2009-07-14 11:43:55
http://php5.kiev.ua/manual/ru/language.namespaces.definition.html
"A file containing a namespace must declare the namespace at the top of the file before any other code"

It might be obvious, but this means that you *can* include comments and white spaces before the namespace keyword.

<?php
// Lots 
// of
// interesting
// comments and white space

namespace Foo;
class 
Bar {
}
?>
2009-10-05 07:20:48
http://php5.kiev.ua/manual/ru/language.namespaces.definition.html
Автор:
Expanding on @danbettles note, it is better to always be explicit about which constant to use.

<?php
    namespace NS
;

   
define(__NAMESPACE__ .'\foo','111');
   
define('foo','222');

    echo 
foo// 111.
   
echo foo// 222.
   
echo NSfoo  // 111.
   
echo NSfoo  // fatal error. assumes \NS\NS\foo.
?>
2013-08-09 00:46:33
http://php5.kiev.ua/manual/ru/language.namespaces.definition.html
Автор:
quote:
Defining namespaces

(...)
Namespaces are declared using the namespace keyword. A file containing a namespace must declare the namespace at the top of the file before any other code - with one exception: the declare keyword. 

end quote.

So we have a title that talks 'defining' and a piece of text that talks 'declare' three times, one of which could be referring to some other 'declare' than the former two.

Please, documentation authors -- get your act together, finally.
2014-02-25 01:42:00
http://php5.kiev.ua/manual/ru/language.namespaces.definition.html
If your code looks like this:

<?php
    namespace NS
;
?>

...and you still get "Namespace declaration statement has to be the very first statement in the script" Fatal error, then you probably use UTF-8 encoding (which is good) with Byte Order Mark, aka BOM (which is bad). Try to convert your files to "UTF-8 without BOM", and it should be ok.
2014-08-06 00:52:02
http://php5.kiev.ua/manual/ru/language.namespaces.definition.html
namespace declare must be starting of the script, only php tag can be written before namespace like this

<?php
namespace test
;       //this is right way
class Testclass{/*****/}
function 
test(/****/){}

?>
if you used any  other code like html tag or any javascript etc then it gives fatal error.

Example:
<html>
<head></head>
<body>
<?php
namespace test
;       //Fatal Error
class Testclass{/*****/}
function 
test(/****/){}

?>
2017-07-05 14:31:50
http://php5.kiev.ua/manual/ru/language.namespaces.definition.html

    Поддержать сайт на родительском проекте КГБ