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

(PHP 5 >= 5.3.0)

Хотя любой исправный PHP-код может находиться внутри пространства имен, только классы, интерфейсы, функции и константы зависят от него.

Пространства имен объявляются с помощью зарезервированного слова namespace. Файл, содержащий пространство имен, должен содержать его объявление в начале перед любым другим кодом, кроме зарезервированного слова declare.

Пример #1 Объявление единого пространства имен

<?php
namespace MyProject;

const 
CONNECT_OK 1;
class 
Connection /* ... */ }
function 
connect() { /* ... */  }

?>
Только выражение declare может находиться перед объявлением пространства имен для указания кодировки файла. Кроме того, объявлению пространства имен не должен предшествовать не PHP-код, в том числе лишние пробелы:

Пример #2 Объявление простого пространства имен

<html>
<?php
namespace MyProject// fatal error - объявление пространства имен должно быть первым выражением в скрипте
?>

Кроме того, в отличии от любой другой конструкции PHP, одно и тоже пространство имен можно определять в нескольких файлах, что позволяет распределять находящееся в них по файловой системе.

Коментарии

Автор:
@ 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

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