您的位置:首页 >> Web开发 >> PHP技术 >> PHP文摘 >> 正文
PHP文摘 RSS
 

全面迎接 php 5.2 的时代到来!

http://www.rdxx.com 07年08月26日 00:00 我要投稿

关键词: PHP
 

1、继PHP 5.0增加了一个 E_STRICT的错误报告级别(常量值为 2048)之后,PHP 5.2 也新增了一个错误报告级别:E_RECOVERABLE_ERROR ,其常量值为 4096 。
这个级别的错误主要是从E_ERROR中但可以被用户自定义的错误处理程序(一般通过set_error_handler() 函数指定)所捕捉的情况转化而来。如果一个E_RECOVERABLE_ERROR 未被捕捉并处理,那么它的表现就和所有 PHP 版本中的E_ERROR一样会导致程序中止。在错误日志中,该类型的错误将被记录成“可捕捉的致命错误(Catchable fatal error)”。 

导致 PHP 抛出 E_RECOVERABLE_ERROR 的情况通常是指那些很危险,但还不足以让 Zend Engine 崩溃的情况。比方说,有下面一段代码:
  class foo {
 function bar(foo $a) { }
  }
 

  $a = new foo ;
  $a->bar(new stdClass) ;
很明显,类 foo 的bar 函数要求一个 foo 类型的参数,但实际代码中却给了一个 stdClass 类型的参数。在PHP 5.2 以前,这会导致一个 E_ERROR(Fatal error: Argument 1 passed to foo::bar() must be an instance of foo……)。但在 PHP 5.2(包括以后的 PHP6)则会导致一个E_RECOVERABLE_ERROR(Catchable fatal error: Argument 1 passed to foo::bar() must be an instance of foo……)。这种错误是可以被捕捉的,如果你通过set_error_handler() 指定了一个错误处理函数(即使是你在这个函数中没有处理E_RECOVERABLE_ERROR),那么程序就会继续运行。但如果你没有指定一个错误处理函数,那么这个 E_RECOVERABLE_ERROR 错误就会和 E_ERROR 一样,会立即导致程序中止。 

2、相应的,错误报告级别 E_ALL 也将会包含上述E_RECOVERABLE_ERROR。
这也就意味着常量 E_ALL 的值将会从原来的2047 变为 6143。注意,在 PHP 5.0和 PHP 5.1中虽然增加了E_STRICT,但在这两个版本中 E_ALL 并不包含E_STRICT。而在以后的版本(如 PHP5.2、PHP6等)中E_ALL 则包含了包括E_STRICT和E_RECOVERABLE_ERROR在内的所有错误级别。 在PHP 5.0/5.1 中我们想设置error_reporting为E_ALL就不得不采用error_reporting(E_ALL | E_STRICT) 的写法,感觉极为别扭,也很容易造成一些疏忽和误导。在 PHP5.2当中我们就没有这个苦恼了。另外如果你在 Apache 的配置文件(如 httpd.conf)或 .htaccess 文件中用error_reporting 设置了错误报告级别(比如:php_value error_reporting 4095),由于 Apache 不支持 PHP 常量 ,那你还得手工去适当调整这些错误报告级别的数值。
3、添加了allow_url_include 这个 ini 指令来辅助 allow_url_fopen 操作;这个是 PHP 5.2 在安全方面的重大更新之一。使用这个指令可以让我们区分开对远程文件的标准文件操作和包含操作。我们通常需要进行前面的标准操作,而后面的包含操作则通常是危险的发源地。从 PHP 5.2 开始,你的本地脚本可以在禁止远程包含操作的同时进行标准远程文件操作。事实上,这个就是默认配置。 PHP 5.2 把原来的allow_url_fopen 指令分成了allow_url_fopen 和allow_url_include 两个指令。如果allow_url_fopen 操作是禁止的,那么allow_url_include 也将被禁止。默认情况下将会允许进行 allow_url_fopen 操作,但是禁止allow_url_include 。这样就能非常有效的避免远程代码注入(remote code injection)。这个本来也是打算在 PHP6中添加的,现在我们提前用到了。:D
4、PHP 5.2 增加了对接口中构造函数类型(签名) 强制性检查的支持。
从 PHP 5.2 开始,如果你在一个接口中声明了一个构造函数,那么在所有实现该接口的类都必须包含一个构造函数,并且这个构造函数要与该接口的构造函数的签名完全一致。这里术语“签名”的意思是函数的参数和返回值的类型(包括其语言类型以及是引用传递还是值传递),这个概念有点类似于C 语言中 “原型”。
看以下代码:
interface constr {
  function __construct() ;
}
 

共4页  第1页 第2页 第3页 第4页


 
 
标签: PHP 打印本文
 
 
  热点搜索
 
 
 



Valid XHTML 1.0 Transitional
Copyright ©2005 - 2008 Rdxx.Com,All Rights Reserved
收藏本页
收藏本站