Описание нескольких пространств имен в одном файле

(PHP 5 >= 5.3.0)

Несколько пространств имен также можно описать в одном файле с помощью двух допустимых синтаксических конструкций.

Пример #1 Описание нескольких пространств имен, простой синтаксис

<?php
namespace MyProject;

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

namespace 
AnotherProject;

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

Данный синтаксис не рекомендуется для комбинирования пространств имен в одном файле. Вместо этого рекомендуется использовать альтернативный синтаксис со скобками.

Пример #2 Описание нескольких пространств имен, синтаксис со скобками

<?php
namespace MyProject {

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

namespace 
AnotherProject {

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

Настоятельно не рекомендуется при программировании комбинировать несколько пространств имен в один файл. Основным применением этому может быть объединение нескольких PHP файлов в один файл.

Для объединения кода в глобальном пространстве имен с кодом в других пространствах имен, используется только синтаксис со скобками. Глобальный код должен быть помещен в конструкцию описания пространства имен без указания имени:

Пример #3 Описание глобального и обычного пространства имен в одном файле

<?php
namespace MyProject {

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

namespace {       
// глобальный код
session_start();
$a MyProject\connect();
echo 
MyProject\Connection::start();
}
?>

PHP-код не может находиться вне скобок конструкции пространства имен, кроме начального выражения declare.

Пример #4 Описание глобального и обычного пространства имен в одном файле

<?php
declare(encoding='UTF-8');
namespace 
MyProject {

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

namespace {      
// глобальный код
session_start();
$a MyProject\connect();
echo 
MyProject\Connection::start();
}
?>

Коментарии

using of global namespaces and multiple namespaces in one PHP file increase the complexity and decrease readability of the code.
Let's try not use this scheme even it's very necessary (although there is not)
2013-07-31 01:04:12
http://php5.kiev.ua/manual/ru/language.namespaces.definitionmultiple.html
Автор:
<?php
//Namespace can be used in this way also
namespace MyProject {

function 
connect() { echo "ONE";  }
   
SubLevelconnect();
}

namespace MyProjectSub {
   
function 
connect() { echo "TWO";  }
   
Levelconnect();
}

namespace MyProjectSubLevel {
   
    function 
connect() { echo "THREE";  }   
   
MyProjectSubLevelconnect(); // OR we can use this as below
   
connect();
}
2015-02-21 11:43:14
http://php5.kiev.ua/manual/ru/language.namespaces.definitionmultiple.html
Автор:
Be careful with include combined to namespaces:

file b.php
<?php
   
const WHERE_I_AM 'I am in B';
   
    function 
i_am_in() { 
       
Acr_echo(WHERE_I_AM);
    }
?>

file c.php
<?php
    namespace C 
{
        const 
WHERE_I_AM 'I am in C';
       
        function 
i_am_in() { 
           
Acr_echo(WHERE_I_AM);
        }
    }
?>

main file

<?php
   
    namespace A 
{
   
        const 
CR "\r\n";
        const 
WHERE_I_AM 'I am in A';
       
        function 
cr_echo($msg) { 
            echo 
$msg CR;
        }
       
        function 
i_am_in() { 
           
cr_echo(WHERE_I_AM);
        }
    }
   
   
namespace B {
        require 
'b.php';
    }
   
   
namespace {
        require 
'c.php';
       
       
Ai_am_in(); //ok
       
Bi_am_in(); // fatal-error
       
Ci_am_in(); //ok
   
}
?>
2015-04-28 20:30:09
http://php5.kiev.ua/manual/ru/language.namespaces.definitionmultiple.html
<?php

// You cannot mix bracketed namespace declarations with unbracketed namespace declarations - will result in a Fatal error

namespace a;

echo 
"I belong to namespace a";

namespace b {
    echo 
"I'm from namespace b";
}
2015-06-24 15:52:36
http://php5.kiev.ua/manual/ru/language.namespaces.definitionmultiple.html
Автор:
//call same named function using namespace

//food.php

<?php
namespace Food
;

require (
'Apple.php');
require(
'Orange.php');

use 
Apples;
use 
Oranges;

 
Appleseat();
 
Orangeseat();
 
?>

//Apple.php
<?php
namespace Apples
;

function 
eat()
{
  echo 
"eat apple";
}
?>

//Orange.php
<?php
namespace Oranges
;

function 
eat()
{
  echo 
"eat Orange";
}
?>
2015-06-25 10:15:11
http://php5.kiev.ua/manual/ru/language.namespaces.definitionmultiple.html
Notice it's not allowed to mix bracketed namespace with unbracketed namespace declarations.

<?php
namespace MyTest
;

const 
TEST 777;

//in this way
echo MyTestTEST '<br />';

//Or this way
echo TEST '<br />';

namespace AnotherTest {

const 
TEST 555;

echo 
AnotherTestTEST '<br />';
echo 
MyTestTEST;
}
?>

This code will issue a fatal error, like this: Fatal error: Cannot mix bracketed namespace declarations with unbracketed namespace declarations in C:\xampp\htdocs\teste2.php on line 11.
2016-03-08 04:18:22
http://php5.kiev.ua/manual/ru/language.namespaces.definitionmultiple.html
In addition to  kothnok at gmail dot com

When using namespaces with brackets, you should define the USE statements within the brackets. His example sets the global use for the file.

<?php

namespace Space1
;
use 
SomeNamespaceFunctionCollection as FC;
{
     
FChello_world();
}

namespace Space2;
{
     
// This can be used here
     
FChello_world();
}
?>

While the preferred method with brackets is this:
<?php

namespace Space1
{
     use 
SomeNamespaceFunctionCollection as FC;
     
FChello_world();
}

namespace Space2;
{
     
// This will not work now
     
FChello_world();
}
?>
2016-08-01 11:03:35
http://php5.kiev.ua/manual/ru/language.namespaces.definitionmultiple.html
With the bracketed syntax, a simple white space after the closing "?>" of the file, even a new line that is some times  considered as the end of a line and thus a part of the line, will (at the least in some php installations) be considered as code outside the brackets and will result in an error. It's general good practice to avoid white space after the closing "?>". Just pointing out that it is another case where it matters.
2016-09-20 20:26:27
http://php5.kiev.ua/manual/ru/language.namespaces.definitionmultiple.html
If you have the habit to always use the closing PHP tag "?>" in your test files, remember that with the bracketed syntax code outside the brackets, including new lines outside the PHP tags,  is not allowed.  In particular, even though PHP sees a new line after the closing tag  as a part of the line and eats it, some editors, such as  Gedit, Gvim, Vim and Nano in Ubuntu,  will  add yet another new line after this new line and this will create an error.
2016-09-24 17:33:18
http://php5.kiev.ua/manual/ru/language.namespaces.definitionmultiple.html
There are rational examples of where the ability to blend multiple namespaces into a single file is not only desirable but also absolutely necessary.  An example of where this ability is useful is over in the very popular phpseclib library where they are PSR-4 compliant but, in order to be compliant, they have to read a directory of files to know what classes are available so that the autoloader can load the correct files.  If they, instead, just bundled the defaults into one file using this mechanism already supported by PHP core, there would be no need to do extraneous scanning of the file system.

That's just one legitimate use-case where strict compliance with PSRs gets in the way of good software development.
2017-06-15 02:18:41
http://php5.kiev.ua/manual/ru/language.namespaces.definitionmultiple.html

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