php 5.3带来了什么(一)

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

Namespaces

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

代码更清晰

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

CODE:
  1. function MY_wrapper() {}
  2. class MY_DB { }
  3. define('MY_CONN_STR''');
  4. MY_wrapper();
  5. new MY_DB();
  6. MY_CONN_STR;

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

CODE:
  1. namespace MY;
  2. function wrapper() {}
  3. class DB { }
  4. const CONN_STR = '';
  5. use MY AS MY;
  6. wrapper();
  7. new DB();
  8. CONN_STR;

一个文件中定义了多个namespace

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

CODE:
  1. namespace LIB;
  2. class MySQL {}
  3. class SQLite {}
  4. $b = new SQLite();
  5. namespace LIB_EXTRA;
  6. class MScrypt {}
  7. $a = new MScrypt();
  8. var_dump(
  9.         get_class($a),
  10.         get_class($b)
  11. );

以上代码输出为:

CODE:
  1. string(18) "LIB_EXTRA::MScrypt"
  2. string(11) "LIB::SQLite"

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

namespace的优先级

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

CODE:
  1. namespace foo;
  2. function strlen($foo) { return htmlentities($foo)}
  3. echo strlen("test")// test 
  4. echo ::strlen("test")// 4
  5. echo namespace::strlen("test")// test

namespace和autoload的友情

  • autoload会根据namespace名称以及class名称来解析类文件位置
  • 仅当namespace和全局范围都没找到class定义的情况下,autoload才会被触发
  • 在namespace中定义的__autoload不会被自动调用
CODE:
  1. function __autoload($var) { var_dump($var)} // LIB::foo
  2. require "./ns.php"/*
  3.         <?php
  4.                 namespace LIB;
  5.                 new foo();
  6. */

namespace一些辅料

CODE:
  1. namespace really::long::pointlessly::verbose::ns;  
  2. __NAMESPACE__; // 新增的魔法常量,表示当前namespace名称
  3. class a{}   
  4. get_class(new a())// really::long::pointlessly::verbose::ns::a
  5. use really::long::pointlessly::verbose::ns::a AS b; // 从名称空间中引用一个类

注:这里的内容节选自pdf Introduction to PHP 5.3 Slides,后文不再复述。

作者: Volcano 发表于September 21, 2008 at 8:49 am

版权信息: 可以任意转载, 转载时请务必以超链接形式标明文章原始出处作者信息及此声明

Tags:

9 条评论 »

  1. gowers 于 2008-09-21 @ 11:11:16 留言

    不错不错,有时间研究下

  2. Arno 于 2008-09-22 @ 09:07:07 留言

    如果仅为你上面介绍的那样,那namespace好像没多大用处,因为使用的namespace更容易使代码混淆。

    之前我看过有人对namespace的说法,好像是可以像JS那样定义类的方法和属性的。不知道有没有实现了。

  3. Volcano 于 2008-09-22 @ 09:40:47 留言

    @ arno: 你说的应该是闭包,这个是有的,见php 5.3将提供改进的Lambda函数

    至于namespace的用途,其它语言的程序员更有发言权。

  4. 快递网点 于 2008-09-22 @ 09:50:29 留言

    namespace我用C#的时候。就是方便了代码的拷贝而已

  5. xLight 于 2008-09-24 @ 10:55:14 留言

    我觉得最期待的改变是mysqlnd

  6. skyname 于 2008-10-24 @ 23:57:34 留言

    namespace好像是多余的.

  7. Volcano 于 2008-10-27 @ 20:22:13 留言

    仁者见仁,智者见智

  8. andot 于 2008-11-09 @ 09:13:06 留言

    帶namespace的類的對象序列化結果是什麼樣子的呢?

  9. auex 于 2009-01-28 @ 20:44:24 留言

    php早该有完整的namespace支持,当我们习惯了C#的快速开发后,开始时真的很不习惯PHP

RSS 为此帖反馈评论

留条评论