当前位置: 首页 > 图文教程 > 网络编程 > PHP > php 5.3新特性介绍

PHP
php 多线程上下文中安全写文件实现代码
PHP类的使用 实例代码讲解
用php实现让页面只能被百度gogole蜘蛛访问的方法
php 学习笔记
PHP编程过程中需要了解的this,self,parent的区别
php 操作excel文件的方法小结
使用PHP获取网络文件的实现代码
PHP 巧用数组降低程序的时间复杂度
php下将XML转换为数组
php 文件上传代码(限制jpg文件)
php 无极分类(递归)实现代码
PHP 采集获取指定网址的内容
PHP 将图片按创建时间进行分类存储的实现代码
PHP 存储文本换行实现方法
PHP 批量更新网页内容实现代码
用PHP查询搜索引擎排名位置的代码
用php实现的获取网页中的图片并保存到本地的代码
php实现首页链接查询 友情链接检查的代码
处理php自动反斜杠的函数代码
php实现的遍历文件夹下所有文件,编辑删除

PHP 中的 php 5.3新特性介绍


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-28   浏览: 32 ::
收藏到网摘: n/a

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

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

 

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