欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

定义命名空间 ¶

(PHP 5 >= 5.3.0, PHP 7)

虽然任意合法的PHP代码都可以包含在命名空间中,但只有以下类型的代码受命名空间的影响,它们是:类(包括抽象类和traits)、接口、函数和常量。

命名空间通过关键字namespace 来声明。如果一个文件中包含命名空间,它必须在其它所有代码之前声明命名空间,除了一个以外:declare关键字。

Example #1 声明单个命名空间

<?php
namespace MyProject;

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

?>
在声明命名空间之前唯一合法的代码是用于定义源文件编码方式的 declare 语句。另外,所有非 PHP 代码包括空白符都不能出现在命名空间的声明之前:

Example #2 声明单个命名空间

<html>
<?php
namespace MyProject// 致命错误 - 命名空间必须是程序脚本的第一条语句
?>

另外,与PHP其它的语言特征不同,同一个命名空间可以定义在多个文件中,即允许将同一个命名空间的内容分割存放在不同的文件中。

add a note add a note

User Contributed Notes 9 notes

kuzawinski dot marcin at NOSPAM dot gmail dot com ¶
2 years ago
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.
danbettles at yahoo dot co dot uk ¶
7 years ago
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!');
?>
FatBat ¶
3 years ago
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 \NS\foo  // 111.
    
echo NS\foo  // fatal error. assumes \NS\NS\foo.
?>
huskyr at gmail dot com ¶
7 years ago
"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 

?>
jeremeamia at gmail dot com ¶
7 years ago
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 
?>
Baptiste ¶
8 years ago
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.
Anonymous ¶
8 years ago
@ 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.
Roadowl ¶
3 years ago
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.
David Drakard ¶
8 years ago
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.

add a note add a note


来自 http://php.net/manual/zh/language.namespaces.definition.php
普通分类: