写在前面
从PHP5.2.x迁移到PHP5.3.x,这是官方提供的Migrating from PHP 5.2.x to PHP 5.3.x的翻译。还未完成。 文章参考了此文的翻译http://www.flyinghail.net/?p=99 在此表示感谢。
翻译追求表意,由于部分函数/类没有使用经验,翻译出错难免,请大家指正以修改、完善。
目录
一、PHP 5.3.x中发生了什么变化
二、向后不兼容的变化
三、新功能
四、Windows支持的变化
五、SAPI modules中的变化
六、PHP 5.3.x中不建议使用的功能
七、PHP 5.3.x中去除不推荐的功能
八、新参数
九、新函数
十、新的stream wrappers
十一、新的类常量
十二、新方法
十三、新扩展
十四、移除的扩展
十五、扩展中的其他变化
十六、新的类
十七、新的全局常量
十八、INI文件handling的变化
十九、其他变化
一、PHP 5.3.x中发生了什么变化
PHP 5.3.x中绝大多数的改良对现有代码无影响。但是需要考虑一小部分不兼容和新功能,并且在生产环境中切换PHP版本需要做下test。
从更旧的版本升级到php5.3.x,相关文档如下
Upgrade Notes for PHP 5.2.x.
Upgrade Notes for PHP 5.1.x.
Migrating from PHP 4 to PHP 5.
二、向后不兼容的变化
尽管绝大多数PHP5代码不需修改即可运行,但是请留意一些向后不兼容的变化:
所有PHP5.3.X附带的extension使用了新的参数解析API,如果传入不兼容的参数将导致函数返回NULL。
有部分例外情况,例如get_class()在发生错误的时候继续返回FALSE
clearstatcache()默认不再清除realpath的缓存
realpath()现在完全独立于操作系统,意味着例如__FILE__ . "/../x"这样的无效相对路径将不能再运行。
call_user_func() 这一系的函数现在可以使用 $this ,含父类。
array相关函数:natsort(), natcasesort(), usort(), uasort(), uksort(), array_flip(), 和 array_unique()不再接受object类型的参数
如果要使用,请先把object转换为数组。
之前参数为引用的函数接受直接的值,现在则会产生一个fatal error。
任何之前参数直接传常量或者字符的,需要先赋值到一个变量再调用函数。
举例
function test(&$a) {
echo 'OK';
}
test('a');
PHP5.3.X中将导致一个fatal error
新的mysqlnd函数库必须使用新的MySQL4.1的41字节的密码。使用16字节的旧密码将导致mysql_connect()和类似函数产生"mysqlnd cannot connect to MySQL 4.1+ using old authentication."的错误信息。
和libmysql一样,新的mysqlnd函数库不会读取mysql配置文件(my.cnf/my.ini)
如果你的代码依赖于mysql的配置文件,你可以用mysqli_options()函数加载。
注意,这意味着如果PDO MYSQL兼容mysqlnd则PDO::MYSQL_ATTR_READ_DEFAULT_FILE 和 PDO::MYSQL_ATTR_READ_DEFAULT_GROUP不会被defined。
SplFileInfo和其他目录相关的类返回的路径字符结尾处的"/"将被移除。
__toString魔术方法不再接受参数
__get, __set, __isset, __unset, 和 __call必须使用public并且不能再定义为静态方法
魔术方法__call现在能调用private和protected方法。
函数内include或者require一个文件,文件内将不能使用func_get_arg(), func_get_args() 和 func_num_args()函数。
以下关键词成为保留关键词,不能以其为其他函数、类命名。
goto
namespace
三、新功能
PHP 5.3.0提供了大量新功能
增加命名空间(namespaces)的支持
对迟静态绑定(Late static binding)的支持
对跳转标签的支持(即有限的goto)
增加对闭包Closures(Lambda/匿名函数)的支持
新的魔术方法:__callStatic 和 __invoke.
支持 Nowdoc 语法,类似于加上单引号的Heredoc 语法。
现在可以将 Heredocs 用来初始化静态变量与类中成员和常量
作为新增的Nowdoc语法的补充,现在可以使用双引号来声明。
可以在类以外使用const定义常量。
三元运算符现在可以使用简写 ?:
现在HTTP状态200至399都被HTTP stream wrapper认为是成功的。
现在能够动态访问静态方法
异常处理可以嵌套使用
默认开启新的垃圾回收器以解决循环引用(circular references)问题。
mail()函数支持日志记录(仅记录使用这个函数发送的邮件)
四、为支持 Windows 所做的修改
与windows有关的修改
支持的最低Windows 版本是Windows XP SP3;Windows 2000; Windows 98, ME 和 NT4 不再支持。
Windows 二进制包不再支持i386 和 i486 。
实验性的64位版本的PHP 。
编译器支持VC++9(VS2008)
同时Snapshots和releases支持VC9. 使用 VC6 编译的二进制包依旧被支持、与VC9同步发行。
PDO_OCI使用Oracle 10 或 11 客户端库的 php_pdo_oci.dll取代 php_pdo_oci8.dll 库 (注意没有 ‘8′) 。
依然支持连接数据库的其他版本。
新php_oci8_11g.dll作为php_oci8.dll 的补充。
这两个库都只能开启其中一个。php_oci8.dll 使用 Oracle 10.2 客户端库。
php_oci8_11g.dll 使用 Oracle 11 客户端库。
以下函数已经能够支持windows
checkdnsrr()
dns_get_record()
fnmatch()
getmxrr()
getopt()
imagecolorclosesthwb()
inet_ntop()
inet_pton()
link()
linkinfo()
mcrypt_create_iv()
readlink()
socket_create_pair() - 之前这个函数能在 Windows 下用,但是因为bug被PHP4.3.0屏蔽。
stream_socket_pair()
symlink()
time_nanosleep()
time_sleep_until()
Other changes:
其他改变:
改良了 stat(), touch(), filemtime(), filesize() 和其他有关函数的可移植性。
现在可以在 Windows 下使用 link() 函数建立硬连接(hard links),使用 symlink() 建立符号连接(symbolic links)。
硬链接用于 Windows 2000,符号连接用于 Windows Vista.
Windows版PHP现在公布了一组以PHP_WINDOWS_*为前缀的新常量。
有关的常量列表和用途请查阅 Predefined Constants(预定义常量)。
Warning
警告
已放弃对ISAPI模块的支持,可使用改进过的FastCGI SAPI模块代替。
提示: 现已为windows上的PHP创建全新的网站, 含各版本的下载、发布候选、快照。
网址:http://windows.php.net/
五、SAPI 模块中的改变
一个名为litespeed的SAPI模块已经能够使用
FastCGI现在总是开启的并不能被关闭。请查看 sapi/cgi/CHANGES 获得更多的信息。
CGI SAPI增加一个新选项 -T,用于测试脚本的重复执行时间。
CGI/FastCGI 现在支持.htaccess 风格的、用户定义的 php.ini文件
默认禁用dl()函数,并且仅能够在CLI, CGI 和embed SAPIs中使用。
六、PHP 5.3.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文件作注释
不建议使用的函数:
call_user_method() (使用 call_user_func() 代替)
call_user_method_array() (使用 call_user_func_array() 代替)
define_syslog_variables()
dl()
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 超全局变量(superglobal)代替)
session_unregister() (使用 $_SESSION 超全局变量(superglobal)代替)
session_is_registered() (使用 $_SESSION 超全局变量(superglobal)代替)
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_*系列常量代替字符串,来设置locale category names
The is_dst parameter to mktime(). Use the new timezone handling functions instead.
mktime()的参数is_dst 。用新的timezone处理函数代替。
不建议使用的功能:
不推荐将new的返回值为引用。
不推荐Call-time pass-by-reference 即不推荐func(&$param);
不推荐使用{}访问string offsets。请使用 [] 代替。
七、PHP 5.3.x 恢复正常使用的功能
由于is_a()的普遍需求,使用它不再产生 E_STRICT 错误。
八、新的参数
在 PHP 5.3 中部分函数提供了新的可选参数:
PHP 核心:
clearstatcache() – 增加了 clear_realpath_cache 和 filename .
copy() – 增加数据流环境参数(stream context parameter), context .
fgetcsv() – 增加 escape .
ini_get_all() – 增加 details .
mail() 函数现在支持记录发送的邮件。(仅对通过该函数发送的邮件有效)
nl2br() – 增加 is_xhtml .
parse_ini_file() – 增加 scanner_mode .
round() – 增加 mode .(PS:现在不光是四舍五入这一种形式了)
stream_context_create() – 增加 params .
strstr() 和 stristr() – 增加 before_needle .(PS:可以取指定字符前面的部分了)
json:
json_encode() – 增加 options .
json_decode() – 增加 depth .
Streams:
stream_select(), stream_set_blocking(), stream_set_timeout() 和 stream_set_write_buffer() 现在可以利用用户空间的数据流封装(user-space stream wrappers)。
sybase_ct:
sybase_connect() – 增加 new .
PHP 5.3.0中的新方法:
PHP 核心:
Exception::__construct() - 增加 previous.
九、新函数
PHP 核心:
array_replace() – 替换传入的数组为一个数组。
array_replace_recursive() – 递归的替换数组中的元素。
class_alias() – 为用户定义的类建立一个别名。
forward_static_call() – 在方法内(method context)执行用户函数。
forward_static_call_array() – 在方法内(method context)执行用户函数,参数使用数组。
gc_collect_cycles() – 强制收集已存在的垃圾回收数据(garbage cycles)。
gc_disable() – 关闭回收引用收集器(the circular reference collector)。
gc_enable() – 激活回收引用收集器(the circular reference collector)。
gc_enabled() – 返回回收引用收集器(the circular reference collector)的状态。
get_called_class() – 返回执行静态方法的类名。
gethostname() – 返回本地服务器当前的主机名(host name)。
header_remove() – 删除之前使用 header() 函数设置的 HTTP 头信息(HTTP header)。
lcfirst() – 将字符串第一个字符转换成小写。
parse_ini_string() – 解析配置字符串。
quoted_printable_encode() – 将 8 bit 字符串转换成 quoted-printable 编码的字符串。(PS:quoted-printable 编码是 MIME 邮件中常用的编码格式)
str_getcsv() – 将 CSV 字符串解析成数组。
stream_context_set_default() – 设置默认的 stream context(数据流环境?或者叫数据流资源?)。
stream_supports_lock() – 如果数据流支持锁则返回 TRUE。
stream_context_get_params() – 从 stream context 中取回参数。
streamWrapper::stream_cast() – 取回基本的 stream resource(数据流资源)。
streamWrapper::stream_set_option() – 修改 stream(数据流)选项。
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() – 返回时区数据库(timezonedb)的版本。
GMP:
gmp_testbit() – Tests whether a bit is set.
Hash:
hash_copy() – Copy hashing context.
IMAP:
imap_gc() – Clears IMAP cache.
imap_utf8_to_mutf7() – Encode a UTF-8 string to modified UTF-7.
imap_mutf7_to_utf8() – Decode a modified UTF-7 string to UTF-8.
JSON:
json_last_error() – Returns the last JSON error that occurred.
MySQL Improved:
mysqli_fetch_all() – Fetches all result rows as an associative array, a numeric array, or both.
mysqli_get_connection_stats() – Returns statistics about the client connection.
mysqli_poll() – Poll connections.
mysqli_reap_async_query() – Get result from async query.
OpenSSL:
openssl_random_pseudo_bytes() – Returns a string of the given length specified, filled with pseudo-random bytes.
PCNTL:
pcntl_signal_dispatch() – Calls signal handlers for pending signals.
pcntl_sigprocmask() – Sets and retrieves blocked signals.
pcntl_sigtimedwait() – Wait for signals with a timeout.
pcntl_sigwaitinfo() – Wait for signals.
PCRE:
preg_filter() – Perform a regular expression search and replace, reutrning only results which matched the pattern.
Semaphore:
msg_queue_exists() – Check whether a message queue exists.
shm_has_var() – Checks whether a specific key exists inside a shared memory segment.
以下函数在所有操作系统中都能运行
acosh()
asinh()
atanh()
expm1()
log1p()
十、新的 stream wrappers
glob://
phar://
十一、新的类常量
PDO_FIREBIRD:
PDO::FB_ATTR_DATE_FORMAT - 日期格式
PDO::FB_ATTR_TIME_FORMAT - 时间格式
PDO::FB_ATTR_TIMESTAMP_FORMAT - timestamps格式.
十二、新的类方法
Date/Time:
DateTime::add() - 在一个DateTime类型上增加指定的日、月、年、小时、分、秒
DateTime::createFromFormat() - 根据指定的格式返回新DateTime
DateTime::diff() - 返回两个DateTime的差
DateTime::getLastErrors() - 返回最近一次date/time操作的警告或错误信息
DateTime::sub() - Subtracts an amount of days, months, years, hours, minutes and seconds from a DateTime object.
Exception:
Exception::getPrevious() - 获取上次错误信息
DOM:
DOMNode::getLineNo() - 获取指定节点的行号
PDO_FIREBIRD:
PDO::setAttribute() - 设置属性
Reflection:
ReflectionClass::getNamespaceName() - 返回类的命名空间名称
ReflectionClass::getShortName() - 返回类的短名(即不包含namespace部分)
ReflectionClass::inNamespace() - 返回namespace中是否定义了该类
ReflectionFunction::getNamespaceName() - 返回已定义该函数的namespace的名称
ReflectionFunction::getShortName() - 返回函数的短名(不包含namespace部分)
ReflectionFunction::inNamespace() - 返回函数是否已在namespace中定义
ReflectionProperty::setAccessible() - 设置非public属性是否能被访问
SPL:
SplObjectStorage::addAll() - Add all elements from another SplObjectStorage object.
SplObjectStorage::removeAll() - Remove all elements from another SplObjectStorage object.
XSL:
XSLTProcessor::setProfiling() - Sets the profiling output file.
十三、新扩展
PHP 5.3.0默认已添加以下扩展
Enchant - An abstraction layer above various spelling libraries
Fileinfo - An improved and more solid replacement, featuring full BC, for the Mimetype extension, which has been removed.
INTL - Internationalization extension. INTL is a wrapper around the » ICU library.
Phar - Implementation of PHP-Archive files.
SQLite3 - 支持SQLite3
mysqlnd is a new core library shipped with PHP. It is a PHP-specific replacement for libmysql.
mysqlnd will be used to build the mysql, mysqli and PDO_MySQL extensions if libmysql isnt found on the system.
It may also be used instead of libmysql even when libmysql is present. mysqlnd is recommended for all PHP installations for performance reasons.
十四、移除的扩展
以下扩展被移到PECL并不再作为PHP发行版的一部分
These extensions have been moved to PECL and are no longer part of the PHP distribution.
The PECL package versions of these extensions will be created according to user demand.
这些扩展的PECL包版本将以用户的需要来创建
dbase - 不再保留
fbsql - 不再保留
fdf - 保留
ming - 保留
msql - 不再保留
ncurses - 保留
sybase - 不再继续,请使用sybase_ct扩展来代替
mhash - 不再继续,请使用hash扩展来代替,hash完全兼容mhash;使用旧方法将能继续运行。
十五、扩展中的其他变化
在配置时以下扩展将无法被禁用
PCRE
Reflection
SPL
扩展行为的变化以及新功能
Date and Time - The TZ environment variable is no longer used to guess the timezone
cURL - cURL支持SSH
Network - dns_check_record()返回额外的键"entries", 包含域名的TXT记录.
Hash - 支持SHA-224 和 salsa hash algorithms
mbstring - 支持 CP850编码
OCI8 - A call to oci_close() on a persistent connection, or a variable referencing a persistent connection going out of scope,
will now roll back any uncommitted transaction. To avoid unexpected behavior, explicitly issue a commit or roll back as needed.
The old behavior can be enabled with the INI directive oci8.old_oci_close_semantics.
Database Resident Connection Pooling (DRCP) and Fast Application Notification (FAN) are now supported.
Oracle External Authentication is now supported (except on Windows).
The oci_bind_by_name() function now supports SQLT_AFC (aka the CHAR datatype).
OpenSSL - OpenSSL digest and cipher functions are now supported. It is also now possible to access the internal values of DSA, RSA and DH keys.
Session - Sessions will no longer store session-files in "/tmp" when open_basedir restrictions apply, unless "/tmp" is explicitly added to the list of allowed paths.
SOAP Now supports sending user supplied HTTP headers.
MySQLi 在主机名前添加"p:"将支持持久连接
Image Processing and GD The "JPG Support" index returned from gd_info() has been renamed to "JPEG Support".
十六、新的类
Date/Time:
DateInterval
DatePeriod
Phar:
Phar
PharData
PharException
PharFileInfo
SPL:
FilesystemIterator
GlobIterator
MultipleIterator
RecursiveTreeIterator
SplDoublyLinkedList
SplFixedArray
SplHeap
SplMaxHeap
SplMinHeap
SplPriorityQueue
SplQueue
SplStack
十七、新的全局常量
PHP Core:
__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
十八、INI文件处理的变化
PHP 5.3.0显著改进了INI文件解析的性能,并且添加若干新语法功能
The standard php.ini files have been re-organized and renamed. php.ini-development contains settings recommded for use in development environments. php.ini-production contains settings recommended for use in production environments.
There is now support for two special sections: [PATH=/opt/httpd/www.example.com/] and [HOST=www.example.com]. Directives set in these sections cannot be overridden by user-defined INI files or at runtime. More information about these sections can be found here.
zend_extension_debug and zend_extension_ts have been removed. Use the zend_extension directive to load all Zend Extensions.
zend.ze1_compatibility_mode has been removed. If this INI directive is set to On, an E_ERROR error is emitted at startup.
It is now possible to use the full path to load modules using the "extension" directive.
"ini-variables" can now be used almost anywhere in a php.ini file.
Runtime tightening of open_basedir restrictions is now possible.
It is now possible to use alphanumeric or variable indices in INI option arrays.
get_cfg_var() is now able to return "array" INI options.
A new directive, mail.add_x_header, has been added.
user_ini.filename is new
user_ini.cache_ttl is also new
exit_on_timeout is new too
open_basedir is now PHP_INI_ALL
The following new ini directives have been added:
user_ini.filename and user_ini.cache_ttl for the new .htaccess-style user INI file mechanism.
Added mbstring.http_output_conv_mimetype. This directive specifies the regex pattern of content types for which mb_output_handler() is activated.
Added request_order. Allows controlling which external variables will be available in $_REQUEST.
The following ini directives have new default values:
session.use_only_cookies is now set to "1" (enabled) by default.
oci8.default_prefetch has changed from "10" to "100".
十九、其他变化
SplFileInfo::getpathinfo() 返回path name信息
SplObjectStorage now has ArrayAccess support. It is now also possible to store associative information with objects in SplObjectStorage.
In the GD extension, there is now pixelation support available through the imagefilter() function.
var_dump() 输出将包含私有属性
session_start() 失败返回FALSE
property_exists() now checks the existence of a property independent of accessibility (like method_exists()).
Stream wrappers can now be used by include_path.
The initial parameter for array_reduce() can now be of any type.
The directory functions opendir(), scandir(), and dir() now use the default stream context if no explicit context is passed.
crypt() now has Blowfish and extended DES support, and crypt() features are now 100% portable. PHP has its own internal crypt implementation which drops into place when support for crypt or crypt_r is not found.
getopt() now accepts "long options" on all platforms. Optional values and = as a separator for short options are now supported.
fopen()有了新的模式选项(n), which passes O_NONBLOCK to the underlying open() system call. 这个模式已经能在windows上使用。
getimagesize() 支持icon文件(.ico).
mhash扩展移到PECL, 编译时使用--with-mhash选项,hash扩展将兼容mhash。注意:hash扩展开启兼容mhash,无需mhash库的支持。
本文采用Creative Commons协议,复制本文需遵守三点:1、保留署名(链接);2、非商业性使用;3、再次创作的作品必须以相同的许可协议发布。法律顾问:庄毅雄律师