面向 PHP 5 3 友好的 PHP 開發

2021-08-30 22:48:57 字數 4058 閱讀 6720

最近 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...