一、PHP5.3.x不向下兼容的变化

尽管大多数现有的 PHP 5 代码无需改变就可以工作,但是请注意一些不向下兼容的变化:

在 PHP 5.3.x 的所有绑定扩展中应用了新的内部参数解析API, 当给函数传递了不兼容的参数时将返回 NULL. 但有一些例外,比如函数 get_class() 在出现错误时将会返回 FALSE.
clearstatcache() 默认不再清除缓存的 realpath.
realpath() 现在是完全与平台无关的. 结果是非法的相对路径比如 __FILE__ . “/../x” 将不会工作.
call_user_func() 系列函数即使被调用者是一个父类也使用 $this.
数组函数 natsort(), natcasesort(), usort(), uasort(), uksort(), array_flip(), 和 array_unique() 将不再接受对象作为参数. 在将这些函数应用于对象时, 请首先将对象转换为数组.
按引用传递参数的函数在被按值传递调用时行为发生改变. 此前函数将接受按值传递的参数, 现在将抛出致命错误. 之前任何期待传递引用但是在调用时传递了常量或者字面值 的函数, 需要在调用前改为将该值赋给一个变量。
新的 mysqlnd 库需要使用 MySQL 4.1 新的 41 字节密码格式。继续使用旧的 16 字节密码将导致 mysql_connect() 和其它类似函数 抛出 “mysqlnd cannot connect to MySQL 4.1+ using old authentication.” 错误.
新的 mysqlnd 库将不再读取 MySQL 配置文件(my.cnf/my.ini), 这与旧版本的 libmysql 库不同. 如果你的代码依赖于这些配置 文件, 你可以使用 mysqli_options() 显式地加载它. 注意, 这意味着如果 PDO 中的 MySQL 支持使用了 mysqlnd 进行编译,PDO 特有常量 PDO::MYSQL_ATTR_READ_DEFAULT_FILE 和 PDO::MYSQL_ATTR_READ_DEFAULT_GROUP 将是未定义的.
SplFileInfo 及其相关目录类会移除末尾的 /.
__toString 魔术方法不再接受参数.
魔术方法 __get, __set, __isset, __unset, and __call 应该总是公共的(public)且不能是静态的(static). 方法签名是必须的.
现在 __call 魔术方法在访问私有的(private)和被保护的(protected)方法时被调用.
函数内 include 或者 require 一个文件时,文件内 将不能使用 func_get_arg(), func_get_args() 和 func_num_args() 函数。
新增了一个包裹在 MHASH 扩展外面的仿真层。但是并非所有的算法都涉及到了,值得注意的是 s2k 哈希算法。这意味着 s2k 哈希算法在 PHP 5.3.0 中不再可用。

以下关键词被保留,将不能被用作函数名, 类名等。
goto
namespace

二、PHP5.3.x相较于PHP5.2.x弃用的功能函数:

PHP 5.3.0 新增了两个错误等级: E_DEPRECATED 和 E_USER_DEPRECATED. 错误等级 E_DEPRECATED 被用来说明一个函数或者功能已经被弃用. E_USER_DEPRECATED 等级目的在于表明用户代码中的弃用功能, 类似于 E_USER_ERROR 和 E_USER_WARNING 等级.

下面是被弃用的 INI 指令列表. 使用下面任何指令都将导致 E_DEPRECATED 错误.
define_syslog_variables
register_globals
register_long_arrays
safe_mode
magic_quotes_gpc
magic_quotes_runtime
magic_quotes_sybase
弃用 INI 文件中以 ‘#’ 开头的注释.

PHP5.3.x弃用函数:
call_user_method() (使用 call_user_func() 替代)
call_user_method_array() (使用 call_user_func_array() 替代)
define_syslog_variables()
dl()函数默认被关闭, 并且现在只在CLI, CGI, 和内嵌的SAPI环境下可用.
ereg() (使用 preg_match() 替代)
ereg_replace() (使用 preg_replace() 替代)
eregi() (使用 preg_match() 配合 ‘i’ 修正符替代)
eregi_replace() (使用 preg_replace() 配合 ‘i’ 修正符替代)
set_magic_quotes_runtime() 以及它的别名函数 magic_quotes_runtime()
session_register() (使用 $_SESSION 超全部变量替代)
session_unregister() (使用 $_SESSION 超全部变量替代)
session_is_registered() (使用 $_SESSION 超全部变量替代)
set_socket_blocking() (使用 stream_set_blocking() 替代)
split() (使用 preg_split() 替代)
spliti() (使用 preg_split() 配合 ‘i’ 修正符替代)
sql_regcase()
mysql_db_query() (使用 mysql_select_db() 和 mysql_query() 替代)
mysql_escape_string() (使用 mysql_real_escape_string() 替代)
废弃以字符串传递区域设置名称. 使用 LC_* 系列常量替代.
mktime() 的 is_dst 参数. 使用新的时区处理函数替代.

PHP5.3.x弃用的功能:

弃用通过引用分配 new 的返回值.
调用时传递引用被弃用.
三、PHP5.3引入的一些新函数:

PHP核心函数:
array_replace() – 将一个数组的元素用另外一个数组的元素进行替换.
array_replace_recursive() – 将一个数组的元素用一组传递进来的数组进行递归替换.
class_alias() – 为用户定义的类创建一个别名.
forward_static_call() – 从一个方法环境调用一个用户函数.
forward_static_call_array() – 从一个方法环境调用一个用户函数, 使用数组中的元素作为参数.
gc_collect_cycles() – 强制收集任何存在的废物循环.
gc_disable() – 撤销循环引用收集器.
gc_enable() – 激活循环引用收集器.
gc_enabled() – 返回循环引用收集器的状态.
get_called_class() – 返回调用的静态方法所在的类的名称.
gethostname() – 返回本地机器的当前主机名.
header_remove() – 在使用 header() 函数之前移除 HTTP Header.
lcfirst() – 蒋某一字符串第一个字符转化为小写.
parse_ini_string() – 解析配置字符串.
quoted_printable_encode() – 转换 8 位的字符串为引用的可打印字符串.
str_getcsv() – 将 CSV 字符串解析为数组.
stream_context_set_default() – 设置默认的流环境.
stream_supports_lock() – 如果流支持锁定则返回 TRUE.
stream_context_get_params() – 获取一个流环境的参数.
streamWrapper::stream_cast() – 获取底层的流资源.
streamWrapper::stream_set_option() – 更改流选项

Date/Time:
date_add() – 向 DateTime 对象增加一定数量的天, 月, 年, 小时, 分钟和秒数.
date_create_from_format() – 根据给定的格式, 返回一个 DateTime 对象.
date_diff() – 返回两个 DateTime 对象的不同之处.
date_get_last_errors() – 返回最后的日期/时间操作中产生的警告和错误.
date_parse_from_format() – 获取一个日期的信息.
date_sub() – 从 DateTime 对象减去一定数量的天, 月, 年, 时和秒数.
timezone_version_get() – 返回时区数据库的版本.

GMP:
gmp_testbit() – 测试一个比特是否被设置.

Hash:
hash_copy() – 复制哈希环境.

IMAP:
imap_gc() – 清除 IMAP 缓存.
imap_utf8_to_mutf7() – 编码 UTF-8 字符串为改进的 UTF-7 编码.
imap_mutf7_to_utf8() – 解码改进的 UTF-7 字符串为 UTF-8 编码.

JSON:
json_last_error() – 返回最后发生的 JSON 错误.

MySQL 改进:
mysqli_fetch_all() – 以关联数组、索引数组或者二者都有获取全部结果行.
mysqli_get_connection_stats() – 返回客户端连接的统计资料.
mysqli_poll() – 轮询连接.
mysqli_reap_async_query() – 从异步查询中获取结果.

OpenSSL:
openssl_random_pseudo_bytes() – 返回一个以伪随机字节填充的指定长度的字符串.

PCNTL:
pcntl_signal_dispatch() – 为挂起信号调用信号处理器.
pcntl_sigprocmask() – 设置和获取阻塞信号.
pcntl_sigtimedwait() – 等待信号, 但是有超时时间.
pcntl_sigwaitinfo() – 等待信号.

PCRE:
preg_filter() – 执行正则查找和替换, 仅仅返回匹配正则的结果.

信号:
msg_queue_exists() – 检查消息队列是否存在.
shm_has_var() – 检查在一个共享内存段中, 是否存在指定的键(key).

以下函数被原生支持, 因此它们在所有运行 PHP 的操作系统上均可用.
acosh()
asinh()
atanh()
expm1()
log1p()
四、新参数
在 PHP 5.3 中一些函数新增了参数和选项:

PHP 核心:
clearstatcache() – 新增 clear_realpath_cache 和 filename 参数.
copy() – 新增流环境参数 context.
fgetcsv() – 新增 escape 参数.
ini_get_all() – 新增 details 参数.
nl2br() – 新增 is_xhtml 参数.
parse_ini_file() – 新增 scanner_mode 参数.
round() – 新增 mode 参数.
stream_context_create() – 新增 params 参数.
strstr() 和 stristr() – 新增 before_needle 参数.

json:
json_encode() – 新增 options 参数.
json_decode() – 新增 depth 参数.

流(Streams):
stream_select(), stream_set_blocking(), stream_set_timeout(), 和 stream_set_write_buffer() 使用用户空间流包裹器.
sybase_ct:

sybase_connect() – 新增 new 参数.

PHP 5.3.0 中的新方法参数:

PHP 核心:
Exception::__construct() – 新增 previous 参数

 
五、新的全局常量

PHP 核心:
__DIR__
__NAMESPACE__
E_DEPRECATED
E_USER_DEPRECATED
INI_SCANNER_NORMAL
INI_SCANNER_RAW
PHP_MAXPATHLEN
PHP_WINDOWS_NT_DOMAIN_CONTROLLER
PHP_WINDOWS_NT_SERVER
PHP_WINDOWS_NT_WORKSTATION
PHP_WINDOWS_VERSION_BUILD
PHP_WINDOWS_VERSION_MAJOR
PHP_WINDOWS_VERSION_MINOR
PHP_WINDOWS_VERSION_PLATFORM
PHP_WINDOWS_VERSION_PRODUCTTYPE
PHP_WINDOWS_VERSION_SP_MAJOR
PHP_WINDOWS_VERSION_SP_MINOR
PHP_WINDOWS_VERSION_SUITEMASK

cURL:
CURLOPT_PROGRESSFUNCTION

GD:
IMG_FILTER_PIXELATE

JSON:
JSON_ERROR_CTRL_CHAR
JSON_ERROR_DEPTH
JSON_ERROR_NONE
JSON_ERROR_STATE_MISMATCH
JSON_ERROR_SYNTAX
JSON_FORCE_OBJECT
JSON_HEX_TAG
JSON_HEX_AMP
JSON_HEX_APOS
JSON_HEX_QUOT

LDAP:
LDAP_OPT_NETWORK_TIMEOUT

libxml:
LIBXML_LOADED_VERSION

PCRE:
PREG_BAD_UTF8_OFFSET_ERROR

PCNTL:
BUS_ADRALN
BUS_ADRERR
BUS_OBJERR
CLD_CONTIUNED
CLD_DUMPED
CLD_EXITED
CLD_KILLED
CLD_STOPPED
CLD_TRAPPED
FPE_FLTDIV
FPE_FLTINV
FPE_FLTOVF
FPE_FLTRES
FPE_FLTSUB
FPE_FLTUND
FPE_INTDIV
FPE_INTOVF
ILL_BADSTK
ILL_COPROC
ILL_ILLADR
ILL_ILLOPC
ILL_ILLOPN
ILL_ILLTRP
ILL_PRVOPC
ILL_PRVREG
POLL_ERR
POLL_HUP
POLL_IN
POLL_MSG
POLL_OUT
POLL_PRI
SEGV_ACCERR
SEGV_MAPERR
SI_ASYNCIO
SI_KERNEL
SI_MESGQ
SI_NOINFO
SI_QUEUE
SI_SIGIO
SI_TIMER
SI_TKILL
SI_USER
SIG_BLOCK
SIG_SETMASK
SIG_UNBLOCK
TRAP_BRKPT
TRAP_TRACE
六、新增、移除的扩展

PHP 5.3.0 新增以下扩展(默认):
Enchant – 各种拼写库的抽象层
文件信息 – 已经被移除的 Mimetype 扩展的一个改进的、更加可靠的替代, 以 BC 为特色.
INTL – 国际化扩展. INTL 是 » ICU 库的一个包装器.
Phar – PHP 档案文件的实现.
SQLite3 – 支持 SQLite version 3 数据库.
mysqlnd 是随 PHP 发布的新核心库. 它是 PHP 独有的 libmysql 的替代. 如果系统上未发现 libmysql, mysqlnd 将被用来构建 mysql, mysqli 和 PDO_MySQL 扩展. 甚至 libmysql 存在的情况下, 它也可以被用来代替 libmysql. 由于性能上的原因, 推荐在全部的 PHP 安装中都使用 mysqlnd.

另外,这些扩展已经被移动至 PECL 并且不再是 PHP 发布的一部分. 这些扩展的 PECL 包版本将根据用户需求创建.

dbase – 不再被保持
fbsql – 不再被保持
fdf – 被保持
ming – 被保持
msql – 不再被保持
ncurses – 被保存
sybase – 停用; 使用 sybase_ct 扩展代替.
mhash – 停用; 使用 hash 扩展代替. hash 全兼容 mhash; 全部使用旧函数的应用程序仍将可以工作.

七、PHP 5.3.0 新增了以下类:

日期/时间:
DateInterval
DatePeriod

Phar:
Phar
PharData
PharException
PharFileInfo

SPL:
FilesystemIterator
GlobIterator
MultipleIterator
RecursiveTreeIterator
SplDoublyLinkedList
SplFixedArray
SplHeap
SplMaxHeap
SplMinHeap
SplPriorityQueue
SplQueue
SplStack
八、INI 文件处理改变

PHP5.3.0显著改进了 INI 文件的性能和解析, 并且新增了若干语法功能.

标准的 php.ini 文件被重新组织和命名. php.ini-development 包含在开发环境中推荐使用的设置. php.ini-production 包含在生产环境中推荐使用的设置.
支持两个特殊章节: [PATH=/opt/httpd/www.example.com/] 和 [HOST=www.example.com]. 这两个章节里的指令不能被用户定义的 INI 文件或者运行时覆盖. 关于这些章节的更多信息, 可以这里找到.
移除了 zend_extension_debug and zend_extension_ts. 使用 zend_extension 指令来加载全部 Zend 扩展.
移除了 zend.ze1_compatibility_mode. 如果该 INI 指令被设置为 On, 启动时将抛出 E_ERROR 级别错误.
在 “extension” 指令中可以使用全路径来加载模块.
“ini变量” 现在几乎在 php.ini 文件的任何地方都可以使用.
可以在运行时收紧 open_basedir 限制条件.
可以在 INI 选项数组中使用字母数字或者变量.
get_cfg_var() 现在可以返回 “数组(array)” INI 选项.
添加了一个新指令 mail.add_x_header.
user_ini.filename 是新增的.
user_ini.cache_ttl 也是新增的.
exit_on_timeout 也是新增的.
open_basedir 现在是 PHP_INI_ALL 的.

新增以下指令:
新的 .htaccess-style 用户 INI 文件机制中的 user_ini.filename 和 user_ini.cache_ttl.
新增 mbstring.http_output_conv_mimetype. 该指令指定了 mb_output_handler() 激活内容类型的正则表达式.
新增 request_order. 允许控制哪些外部变量在 $_REQUEST 中可用.

以下 ini 指令默认值更新:
session.use_only_cookies 默认被设置为 “1”(打开).
oci8.default_prefetch 变更为从 “10” 到 “100”.