最近 debian 的 testing 版本已經將 php 由 5.2.x 公升級 為 5.3.1。php 5.3 開始,為了更好的向 php 的未來版本(php6) 過渡,將未來不再支援的函式標記為 deprecated。在**中使用這些函式,將毫不留情的在頁面中顯示警告資訊:「使用了過時的函式…」,諸如此類。
那麼如何面向未來,讓現有的 php 程式平滑的向下一代 php 引擎過渡呢?
配置檔案遷移
php 5.3 開始,配置檔案 php.ini 中的一些配置將會在 php 執行時顯示過時警告,這些配置將在 php6中不再存在,相關功能也將關閉。
1. define_syslog_variables
2. register_globals
3. register_long_arrays
4. safe_mode
5. magic_quotes_gpc
6. magic_quotes_runtime
7. magic_quotes_sybase
函式遷移
涉及到的主要的函式遷移如下:
刪除函式 define_syslog_variables 引用
* 刪除對函式 define_syslog_variables 的引用
* 將變數 $log_err, $log_user 等用常量 log_user, log_user, … 替代
ereg, eregi 函式用 preg_match 函式替代
* 這幾個函式的函式宣告
int ereg ( string $pattern , string $string [, array &$regs ] )
int eregi ( string $pattern , string $string [, array &$regs ] )
int preg_match ( string $pattern , string $subject [, array &$matches [, int $flags [, int $offset ]]] )
* 雖然三者的第乙個引數都是字串,表示乙個正規表示式。但是 preg_match 用的是 pcre(perl 相容的正規表示式語法):正規表示式的兩端用乙個符號做邊界,如 「/pattern/」 或者 「#pattern#」
* eregi 是乎略大小寫的匹配,轉換為 preg_match,第乙個引數,用pcre的引數來乎略大小寫,如:」/pattern/i」 或者 「#pattern#i」
* 兩者的第三個引數返回的匹配的資料結構不同。ereg 的第三個引數在呼叫結束後,返回的是乙個字串陣列,分別為完整匹配字串和各個子匹配字串。preg_match 返回的是二維陣列,相當於 ereg 的字串陣列中的字串在 preg_match 是乙個陣列,分別儲存匹配值以及匹配位置。
* 如果要進行多次匹配,php 提供了 preg_match_all 函式,其第三個引數的返回值則是乙個三維陣列;
ereg_replace, eregi_replace 函式用 preg_replace 函式或者 str_replace 函式來替代
* 和前面的 ereg 替換為 preg_match 類似,第乙個引數要進行轉換,頭尾增加乙個符號,如:」/pattern/」 或者 「#pattern#」, …
* eregi_replace 到 preg_replace 的替換,在第乙個引數的後面增加正規表示式引數。如:」/pattern/i」 或者 「#pattern#i」, …
* 如果 ereg_replace 的第乙個引數不是正規表示式,可以用 str_replace 直接來替換。
split, spliti 函式用 explode 或則 preg_split 函式替代
* split 切分字串,如果無須用到正規表示式,使用 explode 替換是最好不過,速度最快
* 對於使用正規表示式切分字串,則使用 preg_split 函式替代。替代過程和 ereg/ereg_replace 類似,只是在第乙個正規表示式引數中做文章,將 split 的正規表示式前後加上乙個 pcre 的分隔符號。
* split 轉換為 explode 最容易出錯。例如:
o split(「\ 「, $string) 不能替換為 explode(「\ 「, $string),而是替換為 explode(」 「, $string);
o split(「\.」, $string) 不能替換為 explode(「\.」, $string),而是替換為 explode(「.」, $string);
o split(「\/」, $string) 不能替換為 explode(「\/」, $string),而是替換為 explode(「/」, $string);
mysql_db_query 函式用 mysql_select_db 和 mysql_query 函式替代
* mysql_db_query 在未來版本不再支援
* 將其轉換為兩次呼叫,分別是用 mysql_select_db 選擇資料庫,用 mysql_query 來執行 sql 查詢
mysql_escape_string 函式用 mysql_real_escape_string 函式替代
* mysql_escape_string 未來版本不再支援
* 使用 mysql_real_escape_string 替代
session_register 函式,session_unregister,session_is_registered 函式用 $_session 全域性變數替代
* 這三個 session 相關函式未來不再支援
* 其功能相當於直接操作全域性陣列 $_session。可以直接向陣列中賦值或者執行相應的 unset 即可實現相關功能
函式引用傳參的過時語法
如果在函式呼叫時使用引用傳參,會引發警告:
call-time pass-by-reference has been deprecated
解決方法:
* 在函式宣告部分,對需要引用傳參的引數用 & 符號標識。如:
function some_func( $var, &$ref_var )
* 呼叫該函式時,不要再對引用傳參的引數新增 & 修飾符,因為函式宣告中已經宣告過了。例如:
some_func("user name", $email);
在**中查抄過時函式
下面這個指令碼可以用於在**樹中查詢過時的 php 函式
#!/bin/sh
opts="-rhw"; verbose=0
while [ $# -gt 0 ]; do
case $1 in
-v)verbose=1; shift ;;
-q)verbose=0; shift ;;
-*)opts="$opts $1"; shift ;;
*)break; ;;
esac
done
if [ $# -eq 0 ]; then
echo "usage $0 [-v] "
exit 1
fi[ $verbose -eq 0 ] && opts="$opts -l"
deprecated="call_user_method call_user_method_array define_syslog_variables
dl set_magic_quotes_runtime magic_quotes_runtime
set_socket_blocking sql_regcase
mysql_db_query mysql_escape_string
session_register session_unregister session_is_registered
eregi? eregi?_replace spliti?"
opts="$opts --include=*.inc --include=*.php --include=*.php5"
for item in $deprecated; do
echo "##### find deprecated item: $item in $1: #####"
grep $opts -e "$item\s*$" $*
grep $opts -e "$item\s*\(" $*
echo ""
done
php5 3管理操作
php 5.3.3 中 php fpm 的重啟 終止操作命令 php 5.3.3 原始碼中已經內嵌了 php fpm,不用象以前的php版本一樣專門打補丁了,只需要在configure的時候新增編譯引數即可。關於php fpm的編譯引數有 enable fpm with fpm user www w...
php5 3使用手冊,php5 3 注意事項說明
php5.3 新特性1.支援命名空間 namespace 5.3以前 class zend db table select 表示當前這個類檔案位於zend db table下 5.3namespace zend db table class select 2.支援延遲靜態繫結5.3以前 class ...
php5 3使用手冊,php5 3 注意事項說明
本篇文章是對php5.3中需要注意的一些事項進行了詳細的分析介紹,需要的朋友參考下 php5.3 新特性1.支援命名空間 namespace 5.3以前 class zend db table select 表示當前這個類檔案位於zend db table下 5.3namespace zend db...