php4与php5的区别小结(配置异同)

php4 没有 静态成员

php网页后台出现这样的错误,查过SubPages1.php并没有找到相应的错误。网站在自己本地测试完全正常,传到空间以后就出现这样的错误。连验证码都看不到了,类似的错误还有Parse error: syntax error, unexpected T_STRING, expecting T_OLD_FUNCTION or T_FUNCTION or T_VAR or '}' in /www/users/myhuashun.com.ufhost/admin/yanzhengma.php on line 6

服务器是4.0版本的话 如果有“public”,就将“public”去掉。就不会出错,如果“public” 是定义变量的话,将“public” 改为“var”。

最近在做一个整站内容管理系统(见本站首页),另外还在做一个朋友的办公楼信息管理系统!老实说才用php进行开发半年多一点,经验很不足,不 过从事WEB的工龄也足足好几年了。最初接触php的时候还是php3,php3不支持session,也没有面象对象的概念,只有一大堆的函数!最初也 是在诸多web脚本中徘徊,asp,php,jsp已经是三足顶立了,当然perl,cgi对于那时还是初学者的学生来说太奢侈了。其实那时候也很喜欢那 一大堆的函数,就像当时学习dos的命令一样,但是比起asp来说php3没有session,没有面象对象,而众多小公司都在使用asp是最初不选择 php的原因,而php4最大的进步就是加入了面象对象的思想,增加了服务器与客户机之间的会话管理。现在国内大多的主机提供商都还停留在php4版本 上,但是php5可以说才算得上真正意义的有点模样的语言!

所以,重回php就是用php5进行开发,在我的机器上没有安装过php4的版本,但是在主机上却是php4的版本,所以开发过程中,我不得不小心翼翼,认真的了解他们之间的特性。

1、PHP4没有static,private,protect等修饰,所以开发出来的程序上传到主机上得把所有这些去掉!

2、PHP4中对像调用不能写成 $obj->method_a()->method_b();而PHP5可以,这句语句的意思就是调用$obj的method_a()方法,会返回一个对象,再执行对象的method_b()方法。
那么我上传到我的主机上,我就得把所有这样的语句改成


代码如下:

$tempobj=$obj->method_a();
$tempobj->method_b();

3、复杂字符串中变量解析中php5中可以解析对象的方法属性等,如:

$a="{$db->isconnected}";
而php4不能正确运行。
4、PHP5中可以用构造和析构魔术函数如:


代码如下:

<?php
class MyDestructableClass {
function __construct() {
print "In constructor\n";
$this->name = "MyDestructableClass";
}

function __destruct() {
print "Destroying " . $this->name . "\n";
}
}

$obj = new MyDestructableClass();
?>

而php4中没有,只有与类名同名的函数就是构造函数,而且对与类名同名的构造函数。

php5在php4上还增加了很多,如pdo等,php6可能做了更多的扩展(现在还没有试用php6),想php会越来强大,越来越适合基于WEB的开发。

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() - 递增指定的发生器并返回其新值
ibase_maintain_db() - 在数据库服务器上执行一条维护命令
ibase_name_result() - 给结果集指定一个名字
ibase_num_params() - 返回一个准备好的查询的参数数目
ibase_param_info() - 返回一个准备好的查询的参数信息
ibase_restore() - 在服务管理器中发起一个还原任务并立即返回
ibase_rollback_ret() - 回卷一笔事务并保留事务上下文
ibase_server_info() - 请求有关数据库服务器的统计信息
ibase_service_attach() - 连接到服务管理器
ibase_service_detach() - 从服务管理器断开
ibase_set_event_handler() - 注册一个当事件发布时要调用的回调函数
ibase_wait_event() - 等待数据库发布一条事件
iconv:
iconv_mime_decode() - 解码 MIME 头信息字段
iconv_mime_decode_headers() - 一次解码多个 MIME 头信息字段
iconv_mime_encode() - 压缩 MIME 头信息字段
iconv_strlen() - 返回字符串中的字符计数
iconv_strpos() - 在堆栈中找到第一个出现的子串位置
iconv_strrpos() - 在堆栈中找到最后一个出现的子串位置
iconv_substr() - 从字符串中取出一部分
Streams:
stream_copy_to_stream() - 把一个流的数据复制到另一个流
stream_get_line() - 根据给定的分隔符中流中读取一行
stream_socket_accept() - 接受一个由 stream_socket_server() 建立的 socket 连接
stream_socket_client() - 打开一个 Internet 或 Unix 域的 socket 连接
stream_socket_get_name() - 获取本地或远程的 sockets 名字
stream_socket_recvfrom() - 从 socket 获取数据(不管连接是否已经建立)
stream_socket_sendto() - 向 socket 发送一个消息(不管连接是否已经建立)
stream_socket_server() - 建立一个 Internet 或 Unix 域服务器的 socket
Date/Time:
idate() - 将本地进间格式化为整数
date_sunset() - 计算所指定日期和地点的日落时间
date_sunrise() - T计算所指定日期和地点的日出时间
time_nanosleep() - 廷迟执行程若干秒和若干纳秒
Strings:
str_split() - 把一个字符串分割为数组
strpbrk() - 在一字符串中搜索给定的字符集合中的任意一个字符
substr_compare() - 以二进制的形式比较两个字符串,从第一个字符串的 offset 开始,直到到达长度为 length 时结束,可自定义是否大小写敏感比较
Other:
convert_uudecode() - 解码 uuencoded 的字符串
convert_uuencode() - 对字符串进行 uuencode
curl_copy_handle() - 复制一个 cURL 句柄及其所有参数
dba_key_split() - 把一个键分隔为字符串数组
dbase_get_header_info() - 取得 dBase 数据库的头部信息
dbx_fetch_row() - 获取结果集中被设置为 DBX_RESULT_UNBUFFERED 的行
fbsql_set_password() - 修改指定用户的密码
file_put_contents() - 向一个文件内写入字符串
ftp_alloc() - 为准备上传的文件分配空间
get_declared_interfaces() - 以数组的形式返回所有已定义的接品
get_headers() - 获取服务器响应 HTTP 请求时的所有头部信息
headers_list() - 返回所有已发送或准备发送响应头部列表
http_build_query() - 生成一个已经过 URL 编码的请求字符串
image_type_to_extension() - 根据 getimagesize(), exif_read_data(), exif_thumbnail(), exif_imagetype() 所返回的 image-type 取得文件名后缀
imagefilter() - 对图像应用滤镜
imap_getacl() - 获取指定邮箱的 ACL
ldap_sasl_bind() - 使用 SASL 绑定到 LDAP 目录
mb_list_encodings() - 以数组的形式返回所支持的全部字符集
pcntl_getpriority() - 获得任意一个进程的优先级
pcntl_wait() - Waits on or returns the status of a forked child as defined by the waitpid() system call
pg_version() - 返回一个包含客户端、协议和服务器版本的数组
php_check_syntax() - 检查指定文件的语法
php_strip_whitespace() - 返回已经去除注释和空白的源代码
proc_nice() - 修改当前进程的优前级
pspell_config_data_dir() - 修改语言文件的位置
pspell_config_dict_dir() - 修改主要单词列表的位置
setrawcookie() - 发送一个没有经过 url 编码的 cookie 值
scandir() - 列中指定目录中的所有子目录和文件
snmp_read_mib() - 在一个可用的 MIB 树中读取和分板一个 MIB 文件
sqlite_fetch_column_types() - 以数组的形式返回一张表中的列类型
注意: Tidy 扩展库的 API 也作了重大调整
五、新指令
PHP 5 在 php.ini 中引进了一些新指令。列表如下:
mail.force_extra_parameters - 强制指定的参数附加值作为额外的参数传递给 sendmail 库。这些参数总是会替换掉 mail() 的第 5 个参数,即使在安全模式下
register_long_arrays - 允许/禁止 PHP 注册已过时的 $HTTP_*_VARS 变量
session.hash_function - 选择一种散列函数(MD5 或 SHA-1)
session.hash_bits_per_character - 定义将二进制散列数据转换为可读格式时每个字符中储存几个位(从 4 到 6)
zend.ze1_compatibility_mode - 启用 Zend Engline 1 代(PHP 4)兼容模式
六、数据库
关于数据库(MySQL 和 SQLite)在 PHP 5 中有些改变。
PHP 5 中不再绑定 MySQL 客户端连接库,因为授权和一些其它问题。
有个新扩展库 MySQLi(改良版 MySQL),设计用来工作于 MySQL 4.1 及更高版本之下。
自 PHP 5 起,SQLite 扩展库内置在 PHP 中。SQLite 是一个可嵌入 SQL 数据库引擎,不是客户端连接库用来连接大型数据库服务器(如 MySQL 或 PostgreSQL)的。SQLite 库直接读写磁盘上的数据库文件。
七、新对象模型
PHP 5 中有个新对象模型(Object Model)。PHP处理对象的方式完全重写了,允许更佳性能和更多特性。之前版本的 PHP,对象处理方式和原始类型(例如整型和字符串)相同。此方法的缺点是当变量被赋值或作为参数传递给方法时语义上整个对象都被拷贝。在新方法中,对象通过句柄引用,而不是值(可以将句柄当成是对象的标识符)。
很多PHP程序员根本没意识到旧的对象模型的这种拷贝怪癖,因此大多数PHP应用程序拿来就能运行,或者只做很小的修改。
新对象模型的文档见“类与对象”。

PHP基础知识:PHP4和PHP5的配置异同比较

配置php4或者php5的过程中,php4,5的配置的步骤大致一样的,但是配置内容有一些差别。在LINUX等环境下编译,一般来说,只要编译的选项正确,配置也就正确了;在windows配置则需要注意以下不同点:
1. php4ts.dll 和 php5ts.dll 内容来自中国站长资讯网(www.chinahtml.com)

这个文件要拷贝到apache的bin目录下或者系统目录下

2. httpd.conf 文件加载的模块

示例如下:
# For PHP4 + apache1.x.xx
LoadModule php4_module d:/www/webserver/php4/sapi/php4apache.dll
AddType application/x-httpd-php .php 内容来自中国站长资讯网(www.chinahtml.com)
# For PHP4 + apache2.x.xx
LoadModule php4_module d:/www/webserver/php4/sapi/php4apache2.dll
AddType application/x-httpd-php .php

# 其中d:/www/webserver/php4是php的所在目录。

# For PHP5 + apache1.x.xx
LoadModule php5_module d:/www/webserver/php5/php5apache.dll
AddType application/x-httpd-php .php

# For PHP5 + apache2.x.xx
LoadModule php5_module d:/www/webserver/php5/php5apache2.dll
AddType application/x-httpd-php .php
# 其中d:/www/webserver/php5是php的所在目录。

3. 加载mysql的方式不同

在php4以及以前的版本中,mysql是集成在php中的;
而在PHP5(包括BETA)版本,mysql是作为一个模块加载的,需要设置php.ini来加载,例如
extension_dir = "D:/www/WebServer/PHP5/ext/"
extension=php_mysql.dl l

另外,PHP4,PHP5都需要系统目录下的libmysql.dll的支持,如果版本不对,即使你设置了正确的extension_dir和php_mysql.dll的参数,也会造成apache启动的时候提示phpp_mysql.dll找不到的错误。

(0)

相关推荐

  • php4与php5的区别小结(配置异同)

    php4 没有 静态成员 php网页后台出现这样的错误,查过SubPages1.php并没有找到相应的错误.网站在自己本地测试完全正常,传到空间以后就出现这样的错误.连验证码都看不到了,类似的错误还有Parse error: syntax error, unexpected T_STRING, expecting T_OLD_FUNCTION or T_FUNCTION or T_VAR or '}' in /www/users/myhuashun.com.ufhost/admin/yanzhe

  • PHP4和PHP5共存于一系统

    PHP4和PHP5共存于一系统 /google 的广告条--> 在其它地方看到的一篇文章,老了一点,这两天也正想找个时间来用IIS+APACHE使用不同端口来做两个PHP共存....到时再发出来'罢..看原文吧 -------------------------------------------------------------好处不多说了,:D 坏处嘛...是CGI方式的(引用官方原文:we consider installing PHP like this suicidal.--esay

  • PHP4和PHP5版本下解析XML文档的操作方法实例分析

    本文实例讲述了PHP4和PHP5版本下解析XML文档的操作方法.分享给大家供大家参考,具体如下: 在PHP网站开发与建设过程中,时常会碰到需要对XML文档进行解析,PHP4版本自带了XML解析器(sax),PHP5版本增加了SimpleXML(基于dom)的XML扩展,对XML的解析更是非常方便,今天和大家分享下在不同环境下对XML文档进行解析的方法. XML文档 <?xml version="1.0" encoding="gbk"?> <Leap

  • Js+Ajax,Get和Post在使用上的区别小结

    get和post方法最大的不同在于: 1.get方法传值参数在url里面,而post参数放send里面 2.post方法必须加上 xmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); 下面实例可以看get方法 xmlHttp.open("GET","for.php?text="+url,true); 在post里面表现为:

  • php7和php5具体区别实例讲解

    php语言是一种脚本语言,它能够做很多事情比如说它可以用来与数据库交互开发web应用,进行软件开发包括企业网站的开发,移动app的开发等. PHP是干什么用的?简单说来,PHP是一门脚本语言,基本都用在web应用中的中间层,负责数据库以及前台页面交互和信息传递.主要php具有和java类似的class关键字.因为不需要虚拟机,以致速度比java快5倍. 下面通过实例代码看下php7和php5区别讲解,具体内容如下所示: 1.php标量类型和返回类型声明 #主要分为两种模式,强制性模式和严格模式

  • JavaScript中find()和 filter()方法的区别小结

    目录 前言 JavaScript find() 方法 JavaScript filter() 方法 find() 和 filter() 的区别与共点 直接上代码 总结 前言 JavaScript 在 ES6 上有很多数组方法,每种方法都有独特的用途和好处. 在开发应用程序时,大多使用数组方法来获取特定的值列表并获取单个或多个匹配项. 在列出这两种方法的区别之前,我们先来一一了解这些方法. JavaScript find() 方法 ES6 find() 方法返回通过测试函数的第一个元素的值.如果没

  • Windows下IIS6/Apache2.2.4+MySQL5.2+PHP5.2.1安装配置方法

    03年的时候就看过一本php的书,那时还是php3,回首四年php的在web开的的前景真还是一片光明啊!三年不见的php在去看已到了php5了,现在算起我真正从写第一个php的WEB开始距今还是有三四个月了,用工作之余正在进行www.kuomart.com网站的写做,回想当初一直用的是Windows2003+IIS6+PHP5.0.7+MYSQL4.1在进行开发,直到昨天机子重了木马,Kav也没查出个所以然,自己找也没有发现什么可疑暴露点,所以干脆重装了一下xp,由于TV1000电视卡只能在xp

  • Windows下Nginx+PHP5的安装与配置方法

    以下是我在 Windows 2003 安装中 Nginx 和 PHP5.2 的步骤,但windows版本的nginx性能要比Linux/Uninx版本的Nginx差太多. 安装 PHP5首先,从 http://www.php.net/downloads.php 下 载最新的 PHP5.2.9-2 Windows 版本,解压至 C:\php,把压缩包中的 php.ini-recommended,更名为 php.ini,然后打开修改几个选项: error_reporting = E_ALLdispl

  • Mybatis中#{}和${}传参的区别及#和$的区别小结

    最近在用mybatis,之前用过ibatis,总体来说差不多,不过还是遇到了不少问题,再次记录下, 比如说用#{},和 ${}传参的区别, 使用#传入参数是,sql语句解析是会加上"",比如 select * from table where name = #{name} ,传入的name为小李,那么最后打印出来的就是 select * from table where name = '小李',就是会当成字符串来解析,这样相比于$的好处是比较明显对的吧,#{}传参能防止sql注入,如果

  • 支持php4、php5的mysql数据库操作类

    前端一直使用PHP5,的确使用起来特别的爽,现在为了能在俺的虚拟主机上跑,不得不改成PHP4的.这几个库类我以前发在PHPCHIAN,地址是http://www.phpchina.com/bbs/viewthread.php?tid=5687&highlight=.(前几天在网上搜索了下,发现很多转载我的这几篇文章都没有说明出处,而且把我的版权都删除了,气晕了.) 昨天改写了数据库操作类,恰好在我简化zend Framework也能用到. 代码如下: <?php /** * filename

随机推荐