面向 PHP 5.3 的 PHP 開發——DEPRECATED

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 的分隔符號。

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 即可實現相關功能

在代碼中查抄過時函數

下面這個腳本可以用於在代碼樹中查找過時的 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
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Fix `ereg is deprecated` errors in PHP 5.3

If you upgraded to PHP 5.3, chances are high you’re going to run into a few warnings or deprecated function messages.
An example is the ereg family of functions, which are gone for good, as they were slower and felt less familiar than the alternative Perl-compatible preg family.

To migrate ereg():

ereg('/.([^/.]*$)', $this->file_src_name, $extension);

becomes

preg_match('//.([^/.]*$)/', $this->file_src_name, $extension);

Notice that I wrapped the pattern (/.([^/.]*$)) around / /, which are RegExp delimiters. If you find yourself escaping / too much (for an URL for example), you might want to use the # delimiter instead.

To migrate ereg_replace():

$this->file_dst_name_body = ereg_replace('[^A-Za-z0-9_]', '', $this->file_dst_name_body);

becomes

$this->file_dst_name_body = preg_replace('/[^A-Za-z0-9_]/', '', $this->file_dst_name_body);

Again, I just added delimiters to the pattern.
If you are using eregi functions (which are the case-insensitive version of ereg), you’ll notice there’re no equivalent pregi functions. This is because this functionality is handled by RegExp modifiers.

Basically, to make the pattern match characters in a case-insensitive way, append i after the delimiter:

eregi('/.([^/.]*$)', $this->file_src_name, $extension);

becomes

preg_match('//.([^/.]*$)/i', $this->file_src_name, $extension);

Related posts:

  1. Append your blog description to the window title in Wordpress I wanted my homepage title to reveal my writing goals...

 

Related posts brought to you by Yet Another Related Posts Plugin.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章