之前陆续介绍了php 5.3的一些新特性,正好上周看到ZendCon关于5.3的ppt,介绍的更为详细,那么这里做个归总或者说翻译:)
Namespaces
php 5.3最大的改动,毫无疑问就是Namespaces(此前有一篇相关的PHP Namespaces FAQ)。这给php开发人员带来的好处不少,广为人们所诟病的函数命名问题也得到了解决。
代码更清晰
5.3之前常见的代码,需要自定义前缀区分函数和类名
CODE:
-
function MY_wrapper ( ) { }
-
class MY_DB { }
-
define ( 'MY_CONN_STR', '' );
-
MY_wrapper ( );
-
new MY_DB ( );
-
MY_CONN_STR;
使用名称空间之后,代码看上去更加clean。
CODE:
-
namespace MY;
-
function wrapper ( ) { }
-
class DB { }
-
const CONN_STR = '';
-
use MY AS MY;
-
wrapper ( );
-
new DB ( );
-
CONN_STR;
一个文件中定义了多个namespace
如果一个文件中定义了多个namespace,应该怎样处理?
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 )
-
);
以上代码输出为:
CODE:
-
string ( 18 ) "LIB_EXTRA::MScrypt"
-
string ( 11 ) "LIB::SQLite"
php是解释执行的语言,以上结果合情合理。
namespace的优先级
namespace中定义的函数,类和常量优先,其次才是全局的。
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不会被自动调用
CODE:
-
function __autoload ($var ) { var_dump ($var ); } // LIB::foo
-
require "./ns.php"; /*
-
<?php
-
namespace LIB;
-
new foo();
-
*/
namespace一些辅料
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,后文不再复述。