PHP 7.1.0 Released

Mehrere Namespaces in der selben Datei definieren

(PHP 5 >= 5.3.0, PHP 7)

Es können auch mehrere Namespaces in der selben Datei definiert werden. Es gibt hierfür zwei mögliche Schreibweisen:

Beispiel #1 Mehrere Namespaces definieren, einfache Kombinationssyntax

<?php
namespace MyProject;

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

namespace 
AnotherProject;

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

Diese Syntax ist nicht die empfohlene Syntax, um mehrere Namespaces in einer einzigen Datei zusammenzuführen. Stattdessen wird die geklammerte Syntax empfohlen.

Beispiel #2 Mehrere Namespaces definieren, geklammerte Syntax

<?php
namespace MyProject {

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

namespace 
AnotherProject {

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

Es wird stark von der Programierpraxis mehrere Namespaces in einer Datei zu definieren abgeraten. Der wichtigste Einsatzzweck für diese Möglichkeit ist es, mehrere PHP-Skripte in der selben Datei zusammenzuführen.

Um Code ohne Namensräume mit solchem mit Namensräumen zusammenzuführen, wird nur die geklammerte Syntax unterstützt. Globaler Code sollte in einem Namespace-Statement ohne Namespace eingeschlossen werden:

Beispiel #3 Mehrere Namespaces und Code ohne Namespace deklarieren

<?php
namespace MyProject {

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

namespace { 
// global code
session_start();
$a MyProject\connect();
echo 
MyProject\Connection::start();
}
?>

Es darf kein PHP-Code außerhalb der Namespace-Klammern existieren, abgesehen von einem beginnenden declare-Ausdruck.

Beispiel #4 Mehrere Namespaces und Code ohne Namespace deklarieren

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

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

namespace { 
// globaler Code
session_start();
$a MyProject\connect();
echo 
MyProject\Connection::start();
}
?>

add a note add a note

User Contributed Notes 9 notes

up
31
leaksin [ at ] gmail [ dot ] com
3 years ago
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)
up
10
jigar dot vy at gmail dot com
1 year ago
<?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";
}
up
8
Rahul Sonar
1 year ago
<?php
//Namespace can be used in this way also
namespace MyProject {

function
connect() { echo "ONE";  }
   
Sub\Level\connect();
}

namespace
MyProject\Sub {
   
function
connect() { echo "TWO";  }
   
Level\connect();
}

namespace
MyProject\Sub\Level {
   
    function
connect() { echo "THREE";  }   
    \
MyProject\Sub\Level\connect(); // OR we can use this as below
   
connect();
}
up
4
Ishan Fernando
1 year ago
//call same named function using namespace

//food.php

<?php
namespace Food;

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

use
Apples;
use
Oranges;

 
Apples\eat();
 
Oranges\eat();
?>

//Apple.php
<?php
namespace Apples;

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

//Orange.php
<?php
namespace Oranges;

function
eat()
{
  echo
"eat Orange";
}
?>
up
0
dominic_mayers at yahoo dot com
2 months ago
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.
up
-1
Luis Pessoa
1 year ago
Be careful with include combined to namespaces:

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

file c.php
<?php
   
namespace C {
        const
WHERE_I_AM = 'I am in C';
       
        function
i_am_in() {
            \
A\cr_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';
       
        \
A\i_am_in(); //ok
       
\B\i_am_in(); // fatal-error
       
\C\i_am_in(); //ok
   
}
?>
up
-1
martin_winkel at hotmail dot com
4 months ago
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
SomeNamespace\FunctionCollection as FC;
{
    
FC\hello_world();
}

namespace
Space2;
{
    
// This can be used here
    
FC\hello_world();
}
?>

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

namespace Space1
{
     use
SomeNamespace\FunctionCollection as FC;
    
FC\hello_world();
}

namespace
Space2;
{
    
// This will not work now
    
FC\hello_world();
}
?>
up
-1
maycon dot rodrigues1 at gmail dot com
8 months ago
Notice it's not allowed to mix bracketed namespace with unbracketed namespace declarations.

<?php
namespace MyTest;

const
TEST = 777;

//in this way
echo \MyTest\TEST . '<br />';

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

namespace
AnotherTest {

const
TEST = 555;

echo \
AnotherTest\TEST . '<br />';
echo \
MyTest\TEST;
}
?>

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.
up
-4
dominic_mayers at yahoo dot com
2 months ago
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.
To Top