©
Ce document utilise Manuel du site Web PHP chinois Libérer
(PHP 5 >= 5.3.0)
也可以在同一个文件中定义多个命名空间。在同一个文件中定义多个命名空间有两种语法形式。
Example #1 定义多个命名空间,简单组合语法
<?php
namespace MyProject ;
const CONNECT_OK = 1 ;
class Connection { }
function connect () { }
namespace AnotherProject ;
const CONNECT_OK = 1 ;
class Connection { }
function connect () { }
?>
不建议使用这种语法在单个文件中定义多个命名空间。建议使用下面的大括号形式的语法。
Example #2 定义多个命名空间,大括号语法
<?php
namespace MyProject {
const CONNECT_OK = 1 ;
class Connection { }
function connect () { }
}
namespace AnotherProject {
const CONNECT_OK = 1 ;
class Connection { }
function connect () { }
}
?>
在实际的编程实践中,非常不提倡在同一个文件中定义多个命名空间。这种方式的主要用于将多个 PHP 脚本合并在同一个文件中。
将全局的非命名空间中的代码与命名空间中的代码组合在一起,只能使用大括号形式的语法。全局代码必须用一个不带名称的 namespace 语句加上大括号括起来,例如:
Example #3 定义多个命名空间和不包含在命名空间中的代码
<?php
namespace MyProject {
const CONNECT_OK = 1 ;
class Connection { }
function connect () { }
}
namespace { // global code
session_start ();
$a = MyProject \ connect ();
echo MyProject \ Connection :: start ();
}
?>
除了开始的declare语句外,命名空间的括号外不得有任何PHP代码。
Example #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 ();
}
?>
[#1] Ishan Fernando [2015-06-25 07:15:11]
//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";
}
?>
[#2] jigar dot vy at gmail dot com [2015-06-24 12:52:36]
<?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";
}
[#3] Luis Pessoa [2015-04-28 17:30:09]
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
}
?>
[#4] Rahul Sonar [2015-02-21 09:43:14]
<?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();
}
[#5] 1932 at bk dot ru [2013-10-31 15:31:48]
last two examples give:
Fatal error: Call to undefined method MyProject\Connection::start() in Z:\home\test1.ru\www\link.php on line 12
[#6] leaksin [ at ] gmail [ dot ] com [2013-07-30 22:04:12]
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)
[#7] kothnok at gmail dot com [2011-11-03 10:59:58]
"use" statements are required to be placed after the "namespace my\space" but before the "{".
e.g.
<?php
namespace foo\bar;
use my\space\MyClass;
{
// place code here
} // end of namespace foo\bar
namespace another\bar;
use my\space\MyClass;
use my\space\AnotherClass;
{
// place code here
} // end of namespace another\bar
?>