PHP5.3新特性介绍

 

Namespaces

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

代码更清晰

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

PLAIN TEXT

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。

PLAIN TEXT

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,应该怎样处理?

PLAIN TEXT

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. );

以上代码输出为:

PLAIN TEXT

CODE:

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

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

namespace的优先级

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

PLAIN TEXT

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不会被自动调用
PLAIN TEXT
 
CODE:
  1. function __autoload ($var )  { var_dump ($var )}  // LIB::foo
  2. require  "./ns.php"/*
  3.         <?php
  4.                 namespace LIB;
  5.                 new foo();
  6. */

namespace一些辅料

PLAIN TEXT

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; // 从名称空间中引用一个类

注:这里的内容节选自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:

  1. echo dirname (__FILE__ )// < PHP 5.3

 

在5.3,只需要一个魔术常量__DIR__就解决了。

PLAIN TEXT

CODE:

  1. echo __DIR__;  // >= PHP 5.3

?:操作符

便捷的?:操作符,可以从两个值/表达式中快速取得非空值。

PLAIN TEXT

CODE:

  1. $a = true ?: false;  // true
  2. $a = false ?: true;  // true
  3. $a =  "" ?:  1// 1
  4. $a =  0 ?:  2// 2
  5. $a = array ( ) ?: array ( 1 )// array(1);
  6. $a = strlen ( "" ) ?: strlen ( "a" )// 1

__callStatic()

新增了魔术方法__callStatic,功能和__call类似,但是仅对static方法有效。

PLAIN TEXT

CODE:

  1. class helper  {
  2.         static function __callStatic ($name, $args )  {
  3.                 echo $name. '('. implode ( ',', $args ). ')';
  4.          }
  5. }
  6. helper:: test ( "foo", "bar" )// test(foo,bar)

动态调用static方法

动态的调用静态方法?动静结合。

PLAIN TEXT

CODE:

  1. class helper  {
  2.         static function foo ( )  { echo __METHOD__;  }
  3. }
  4. $a =  "helper";
  5. $b =  "foo";
  6. $a::$b ( )// helper::foo

Late Static Binding

不知道怎么译,可能留个原文更容易理解。静态方法的事件处理时机有变化,以前是在编译期处理,现在是执行期间处理。

在php 5.3之前,下面的代码会输出一个A,但是这不是咱们要的,whoami方法已经在class B中重新定义,它本该输出B才符合咱们想当然的思维。

PLAIN TEXT

CODE:

  1. class A  {
  2.    public static function whoami ( )  {
  3.       echo __CLASS__;
  4.     }
  5.    public static function identity ( )  {
  6.      self:: whoami ( );
  7.    }
  8. }
  9. class B extends A  {
  10.    public static function whoami ( )  {
  11.       echo __CLASS__;
  12.     }
  13. }
  14. B:: identity ( )// A <-- PHP <5.3

下面代码中使用了static::whoami()来调用静态方法。php 5.3之后,由于__CLASS__是在执行期被处理,那么这个例子中能顺利抓到class B。

PLAIN TEXT

CODE:

  1. class A  {
  2.    public static function whoami ( )  {
  3.       echo __CLASS__;
  4.     }
  5.    public static function identity ( )  {
  6.       static:: whoami ( );
  7.     }
  8. }
  9. class B extends A  {
  10.    public static function whoami ( )  {
  11.       echo __CLASS__;
  12.     }
  13. }
  14. B:: identity ( )// B <-->= PHP 5.3

mysqlnd

mysqlnd成为php 5.3中的默认mysql驱动

但是PDO_MySQL暂时还不支持mysqlnd,目前只有mysql(i)扩展可以用到

之前介绍的php 5.3的新特性,都是方便开发人员的东东。下面介绍个很讨虚拟主机提供商喜欢的特性。

增强的ini文件支持

  • CGI/ FastCGI支持类似.htaccess的INI配置
  • 每个目录下都可以有INI设置,ini的文件名取决于php.ini的配置,但是[PATH=/var/www/domain.com], [HOST=www.domain.com]段落的设置用户不能修改。
  • 增强的error handling
  • 允许在ini文件中定义变量和常量,可以在程序中直接调用。

附上一段ini文件的例子

PLAIN TEXT

CODE:

  1. #用户自定义的php. ini文件名 (. htaccess ). 默认是 ".user.ini"
  2. user_ini. filename= ".user.ini"
  3.  
  4. #如果要禁用这个特性,设置为空值即可
  5. user_ini. filename=
  6.  
  7. #用户自定义的php. ini文件TTL时长 (time-to-live ),单位为秒,我理解为缓存过期时间。默认为 300
  8. user_ini. cache_ttl= 300
  9.  
  10. [PATH=/var/www/domain. com ]
  11. variables_order = GPC
  12. safe_mode = 1
  13.  
  14. [my variables ]
  15. somevar = “ 1234
  16. anothervar = $ {somevar }; anothervar == somevar
  17.  
  18. [ini arrays ]
  19. foo [bar ]= 1
  20. foo [ 123 ]= 2
  21. foo [ ]= 3
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值