开发者社区> cometwo123> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

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 SAPI 中不再暗中设定,这和 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.
    
    参见命令行模式。
    
    三、移植配置文件
    
    由于 ISAPI 模块的名字改了,从 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

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
2015首届云栖奖评选,寻找云上创新先锋
云栖联盟联合ITValue、钛媒体发起了2015首届云栖奖评选,旨在寻找那些善用云计算技术和资源,引领企业迈向DT时代的最佳CIO、CTO;也寻找那些帮助云上创业创新项目迅速成长,在这个行业中具有榜样效应的孵化机构和伯乐。
8037 0
fork与vfork的区别
fork()与vfock()都是创建一个进程,那他们有什么区别呢?总结有以下三点区别: 1.  fork  ():子进程拷贝父进程的数据段,代码段     vfork ( ):子进程与父进程共享数据段 2.  fork ()父子进程的执行次序不确定     vfork 保证子进程先运行,在调用exec 或exit 之前与父进程数据是共享的,在它调用exec     或exit 之后父进程才可能被调度运行。
1291 0
堆区和栈区的区别【转】
本文源自:http://blog.csdn.net/hairetz/article/details/4141043   一、预备知识—程序的内存分配     一个由C/C++编译的程序占用的内存分为以下几个部分     1、栈区(stack)—   由编译器自动分配释放   ,存放函数的参数值,局部变量的值等。
708 0
堆和栈的区别 【转】
http://6520874.blog.163.com/blog/static/725827192010930102014899/?suggestedreading&wumii 最近太过执着于一些底层概念,《堆和栈的区别》这篇经典的博文已经被转载过N次,但还是转到这里,以方便日后查阅。
847 0
C#中各种编码格式的区别
    最近了解了一下C#中Encoding的不同编码方式的区别,和大家分享一下,如果有不对的地方还请各位批评指教。     简单的说,为什么需要编码? 比如,我们的计算机中需要表示字母'a','b'等等字母,然而这些字母如何在计算机内存中表示?众所周知,在计算机内存中数据是以二进制来表示的,这样,我们就需要将这些需要表示的字母和数字或者符号转换成能在计算机中表示的二进制表示,这就
987 0
+关注
文章
问答
文章排行榜
最热
最新
相关电子书
更多
使用C++开发PHP7扩展
立即下载
PHP运行机制初探
立即下载
The Next Gen of PHP
立即下载