《Programming PHP》第二版上市
2007-7-23 11:42 Verdana
php6 namespace

PHP6 的 namespace :)

PHP6 的 snapshot 版本中,namespace 功能已经实现了

[b]一、如何定义 namespace?[/b]
[font=Courier New]
[php]
// net/phpvim/code/Shape.php
namespace net::phpvim::code;

class Shape{
}

function draw() {
    return "draw() in Shape.php\n";
}

function getCurrentNS() {
    return __NAMESPACE__;
}

/* vim: set expandtab tabstop=4 shiftwidth=4: */
[/php]
[/font]

所有的类和函数名称会自动加上 namespace 名称作为前缀,相同的 namespace 也可以在多个 PHP 文件中被定义。

比如上面的代码中,完整的类名和函数名是:

net::phpvim::code::Shape
net::phpvim::code::draw()


[b]二、如何使用呢?[/b]
[font=Courier New]
[php]
// net/phpvim.net/code/Painter.php
require_once 'net/phpvim/code/Shape.php';

import net::phpvim::code;
import net::phpvim::code::Shape;
import net::phpvim::code::Shape as CPC_Shape;

// Create an instance object for Shape class
$shape0 = new net::phpvim::code::Shape();
$shape1 = new code::Shape();
$shape2 = new Shape();
$shape3 = new CPC_Shape();

// output: draw() in Shape.php
print net::phpvim::code::draw();
print code::draw();

// output: net::phpvim::code
print code::getCurrentNS();

/* vim: set expandtab tabstop=4 shiftwidth=4: */
[/php]
[/font]

import 指令

import 可以将任意的 package(这里借用一下 Java 的概念)导入到当前 scope 中来。
import 不可以使用在函数或者类中。
import 生效范围为当前定义位置到所在文件的结尾。
import 可以通过 AS 关键字定义别名。
import A::B; 等同于 import A::B as B。


[b]三、其它[/b]
特殊的 empty namespace ::
[font=Courier New]
[php]
import net::phpvim::code;
// 调用会失败,因为 draw()  是定义在net::phpvim::code 的 namespace 下面
// 而不是在全局范围内
echo ::draw();
/* vim: set expandtab tabstop=4 shiftwidth=4: */
[/php]
[/font]

:: 是一个特殊的 namespace,以 :: 开头的调用,将会在 global 范围查找并绑定相应的 Class 或者 Function。换句话说,定义在任意 namespace 中的 draw() 函数都不会被调用,而是调用 global 范围内的 draw() 函数。

constant __NAMESPACE__

__NAMESPACE__ 表示当前的 namespace 的名称。

2007-7-23 14:03 Haohappy
呵呵,不错。 这样应该更方便对项目进行打包,要是也能像Java那样生成一个jar包/phar包,就更完美了。

2007-7-23 15:27 wps2000
还是加上来了?

2007-7-24 17:54 diogin
呵呵,我先观望阵子再说。

2007-8-27 00:53 Yimin
完美..

2007-8-28 17:11 mayongzhan
想想php还缺什么.都加上...

2007-8-30 17:12 PHPjiang
:lol :lol :lol

2007-9-11 11:49 lightsaber
以前写的导入包的代码又废掉了:Q
不过滥用导入一个包的类,对性能有影响。

[[i] 本帖最后由 lightsaber 于 2007-9-11 11:53 编辑 [/i]]

2007-11-23 22:18 hongfu
还不如import com.insenz.com这样得了,PHP要整成啥样:L

2007-12-22 09:02 21gsoul
php namespace 不用等到 php 6,php 5.3 就已经实现。

关于php 5.3 的新特性建议读一下 Gergely Hodicska 的几篇 blog 文章:

[url=http://blog.felho.hu/stone/php-53]http://blog.felho.hu/stone/php-53[/url]

其中一篇非常详细地描述了php namespace:

[url=http://blog.felho.hu/whats-new-in-php-53-part-1-namespaces.html]http://blog.felho.hu/whats-new-in-php-53-part-1-namespaces.html[/url]

2007-12-24 10:19 ZiNYon!
怎么感觉 php变成java了?

2007-12-24 16:18 kekey
:lol 还没用到过这种技术,努力学习。

2008-1-7 23:23 fidy
[quote]原帖由 [i]21gsoul[/i] 于 2007-12-22 09:02 发表 其中一篇非常详细地描述了php namespace:

[url=http://blog.felho.hu/whats-new-in-php-53-part-1-namespaces.html]http://blog.felho.hu/whats-new-in-php-53-part-1-namespaces.html[/url]
[/quote]
这篇我简单翻译了一下,英文不太好的兄弟可以凑合看看...
[url]http://fidy.phpbomb.com/?p=12[/url]

页: [1]
查看完整版本: php6 namespace


Powered by Discuz! Archiver 5.5.0  © 2001-2006 Comsenz Inc.