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;// 从名称空间中引用一个类 注:这里的内容节选自pdfIntroduction to PHP 5.3 Slides,后文不再复述。
性能提升 php 5.3的总体性能提升了5 - 15%
md5()快了10-15% Better stack implementation in the engine Constants移到read-only内存里 exception处理过程改进(简化,opcodes更少) (require/include)_once改进,去掉重复open Smaller binary size & startup size with gcc4 新语言特性__DIR__ 在5.3以前,为了获得当前脚本的目录,需要一次函数调用
PLAIN TEXT
CODE:
echo dirname(__FILE__); // < PHP 5.3
在5.3,只需要一个魔术常量__DIR__就解决了。
PLAIN TEXT
CODE:
echo __DIR__; // >= PHP 5.3 ?:操作符 便捷的?:操作符,可以从两个值/表达式中快速取得非空值。
PLAIN TEXT
CODE:
$a = true ?: false; // true $a = false ?: true; // true $a = "" ?: 1; // 1 $a = 0 ?: 2; // 2 $a = array() ?: array(1); // array(1); $a = strlen("") ?: strlen("a"); // 1 __callStatic() 新增了魔术方法__callStatic,功能和__call类似,但是仅对static方法有效。
PLAIN TEXT
CODE:
class helper { |