`
yushine
  • 浏览: 201390 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

面向 PHP 5.3 友好的 PHP 开发

    博客分类:
  • PHP
阅读更多


最近 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
分享到:
评论

相关推荐

    AIX5.3中使用Java和PHP开发

    总的来说,这篇文章为AIX 5.3的开发者提供了一条途径,让他们能够利用Java和PHP的互补特性,开发出既稳定又具有用户友好界面的Web应用程序。通过学习和实践,开发者可以提升自己的技能,适应不断变化的IT需求,为...

    appfuel:面向PHP 5.3+的全栈面向对象框架

    **AppFuel:面向PHP 5.3+的全栈面向对象框架** AppFuel是一个专为PHP 5.3及以上版本设计的全栈、面向对象的框架,它旨在提供一个高效、灵活且易于使用的开发环境,以加速Web应用程序的构建过程。在PHP的世界里,...

    基于PHP的vodStudio视频点播系统for5.3.xGBK源码.zip

    PHP是一种广泛用于Web开发的开源脚本语言,以其易学、高效和跨平台的特性深受开发者喜爱。在这个项目中,PHP被用来处理用户请求,实现视频内容的存储、管理和分发。 在描述中,"vodStudio"是这个点播系统的名称,...

    ThinkPHP5为API开发而设计的高性能PHP框架

    在架构方面,ThinkPHP5采用了全新的命名空间(Namespace)实现,这是PHP 5.3引入的重要特性,使得代码组织更加清晰,降低了类名冲突的可能性。同时,框架的核心部分进行了深度优化,减少了对外部库的依赖,使得整体...

    php-5.4.28.tar.gz

    7. ** 开发环境与生产环境 **:PHP 5.4对开发环境和生产环境的支持更加友好,例如错误报告的级别可以区分,帮助开发者调试代码而不影响线上服务。 8. ** MySQLi 和 PDO_MySQL **:这两个数据库扩展在5.4版本中默认...

    php-5.4.0alpha1.tar.zip

    总结来说,PHP 5.4.0alpha1的发布,不仅展示了PHP语言在功能上的持续创新,还体现了对开发者友好性的增强。通过命名空间、Traits、短数组语法等新特性,它提升了代码的可维护性和开发效率。同时,内置Web服务器和...

    Purl一个PHP53简单的面向对象URL处理库

    Purl是一个专为PHP5.3设计的轻量级、面向对象的URL处理库,由James Wagner开发。它提供了一种优雅的方式来解析、操作和构建URLs,使得在处理网络请求、网页爬虫或者任何需要与URL打交道的场景下,工作变得更加简单和...

    phpstudy的安装包

    1. **多版本支持**:PHPStudy支持多种版本的PHP和Apache,用户可以根据项目需求自由切换PHP版本,如PHP5.2、PHP5.3到PHP7.x等,同时也可以在不同版本的Apache之间进行选择。 2. **一键安装**:PHPStudy提供了简单...

    PHP介绍.docx

    PHP的语法简洁明了,对初学者非常友好。它支持多种数据类型,如字符串、整型、浮点型、数组、对象等,同时提供了丰富的内置函数,使得开发人员可以快速地完成各种任务。例如,使用`echo`或`print`输出内容,`include...

    PHP编码规范—php编程必学

    10. **命名空间**:从PHP 5.3版本开始引入命名空间,用于解决类名冲突问题,如`use`关键字导入命名空间。 11. **单元测试**:编写测试用例,使用PHPUnit等工具进行单元测试,确保代码质量。 12. **编码格式**:...

    php源码:gallery-3.0.9图片管理

    - **核心框架**:Gallery的核心框架基于PHP,采用面向对象编程,保证了系统的稳定性和可扩展性。 - **前端界面**:使用HTML、CSS和JavaScript构建,响应式设计适应各种设备。 - **图像处理库**:内置图像处理库如...

    Laravel开发-glottos

    【Laravel开发-glottos】是一个基于PHP 5.3框架的在线翻译和本地化系统,专为开发者设计,帮助他们轻松地管理应用程序中的多语言内容。Laravel框架以其优雅的语法、强大的功能和对开发者友好性而闻名,使得构建这样...

    宁工“微生活”网站设计与开发比设计毕业设计论文.doc

    通过以上设计和开发,最终实现了用户体验友好、界面设计美观、功能完备的“宁工微生活”网站。同时,通过与微信的对接,扩展了更多实用性强的功能,如通过微信接收通知、进行校园服务的快捷操作等,进一步增强了网站...

    UCHOME二次开发详细说明

    ##### 5.3 插件开发 - **插件架构**:UCHOME支持插件化开发,通过编写插件可以扩展原有功能。 - **插件开发流程**:首先需要了解插件的基本结构,然后按照规范编写代码并安装到系统中。 ##### 5.4 API接口调用 ...

    ThinkPHP3完整版

    - 命名空间:引入了PHP5.3的命名空间机制,便于类库组织和加载。 - 自动加载:通过__autoload函数自动加载类库,简化了类文件的管理。 2. **路由系统** - URL路由:ThinkPHP3提供了灵活的URL路由规则,可以...

    thinkphp3.0完全中文开发手册

    ThinkPHP 3.0 是一款基于 PHP 的轻量级 MVC 框架,它旨在简化 PHP 应用程序的开发过程,提高开发效率并增强代码的可维护性。ThinkPHP 3.0 支持多种数据库,并提供了丰富的功能,如自动验证、自动完成、模型方法等。 ...

    Co.MZ 企业系统 v1.1.0

    运行环境:PHP5.3+, MySQL5.0各种设备自适应响应式的网站设计能够对用户产生友好度,并且对于不同的分辨率能够灵活的进行操作应用。 简洁通俗表达就是页面宽度可以自适应屏幕大小,一个网站PC、手机、PAD通吃,页面...

Global site tag (gtag.js) - Google Analytics