设为首页 收藏本站
查看: 800|回复: 0

[经验分享] 面向 PHP 5.3 友好的 PHP 开发

[复制链接]

尚未签到

发表于 2017-3-24 12:25:37 | 显示全部楼层 |阅读模式
最近 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

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-354659-1-1.html 上篇帖子: php eclipse xdebug 开发环境搭建 下篇帖子: PHP获取客户端、PHP获取服务器相关信息
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表