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找不到的錯誤。