zl程序教程

您现在的位置是:首页 >  大数据

当前栏目

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

配置 区别 小结 异同 php5 php4
2023-06-13 09:14:31 时间
php4没有静态成员

php网页后台出现这样的错误,查过SubPages1.php并没有找到相应的错误。网站在自己本地测试完全正常,传到空间以后就出现这样的错误。连验证码都看不到了,类似的错误还有Parseerror:syntaxerror,unexpectedT_STRING,expectingT_OLD_FUNCTIONorT_FUNCTIONorT_VARor"}"in/www/users/myhuashun.com.ufhost/admin/yanzhengma.phponline6

服务器是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
classMyDestructableClass{
function__construct(){
print"Inconstructor\n";
$this->name="MyDestructableClass";
}

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

$obj=newMyDestructableClass();
?>

而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服务器变量在Apache2SAPI中不再暗中设定,这和PHP4中的情形相反,如果Apache没产生此值则其被设为和SCRIPT_FILENAME服务器变量一样的值。此修改是为了遵守CGI规范。更多信息参考手册中$_SERVER["PATH_TRANSLATED"]的说明。此问题也影响到PHP>=4.3.2的版本。
Tokenizer扩展不再定义T_ML_COMMENT常量。如果把error_reporting设为E_ALL,PHP将产生一条消息。尽管T_ML_COMMENT从来都没用到过,还是在PHP4中定义了。在PHP4和PHP5中//和都被解析为T_COMMENT常量。但是PHPDoc风格的注释,自PHP5开始被PHP解析,被识别为T_DOC_COMMENT。
如果variables_order包括“S”,$_SERVER应该带有argc和argv被产生。如果用户特别配制系统不创建$_SERVER,那此变量当然就不存在了。改变的地方是不管variables_order怎么设定,在CLI版本中argc和argv总是可用的。本来CLI版不是总会产生全局变量$argc和$argv的。
没有属性的对象不再被当成“empty”。

有些情况下类必须在使用前被定义。这仅在使用了一些PHP5的新特性(例如interfaces)的时候发生。其它情况下行为都没变。
get_class(),get_parent_class()和get_class_methods()如今返回的类/方法名和定义时的名字一致(区分大小写),对于依赖以前行为(类/方法名总是返回小写的)的老脚本可能产生问题。一个可能的解决方法是在脚本中搜索所有这些函数并使用strtolower()。
区分大小写的改变也适用于魔术常量__CLASS__,__METHOD__和__FUNCTION__。其值都会严格按照定义时的名字返回(区分大小写)。
ip2long()在传递入一个非法IP作为参数时返回FALSE,不再是-1。

如果有函数定义在包含文件中,则这些函数可以在主文件中使用而与是否在return()指令之前还是之后无关。如果文件被包含两次,PHP5会发出致命错误,因为函数已经被定义,而PHP4不管这个。因此推荐使用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
classtest{}
$t=newtest();
var_dump(empty($t));//echobool(false)
if($t){
//Willbeexecuted
}
?>

实例:有些情况下类必须在使用之前定义
复制代码代码如下:
<?php
//workswithnoerrors:
$a=newa();
classa{
}
//throwsanerror:
$a=newb();
interfacec{
}
classbimplementsc{
}
?>

二、CLI和CGI
PHP5中对CLI和CGI文件名作了些改变。PHP5中,CGI版本被改名为php-cgi.exe(以前是php.exe),现在主目录中的是CLI版本(之前是cli/php.exe)。
PHP5中引进了一种新模式:php-win.exe。这和CLI版本相同,只除了php-win不输出任何内容,因此不会提供控制台(屏幕上不会闪过“dos窗口”)。此行为类似php-gtk。
PHP5中,CLI版本总会产生全局变量$argv和$argc而不管php.ini是怎么设的。即使将register_argc_argv设为off也不影响CLI。
参见命令行模式。
三、移植配置文件
由于ISAPI模块的名字改了,从php4xxx改为php5xxx,因此需要对配置文件作些修改。CLI和CGI文件名也改了。更多信息请查看相应章节。
移植Apache配置极其简单。照下面的例子来检查需要做的修改:
实例:移植Apache配置文件到PHP5
#将下面这行:LoadModulephp4_module/php/sapi/php4apache2.dll#改成这一行:LoadModulephp5_module/php/php5apache2.dll
如果web服务器是以CGI模式运行PHP的,应该注意CGI版本的名字从php.exe改为了php-cgi.exe。在Apache中,应该照这样改:
实例:移植Apache配置文件到PHP5,CGI模式
#将下面这行:Actionapplication/x-httpd-php"/php/php.exe"#改成这一行:Actionapplication/x-httpd-php"/php/php-cgi.exe"
其它的web服务器中,需要修改CGI或者ISAPI模块的名字。
四、新函数
PHP5有了些新函数。下面是列表:
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()-Waitsonorreturnsthestatusofaforkedchildasdefinedbythewaitpid()systemcall
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也作了重大调整
五、新指令
PHP5在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-启用ZendEngline1代(PHP4)兼容模式
六、数据库
关于数据库(MySQL和SQLite)在PHP5中有些改变。
PHP5中不再绑定MySQL客户端连接库,因为授权和一些其它问题。
有个新扩展库MySQLi(改良版MySQL),设计用来工作于MySQL4.1及更高版本之下。
自PHP5起,SQLite扩展库内置在PHP中。SQLite是一个可嵌入SQL数据库引擎,不是客户端连接库用来连接大型数据库服务器(如MySQL或PostgreSQL)的。SQLite库直接读写磁盘上的数据库文件。
七、新对象模型
PHP5中有个新对象模型(ObjectModel)。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文件加载的模块

示例如下:
#ForPHP4+apache1.x.xx
LoadModulephp4_moduled:/www/webserver/php4/sapi/php4apache.dll
AddTypeapplication/x-httpd-php.php内容来自中国站长资讯网(www.chinahtml.com)
#ForPHP4+apache2.x.xx
LoadModulephp4_moduled:/www/webserver/php4/sapi/php4apache2.dll
AddTypeapplication/x-httpd-php.php

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

#ForPHP5+apache1.x.xx
LoadModulephp5_moduled:/www/webserver/php5/php5apache.dll
AddTypeapplication/x-httpd-php.php

#ForPHP5+apache2.x.xx
LoadModulephp5_moduled:/www/webserver/php5/php5apache2.dll
AddTypeapplication/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.dll

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