您的位置:首页 > 编程语言 > PHP开发

php 5.3带来了什么(一)

2008-09-21 17:15 218 查看
之前陆续介绍了php
5.3的一些新特性,正好上周看到ZendCon关于5.3的ppt,介绍的更为详细,那么这里做个归总或者说翻译:)

Namespaces

php 5.3最大的改动,毫无疑问就是Namespaces(此前有一篇相关的PHP Namespaces
FAQ)。这给php开发人员带来的好处不少,广为人们所诟病的函数命名问题也得到了解决。

代码更清晰

5.3之前常见的代码,需要自定义前缀区分函数和类名

PLAIN
TEXT
CODE:

function MY_wrapper() {}

class MY_DB { }

define('MY_CONN_STR', '');

MY_wrapper();

new MY_DB();

MY_CONN_STR;

使用名称空间之后,代码看上去更加clean。

PLAIN
TEXT
CODE:

namespace MY;

function wrapper() {}

class DB { }

const CONN_STR = '';

use MY AS MY;

wrapper();

new DB();

CONN_STR;

一个文件中定义了多个namespace

如果一个文件中定义了多个namespace,应该怎样处理?

PLAIN
TEXT
CODE:

namespace LIB;

class MySQL {}

class SQLite {}

$b = new SQLite();

namespace LIB_EXTRA;

class MScrypt {}

$a = new MScrypt();

var_dump(

get_class($a),

get_class($b)

);

以上代码输出为:

PLAIN
TEXT
CODE:

string(18) "LIB_EXTRA::MScrypt"

string(11) "LIB::SQLite"

php是解释执行的语言,以上结果合情合理。

namespace的优先级

namespace中定义的函数,类和常量优先,其次才是全局的。

PLAIN
TEXT
CODE:

namespace foo;

function strlen($foo) { return htmlentities($foo); }

echo strlen("test"); // test

echo ::strlen("test"); // 4

echo namespace::strlen("test"); // test

namespace和autoload的友情

autoload会根据namespace名称以及class名称来解析类文件位置

仅当namespace和全局范围都没找到class定义的情况下,autoload才会被触发

在namespace中定义的__autoload不会被自动调用

PLAIN
TEXT
CODE:

function __autoload($var) { var_dump($var); } // LIB::foo

require "./ns.php"; /*

<?php

namespace LIB;

new foo();

*/

namespace一些辅料

PLAIN
TEXT
CODE:

namespace really::long::pointlessly::verbose::ns;

__NAMESPACE__; // 新增的魔法常量,表示当前namespace名称

class a{}

get_class(new a()); // really::long::pointlessly::verbose::ns::a

use really::long::pointlessly::verbose::ns::a AS b;
// 从名称空间中引用一个类

注:这里的内容节选自pdf Introduction
to PHP 5.3 Slides,后文不再复述。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: