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找不到的错误。