PHP5与PHP4的区别小议

简介:
PHP5与PHP4的区别小议:
    
    一、未100%向下兼容
    
    在php5中尽管大部分PHP4的代码应该不用修改就能运行,还是应该留意以下不向下兼容的改变:
    
    有了一些新关键字。
    
    strrpos() 和 strripos()如今使用整个字符串作为 needle.
    
    非法使用字符串偏移量会导致 E_ERROR 而不是 E_WARNING.一个非法使用的例子:$str = 'abc'; unset($str[0]);.
    
    array_merge() 被改成只接受数组。如果传递入非数组变量,对每个此类参数都会发出一条 E_WARNING 信息。要小心因为你的代码有可能疯狂发出 E_WARNING.
    
    PATH_TRANSLATED  服务器 变量在 Apache2  SAP I 中不再暗中设定,这和 PHP 4 中的情形相反,如果 Apache 没产生此值则其被设为和 SCRIPT_FILENAME  服务器 变量一样的值。此修改是为了遵守CGI 规范。更多信息参考手册中 $_SERVER['PATH_TRANSLATED'] 的说明。此问题也影响到 PHP >= 4.3.2 的版本。
    
    Tokenizer 扩展不再定义T_ML_COMMENT 常量。如果把 error_reporting 设为 E_ALL,PHP 将产生一条消息。尽管 T_ML_COMMENT 从来都没用到过,还是在 PHP 4 中定义了。在 PHP 4 和 PHP 5 中 // 和 都被解析为 T_COMMENT 常量。但是 PHPDoc 风格的注释 ,自 PHP 5 开始被 PHP 解析,被识别为 T_DOC_COMMENT.
    
    如果 variables_order 包括“S”,$_SERVER 应该带有 argc 和 argv 被产生。如果用户特别配制系统不创建 $_SERVER,那此变量当然就不存在了。改变的地方是不管 variables_order 怎么设定,在 CLI 版本中 argc 和 argv 总是可用的。本来 CLI 版不是总会产生全局变量 $argc 和 $argv 的。
    
    没有属性的对象不再被当成“empty”.
    
    有些情况下类必须在使用前被定义。这仅在使用了一些 PHP 5 的新特性(例如 interfaces)的时候发生。其它情况下行为都没变。
    
    get_class(),get_parent_class() 和 get_class_methods() 如今返回的类/方法名和定义时的名字一致(区分大小写),对于依赖以前行为(类/方法名总是返回小写的)的老脚本可能产生问题。一个可能的解决方法是在脚本中搜索所有这些函数并使用 strtolower()。
    
    区分大小写的改变也适用于魔术常量 __CLASS__,__METHOD__ 和 __FUNCTION__.其值都会严格按照定义时的名字返回(区分大小写)。
    
    ip2long() 在传递入一个非法 IP 作为参数时返回 FALSE,不再是 -1.
    
    如果有函数定义在包含文件中,则这些函数可以在主文件中使用而与是否在 return() 指令之前还是之后无关。如果文件被包含两次,PHP 5 会发出致命错误,因为函数已经被定义,而 PHP 4 不管这个。因此推荐使用 include_once() 而不要去检查文件是否已被包含以及在包含文件中有条件返回。
    
    include_once() 和 require_once() 在  Windows  下先将路径规格化,因此包含 A.php 和 a.php 只会把文件包含一次。
    
    实例: strrpos() 和 strripos() 如今用整个字符串作为 needle
    
    <?php
    
    var_dump(strrpos(‘ABCDEF','DEF’)); //int(3)
    
    var_dump(strrpos(‘ABCDEF','DAF’)); //bool(false)
    
    ?>
    
    实例: 没有属性的对象不再被当成“empty”
    
    <?php
    
    class test { }
    
    $t = new test();
    
    var_dump(empty($t)); // echo bool(false)
    
    if ($t) {
    
    // Will be executed
    
    }
    
    ?>
    
    实例: 有些情况下类必须在使用之前定义
    
    <?php
    
    //works with no errors:
    
    $a = new a();
    
    class a {
    
    }
    
    //throws an error:
    
    $a = new b();
    
    interface c{
    
    }
    
    class b implements c {
    
    }
    
    ?>
    
    二、CLI 和 CGI
    
    PHP 5 中对 CLI 和 CGI 文件名作了些改变。PHP 5 中,CGI 版本被改名为 php-cgi.exe(以前是 php.exe),现在主目录中的是 CLI 版本(之前是 cli/php.exe)。
    
    PHP 5 中引进了一种新模式:php-win.exe.这和 CLI 版本相同,只除了 php-win 不输出任何内容,因此不会提供控制台(屏幕上不会闪过“dos 窗口”)。此行为类似 php-gtk.
    
    PHP 5 中,CLI 版本总会产生全局变量 $argv 和 $argc 而不管 php.ini 是怎么设的。即使将register_argc_argv设为 off 也不影响 CLI.
    
    参见命令行模式。
    
    三、移植配置文件
    
    由于 I SAP I 模块的名字改了,从 php4xxx 改为 php5xxx,因此需要对配置文件作些修改。CLI 和 CGI 文件名也改了。更多信息请查看相应章节。
    
    移植 Apache 配置极其简单。照下面的例子来检查需要做的修改:
    
    实例: 移植 Apache 配置文件到 PHP 5
    
    # 将下面这行: LoadModule php4_module /php/sapi/php4apache2.dll # 改成这一行: LoadModule php5_module /php/php5apache2.dll
    
    如果 web 服务器是以 CGI 模式运行 PHP 的,应该注意 CGI 版本的名字从 php.exe 改为了 php-cgi.exe.在 Apache 中,应该照这样改:
    
    实例: 移植 Apache 配置文件到 PHP 5,CGI 模式
    
    # 将下面这行: Action application/x-httpd-php “/php/php.exe” # 改成这一行: Action application/x-httpd-php “/php/php-cgi.exe”
    
    其它的 web 服务器中,需要修改 CGI 或者 ISAPI 模块的名字。
    
    四、新函数
    
    PHP 5 有了些新函数。下面是列表:
    
    Arrays:
    
    array_combine() - 用一个数组作为键名,另一个数组作为值创建一个新数组
    
    array_diff_uassoc() - 计算数组的差别,并用用户提供的回调函数作附加的索引检查
    
    array_udiff() - 用回调函数比较数据来计算数组的差别
    
    array_udiff_assoc() - 计算数组的差别并作附加的索引检查。用回调函数来比较数据
    
    array_udiff_uassoc() - 计算数组的差别并作附加的索引检查。数据的比较和索引检查都用回调函数来完成
    
    array_walk_recursive() - 对数组的每个成员递归使用用户函数
    
    array_uintersect_assoc() - 计算数组的交集并作附加的索引检查。用回调函数来比较数据
    
    array_uintersect_uassoc() - 计算数组的交集并作附加的索引检查。数据和索引都用回调函数来比较
    
    array_uintersect() - 计算数组的交集。用回调函数来比较数据
    
    InterBase:
    
    ibase_affected_rows() - 返回前一个查询影响到的行的数目
    
    ibase_backup() - 在服务管理器中发起一个后台任务并立即返回
    
    ibase_commit_ret() - 提交一个事务但不关闭
    
    ibase_db_info() - 请求有关数据库的统计信息
    
    ibase_drop_db() - 删除一个数据库
    
    ibase_errcode() - 返回一个错误代码
    
    ibase_free_event_handler() - 取消一个已注册的事件句柄
    
    ibase_gen_id() - 递增指定的发生器并返回其新值v
目录
相关文章
|
4月前
|
PHP
PHP public、protected、private、static、abstract、final、interface、implements 区别对比
PHP public、protected、private、static、abstract、final、interface、implements 区别对比
27 0
|
8月前
|
PHP
PHP - Laravel Blade模板注释 {{-- 注释 --}} 与 <!-- 注释 --> 的区别
PHP - Laravel Blade模板注释 {{-- 注释 --}} 与 <!-- 注释 --> 的区别
62 0
|
4月前
|
PHP 调度
PHP CGI、FastCGI、PHP-FPM、PHP-CGI 区别
PHP CGI、FastCGI、PHP-FPM、PHP-CGI 区别
28 5
|
4月前
|
PHP
php中elseif 和else if的区别
@(黑线)以前貌似看到if这里,就直接跳了,可是今天再读文档,又发现了点东西... @(乖)可能你已经知道了php存在elseif 和else if,保留了c的风格。
23 0
|
10月前
|
机器学习/深度学习 安全 Java
PHP, Python和Java的区别
PHP, Python和Java是广泛使用的编程语言。每种编程语言都有其独特的优点和缺点。在本文中,我们将对这些编程语言进行分析,并探讨它们在不同应用场景中的最佳用途。
|
8月前
|
数据处理 PHP
PHP面向对象和面向过程的区别
PHP面向对象和面向过程的区别
46 0
|
8月前
|
PHP 调度
PHP CGI、FastCGI、PHP-FPM、PHP-CGI 区别
PHP CGI、FastCGI、PHP-FPM、PHP-CGI 区别
70 0
|
存储 PHP
PHP重的重载和重写的区别是什么?底层原理是什么?
PHP重的重载和重写的区别是什么?底层原理是什么?
118 0