|
php網(wǎng)頁后臺出現(xiàn)這樣的錯(cuò)誤,查過SubPages1.php并沒有找到相應(yīng)的錯(cuò)誤。網(wǎng)站在自己本地測試完全正常,傳到空間以后就出現(xiàn)這樣的錯(cuò)誤。連驗(yàn)證碼都看不到了,類似的錯(cuò)誤還有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
服務(wù)器是4.0版本的話 如果有“public”,就將“public”去掉。就不會出錯(cuò),如果“public” 是定義變量的話,將“public” 改為“var”。
最近在做一個(gè)整站內(nèi)容管理系統(tǒng)(見本站首頁),另外還在做一個(gè)朋友的辦公樓信息管理系統(tǒng)!老實(shí)說才用php進(jìn)行開發(fā)半年多一點(diǎn),經(jīng)驗(yàn)很不足,不 過從事WEB的工齡也足足好幾年了。最初接觸php的時(shí)候還是php3,php3不支持session,也沒有面象對象的概念,只有一大堆的函數(shù)!最初也 是在諸多web腳本中徘徊,ASP,php,jsp已經(jīng)是三足頂立了,當(dāng)然perl,cgi對于那時(shí)還是初學(xué)者的學(xué)生來說太奢侈了。其實(shí)那時(shí)候也很喜歡那 一大堆的函數(shù),就像當(dāng)時(shí)學(xué)習(xí)dos的命令一樣,但是比起ASP來說php3沒有session,沒有面象對象,而眾多小公司都在使用ASP是最初不選擇 php的原因,而php4最大的進(jìn)步就是加入了面象對象的思想,增加了服務(wù)器與客戶機(jī)之間的會話管理?,F(xiàn)在國內(nèi)大多的主機(jī)提供商都還停留在php4版本 上,但是php5可以說才算得上真正意義的有點(diǎn)模樣的語言!
所以,重回php就是用php5進(jìn)行開發(fā),在我的機(jī)器上沒有安裝過php4的版本,但是在主機(jī)上卻是php4的版本,所以開發(fā)過程中,我不得不小心翼翼,認(rèn)真的了解他們之間的特性。
1、php4沒有static,private,protect等修飾,所以開發(fā)出來的程序上傳到主機(jī)上得把所有這些去掉!
2、php4中對像調(diào)用不能寫成 $obj->method_a()->method_b();而php5可以,這句語句的意思就是調(diào)用$obj的method_a()方法,會返回一個(gè)對象,再執(zhí)行對象的method_b()方法。
那么我上傳到我的主機(jī)上,我就得把所有這樣的語句改成
復(fù)制代碼 代碼如下:
$tempobj=$obj->method_a();
$tempobj->method_b();
3、復(fù)雜字符串中變量解析中php5中可以解析對象的方法屬性等,如:
$a="{$db->isconnected}";
而php4不能正確運(yùn)行。
4、php5中可以用構(gòu)造和析構(gòu)魔術(shù)函數(shù)如:
復(fù)制代碼 代碼如下:
<?php
class MyDestructableClass {
function __construct() {
print "In constructor/n";
$this->name = "MyDestructableClass";
}
function __destruct() {
print "Destroying " . $this->name . "/n";
}
}
$obj = new MyDestructableClass();
?>
而php4中沒有,只有與類名同名的函數(shù)就是構(gòu)造函數(shù),而且對與類名同名的構(gòu)造函數(shù)。
php5在php4上還增加了很多,如pdo等,php6可能做了更多的擴(kuò)展(現(xiàn)在還沒有試用php6),想php會越來強(qiáng)大,越來越適合基于WEB的開發(fā)。
php5與php4的區(qū)別小議:
一、未100%向下兼容
在php5中盡管大部分php4的代碼應(yīng)該不用修改就能運(yùn)行,還是應(yīng)該留意以下不向下兼容的改變:
有了一些新關(guān)鍵字。
strrpos() 和 strripos()如今使用整個(gè)字符串作為 needle。
非法使用字符串偏移量會導(dǎo)致 E_ERROR 而不是 E_WARNING。一個(gè)非法使用的例子:$str = ‘a(chǎn)bc'; unset($str[0]);.
array_merge() 被改成只接受數(shù)組。如果傳遞入非數(shù)組變量,對每個(gè)此類參數(shù)都會發(fā)出一條 E_WARNING 信息。要小心因?yàn)槟愕拇a有可能瘋狂發(fā)出 E_WARNING。
PATH_TRANSLATED 服務(wù)器變量在 Apache2 SAPI 中不再暗中設(shè)定,這和 php 4 中的情形相反,如果 Apache 沒產(chǎn)生此值則其被設(shè)為和 SCRIPT_FILENAME 服務(wù)器變量一樣的值。此修改是為了遵守CGI 規(guī)范。更多信息參考手冊中 $_SERVER['PATH_TRANSLATED'] 的說明。此問題也影響到 php >= 4.3.2 的版本。
Tokenizer 擴(kuò)展不再定義T_ML_COMMENT 常量。如果把 error_reporting 設(shè)為 E_ALL,php 將產(chǎn)生一條消息。盡管 T_ML_COMMENT 從來都沒用到過,還是在 php 4 中定義了。在 php 4 和 php 5 中 // 和 都被解析為 T_COMMENT 常量。但是 phpDoc 風(fēng)格的注釋 ,自 php 5 開始被 php 解析,被識別為 T_DOC_COMMENT。
如果 variables_order 包括“S”,$_SERVER 應(yīng)該帶有 argc 和 argv 被產(chǎn)生。如果用戶特別配制系統(tǒng)不創(chuàng)建 $_SERVER,那此變量當(dāng)然就不存在了。改變的地方是不管 variables_order 怎么設(shè)定,在 CLI 版本中 argc 和 argv 總是可用的。本來 CLI 版不是總會產(chǎn)生全局變量 $argc 和 $argv 的。
沒有屬性的對象不再被當(dāng)成“empty”。
有些情況下類必須在使用前被定義。這僅在使用了一些 php 5 的新特性(例如 interfaces)的時(shí)候發(fā)生。其它情況下行為都沒變。
get_class(),get_parent_class() 和 get_class_methods() 如今返回的類/方法名和定義時(shí)的名字一致(區(qū)分大小寫),對于依賴以前行為(類/方法名總是返回小寫的)的老腳本可能產(chǎn)生問題。一個(gè)可能的解決方法是在腳本中搜索所有這些函數(shù)并使用 strtolower()。
區(qū)分大小寫的改變也適用于魔術(shù)常量 __CLASS__,__METHOD__ 和 __FUNCTION__。其值都會嚴(yán)格按照定義時(shí)的名字返回(區(qū)分大小寫)。
ip2long() 在傳遞入一個(gè)非法 IP 作為參數(shù)時(shí)返回 FALSE,不再是 -1。
如果有函數(shù)定義在包含文件中,則這些函數(shù)可以在主文件中使用而與是否在 return() 指令之前還是之后無關(guān)。如果文件被包含兩次,php 5 會發(fā)出致命錯(cuò)誤,因?yàn)楹瘮?shù)已經(jīng)被定義,而 php 4 不管這個(gè)。因此推薦使用 include_once() 而不要去檢查文件是否已被包含以及在包含文件中有條件返回。
include_once() 和 require_once() 在 Windows 下先將路徑規(guī)格化,因此包含 A.php 和 a.php 只會把文件包含一次。
實(shí)例: strrpos() 和 strripos() 如今用整個(gè)字符串作為 needle
復(fù)制代碼 代碼如下:
<?php
var_dump(strrpos(‘ABCDEF',‘DEF')); //int(3)
var_dump(strrpos(‘ABCDEF',‘DAF')); //bool(false)
?>
實(shí)例: 沒有屬性的對象不再被當(dāng)成“empty”
<?php
class test { }
$t = new test();
var_dump(empty($t)); // echo bool(false)
if ($t) {
// Will be executed
}
?>
實(shí)例: 有些情況下類必須在使用之前定義
復(fù)制代碼 代碼如下:
<?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),現(xiàn)在主目錄中的是 CLI 版本(之前是 cli/php.exe)。
php 5 中引進(jìn)了一種新模式:php-win.exe。這和 CLI 版本相同,只除了 php-win 不輸出任何內(nèi)容,因此不會提供控制臺(屏幕上不會閃過“dos 窗口”)。此行為類似 php-gtk。
php 5 中,CLI 版本總會產(chǎn)生全局變量 $argv 和 $argc 而不管 php.ini 是怎么設(shè)的。即使將register_argc_argv設(shè)為 off 也不影響 CLI。
參見命令行模式。
三、移植配置文件
由于 ISAPI 模塊的名字改了,從 php4xxx 改為 php5xxx,因此需要對配置文件作些修改。CLI 和 CGI 文件名也改了。更多信息請查看相應(yīng)章節(jié)。
移植 Apache 配置極其簡單。照下面的例子來檢查需要做的修改:
實(shí)例: 移植 Apache 配置文件到 php 5
# 將下面這行: LoadModule php4_module /php/sapi/php4apache2.dll # 改成這一行: LoadModule php5_module /php/php5apache2.dll
如果 web 服務(wù)器是以 CGI 模式運(yùn)行 php 的,應(yīng)該注意 CGI 版本的名字從 php.exe 改為了 php-cgi.exe。在 Apache 中,應(yīng)該照這樣改:
實(shí)例: 移植 Apache 配置文件到 php 5,CGI 模式
# 將下面這行: Action application/x-httpd-php "/php/php.exe" # 改成這一行: Action application/x-httpd-php "/php/php-cgi.exe"
其它的 web 服務(wù)器中,需要修改 CGI 或者 ISAPI 模塊的名字。
四、新函數(shù)
php 5 有了些新函數(shù)。下面是列表:
Arrays:
array_combine() - 用一個(gè)數(shù)組作為鍵名,另一個(gè)數(shù)組作為值創(chuàng)建一個(gè)新數(shù)組
array_diff_uassoc() - 計(jì)算數(shù)組的差別,并用用戶提供的回調(diào)函數(shù)作附加的索引檢查
array_udiff() - 用回調(diào)函數(shù)比較數(shù)據(jù)來計(jì)算數(shù)組的差別
array_udiff_assoc() - 計(jì)算數(shù)組的差別并作附加的索引檢查。用回調(diào)函數(shù)來比較數(shù)據(jù)
array_udiff_uassoc() - 計(jì)算數(shù)組的差別并作附加的索引檢查。數(shù)據(jù)的比較和索引檢查都用回調(diào)函數(shù)來完成
array_walk_recursive() - 對數(shù)組的每個(gè)成員遞歸使用用戶函數(shù)
array_uintersect_assoc() - 計(jì)算數(shù)組的交集并作附加的索引檢查。用回調(diào)函數(shù)來比較數(shù)據(jù)
array_uintersect_uassoc() - 計(jì)算數(shù)組的交集并作附加的索引檢查。數(shù)據(jù)和索引都用回調(diào)函數(shù)來比較
array_uintersect() - 計(jì)算數(shù)組的交集。用回調(diào)函數(shù)來比較數(shù)據(jù)
InterBase:
ibase_affected_rows() - 返回前一個(gè)查詢影響到的行的數(shù)目
ibase_backup() - 在服務(wù)管理器中發(fā)起一個(gè)后臺任務(wù)并立即返回
ibase_commit_ret() - 提交一個(gè)事務(wù)但不關(guān)閉
ibase_db_info() - 請求有關(guān)數(shù)據(jù)庫的統(tǒng)計(jì)信息
ibase_drop_db() - 刪除一個(gè)數(shù)據(jù)庫
ibase_errcode() - 返回一個(gè)錯(cuò)誤代碼
ibase_free_event_handler() - 取消一個(gè)已注冊的事件句柄
ibase_gen_id() - 遞增指定的發(fā)生器并返回其新值
ibase_maintain_db() - 在數(shù)據(jù)庫服務(wù)器上執(zhí)行一條維護(hù)命令
ibase_name_result() - 給結(jié)果集指定一個(gè)名字
ibase_num_params() - 返回一個(gè)準(zhǔn)備好的查詢的參數(shù)數(shù)目
ibase_param_info() - 返回一個(gè)準(zhǔn)備好的查詢的參數(shù)信息
ibase_restore() - 在服務(wù)管理器中發(fā)起一個(gè)還原任務(wù)并立即返回
ibase_rollback_ret() - 回卷一筆事務(wù)并保留事務(wù)上下文
ibase_server_info() - 請求有關(guān)數(shù)據(jù)庫服務(wù)器的統(tǒng)計(jì)信息
ibase_service_attach() - 連接到服務(wù)管理器
ibase_service_detach() - 從服務(wù)管理器斷開
ibase_set_event_handler() - 注冊一個(gè)當(dāng)事件發(fā)布時(shí)要調(diào)用的回調(diào)函數(shù)
ibase_wait_event() - 等待數(shù)據(jù)庫發(fā)布一條事件
iconv:
iconv_mime_decode() - 解碼 MIME 頭信息字段
iconv_mime_decode_headers() - 一次解碼多個(gè) MIME 頭信息字段
iconv_mime_encode() - 壓縮 MIME 頭信息字段
iconv_strlen() - 返回字符串中的字符計(jì)數(shù)
iconv_strpos() - 在堆棧中找到第一個(gè)出現(xiàn)的子串位置
iconv_strrpos() - 在堆棧中找到最后一個(gè)出現(xiàn)的子串位置
iconv_substr() - 從字符串中取出一部分
Streams:
stream_copy_to_stream() - 把一個(gè)流的數(shù)據(jù)復(fù)制到另一個(gè)流
stream_get_line() - 根據(jù)給定的分隔符中流中讀取一行
stream_socket_accept() - 接受一個(gè)由 stream_socket_server() 建立的 socket 連接
stream_socket_client() - 打開一個(gè) InterNET 或 Unix 域的 socket 連接
stream_socket_get_name() - 獲取本地或遠(yuǎn)程的 sockets 名字
stream_socket_recvfrom() - 從 socket 獲取數(shù)據(jù)(不管連接是否已經(jīng)建立)
stream_socket_sendto() - 向 socket 發(fā)送一個(gè)消息(不管連接是否已經(jīng)建立)
stream_socket_server() - 建立一個(gè) InterNET 或 Unix 域服務(wù)器的 socket
Date/Time:
idate() - 將本地進(jìn)間格式化為整數(shù)
date_sunset() - 計(jì)算所指定日期和地點(diǎn)的日落時(shí)間
date_sunrise() - T計(jì)算所指定日期和地點(diǎn)的日出時(shí)間
time_nanosleep() - 廷遲執(zhí)行程若干秒和若干納秒
Strings:
str_split() - 把一個(gè)字符串分割為數(shù)組
strpbrk() - 在一字符串中搜索給定的字符集合中的任意一個(gè)字符
substr_compare() - 以二進(jìn)制的形式比較兩個(gè)字符串,從第一個(gè)字符串的 offset 開始,直到到達(dá)長度為 length 時(shí)結(jié)束,可自定義是否大小寫敏感比較
Other:
convert_uudecode() - 解碼 uuencoded 的字符串
convert_uuencode() - 對字符串進(jìn)行 uuencode
curl_copy_handle() - 復(fù)制一個(gè) cURL 句柄及其所有參數(shù)
dba_key_split() - 把一個(gè)鍵分隔為字符串?dāng)?shù)組
dbase_get_header_info() - 取得 dBase 數(shù)據(jù)庫的頭部信息
dbx_fetch_row() - 獲取結(jié)果集中被設(shè)置為 DBX_RESULT_UNBUFFERED 的行
fbsql_set_password() - 修改指定用戶的密碼
file_put_contents() - 向一個(gè)文件內(nèi)寫入字符串
ftp_alloc() - 為準(zhǔn)備上傳的文件分配空間
get_declared_interfaces() - 以數(shù)組的形式返回所有已定義的接品
get_headers() - 獲取服務(wù)器響應(yīng) HTTP 請求時(shí)的所有頭部信息
headers_list() - 返回所有已發(fā)送或準(zhǔn)備發(fā)送響應(yīng)頭部列表
http_build_query() - 生成一個(gè)已經(jīng)過 URL 編碼的請求字符串
image_type_to_extension() - 根據(jù) getimagesize(), exif_read_data(), exif_thumbnail(), exif_imagetype() 所返回的 image-type 取得文件名后綴
imagefilter() - 對圖像應(yīng)用濾鏡
imap_getacl() - 獲取指定郵箱的 ACL
ldap_sasl_bind() - 使用 SASL 綁定到 LDAP 目錄
mb_list_encodings() - 以數(shù)組的形式返回所支持的全部字符集
pcntl_getpriority() - 獲得任意一個(gè)進(jìn)程的優(yōu)先級
pcntl_wait() - Waits on or returns the status of a forked child as defined by the waitpid() system call
pg_version() - 返回一個(gè)包含客戶端、協(xié)議和服務(wù)器版本的數(shù)組
php_check_syntax() - 檢查指定文件的語法
php_strip_whitespace() - 返回已經(jīng)去除注釋和空白的源代碼
proc_nice() - 修改當(dāng)前進(jìn)程的優(yōu)前級
pspell_config_data_dir() - 修改語言文件的位置
pspell_config_dict_dir() - 修改主要單詞列表的位置
setrawcookie() - 發(fā)送一個(gè)沒有經(jīng)過 url 編碼的 cookie 值
scandir() - 列中指定目錄中的所有子目錄和文件
snmp_read_mib() - 在一個(gè)可用的 MIB 樹中讀取和分板一個(gè) MIB 文件
sqlite_fetch_column_types() - 以數(shù)組的形式返回一張表中的列類型
注意: Tidy 擴(kuò)展庫的 API 也作了重大調(diào)整
五、新指令
php 5 在 php.ini 中引進(jìn)了一些新指令。列表如下:
mail.force_extra_parameters - 強(qiáng)制指定的參數(shù)附加值作為額外的參數(shù)傳遞給 sendmail 庫。這些參數(shù)總是會替換掉 mail() 的第 5 個(gè)參數(shù),即使在安全模式下
register_long_arrays - 允許/禁止 php 注冊已過時(shí)的 $HTTP_*_VARS 變量
session.hash_function - 選擇一種散列函數(shù)(MD5 或 SHA-1)
session.hash_bits_per_character - 定義將二進(jìn)制散列數(shù)據(jù)轉(zhuǎn)換為可讀格式時(shí)每個(gè)字符中儲存幾個(gè)位(從 4 到 6)
zend.ze1_compatibility_mode - 啟用 Zend Engline 1 代(php 4)兼容模式
六、數(shù)據(jù)庫
關(guān)于數(shù)據(jù)庫(MySQL 和 SQLite)在 php 5 中有些改變。
php 5 中不再綁定 MySQL 客戶端連接庫,因?yàn)槭跈?quán)和一些其它問題。
有個(gè)新擴(kuò)展庫 MySQLi(改良版 MySQL),設(shè)計(jì)用來工作于 MySQL 4.1 及更高版本之下。
自 php 5 起,SQLite 擴(kuò)展庫內(nèi)置在 php 中。SQLite 是一個(gè)可嵌入 SQL 數(shù)據(jù)庫引擎,不是客戶端連接庫用來連接大型數(shù)據(jù)庫服務(wù)器(如 MySQL 或 PostgreSQL)的。SQLite 庫直接讀寫磁盤上的數(shù)據(jù)庫文件。
七、新對象模型
php 5 中有個(gè)新對象模型(Object Model)。php處理對象的方式完全重寫了,允許更佳性能和更多特性。之前版本的 php,對象處理方式和原始類型(例如整型和字符串)相同。此方法的缺點(diǎn)是當(dāng)變量被賦值或作為參數(shù)傳遞給方法時(shí)語義上整個(gè)對象都被拷貝。在新方法中,對象通過句柄引用,而不是值(可以將句柄當(dāng)成是對象的標(biāo)識符)。
很多php程序員根本沒意識到舊的對象模型的這種拷貝怪癖,因此大多數(shù)php應(yīng)用程序拿來就能運(yùn)行,或者只做很小的修改。
新對象模型的文檔見“類與對象”。
php基礎(chǔ)知識:php4和php5的配置異同比較
配置php4或者php5的過程中,php4,5的配置的步驟大致一樣的,但是配置內(nèi)容有一些差別。在LINUX等環(huán)境下編譯,一般來說,只要編譯的選項(xiàng)正確,配置也就正確了;在windows配置則需要注意以下不同點(diǎn):
1. php4ts.dll 和 php5ts.dll 內(nèi)容來自中國站長資訊網(wǎng)(www.chinahtml.com)
這個(gè)文件要拷貝到apache的bin目錄下或者系統(tǒng)目錄下
2. httpd.conf 文件加載的模塊
示例如下:
# For php4 + apache1.x.xx
LoadModule php4_module d:/www/webserver/php4/sapi/php4apache.dll
AddType application/x-httpd-php .php 內(nèi)容來自中國站長資訊網(wǎng)(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是作為一個(gè)模塊加載的,需要設(shè)置php.ini來加載,例如
extension_dir = "D:/www/WebServer/php5/ext/"
extension=php_mysql.dl l
另外,php4,php5都需要系統(tǒng)目錄下的libmysql.dll的支持,如果版本不對,即使你設(shè)置了正確的extension_dir和php_mysql.dll的參數(shù),也會造成apache啟動(dòng)的時(shí)候提示phpp_mysql.dll找不到的錯(cuò)誤。
php技術(shù):php4與php5的區(qū)別小結(jié)(配置異同),轉(zhuǎn)載需保留來源!
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請第一時(shí)間聯(lián)系我們修改或刪除,多謝。