PHP5.3比以前的所有版本,最大的改进应该就算是Namespaces了.与asp.net中的Namespaces相似.这给以往没有Namespaces的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 {

  static function __callStatic($name, $args) {

  echo $name.'('.implode(',', $args).')';

  }

  }

  helper::test("foo","bar"); // test(foo,bar)

  动态调用static方法

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

  PLAIN TEXT

  CODE:

  class helper {

  static function foo() { echo __METHOD__; }

  }

  $a = "helper";

  $b = "foo";

  $a::$b(); // helper::foo

  Late Static Binding

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

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

  PLAIN TEXT

  CODE:

  class A {

  public static function whoami() {

  echo __CLASS__;

  }

  public static function identity() {

  self::whoami();

  }

  }

  class B extends A {

  public static function whoami() {

  echo __CLASS__;

  }

  }

  B::identity(); // A <-- PHP <5.3

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

  PLAIN TEXT

  CODE:

  class A {

  public static function whoami() {

  echo __CLASS__;

  }

  public static function identity() {

  static::whoami();

  }

  }

  class B extends A {

  public static function whoami() {

  echo __CLASS__;

  }

  }

  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:

  #用户自定义的php.ini文件名(.htaccess). 默认是".user.ini"

  user_ini.filename=".user.ini"

  #如果要禁用这个特性,设置为空值即可

  user_ini.filename=

  #用户自定义的php.ini文件TTL时长(time-to-live),单位为秒,我理解为缓存过期时间。默认为300秒

  user_ini.cache_ttl=300

  [PATH=/var/www/domain.com]

  variables_order = GPC

  safe_mode =1

  [my variables]

  somevar = “1234”

  anothervar = ${somevar}; anothervar == somevar

  [ini arrays]

  foo[bar]=1

  foo[123]=2

  foo[]=3

       PHP5.3的新特性就介绍到这里.还需求大家自己多多实践才会更好的理解.