简单理解PHP的面向对象编程方式


Posted in PHP onMay 17, 2016

与大多数可以面向对象的编程语言不一样, PHP 是同时支持面向过程和面向对象的编程方式, PHP 开发者可以在面向过程和面向对象二者中自由选择其一或是混合使用,不过由于在 PHP5 之前的版本中, PHP 主要还是面向过程的编程语言,因此大多时候 PHP 开发者应该还是选择面向过程的方式进行开发,事实上, Kayo 认为即使一个 PHP 开发者完全不使用面向对象,他也能开发出很出色的 PHP 程序,我们可以想象, Web 页面的解析本身就很过程化,在 HTML 中嵌入面向过程处理的代码是非常自然的手段,因此不能说面向对象是一种比面向过程更加优秀的编程方式,只是另一种编程选择,当然这里说的是 PHP 中的情况。

对于 PHP 中面向过程和面向对象各自的优缺点,相信在网上稍查一下就会很清楚了,面向过程开发周期短,发布快,效率较高,面向对象开发周期长,效率较低但易于维护,改进,扩展和开发 API 。显然易见,我们很难说哪一个方式会更优秀,与其争论哪一种编程方式更优秀,不如尽量发挥出两种编程方式各自的优势。

回到 PHP 的面向对象编程,在使用面向对象的过程中还是很容易就感受到它的优势,最明显的地方是代码功能更加清晰,数据处理,用户登陆,内容呈现等各写成一个类,在页面中只需包含这些类、实例化对象,然后再用简洁的语句应用对象就行,这与面向过程中把数据处理,用户登陆,还有内容等部分写在一起相比,前者的编程思路肯定更加清晰和易于理解,相信团队开发中应该更为偏向于面向对象编程。

下面举一个简单的例子说明一下面向过程和面向对象两种方式各自的优缺点

在处理表单或接受 url 参数时,为了防止 SQL 注入等问题, PHP 开发者常常需要过滤字符串。

在面向过程的方式中,我们会在需要过滤字符串的语句中调用各种过滤字符串的库函数或自定义函数,这样下来,页面中就会出现很多不同的过滤函数甚至还有复杂的正则表达式,即使在页面中写了足够的注释难免还是比较混乱,下面看看面向对象的处理方式。

首先是定义了一个简单的处理字符串的类,把各种复杂的字符串处理写成方法(关于 PHP 面向对象的知识可以 Google ,本文不另外叙述。)

<?php 
/* 字符串处理类
 * 参数$length用作判断字符串是否超过指定长度
 * 转义 SQL 语句中使用的字符串中的特殊字符
 * 正则限制字符串内只能为数字
 * 判断字符串是否为空
 * 判断字符串长度
 
*/
 
// 创建字符串处理类
class StringFiltration {
 
  // 属性
  var $length;
 
  // 方法
  // 构造方法
  function __construct($the_length = NULL){
    $this->length = $the_length;
  }
  // 转义 SQL 语句中使用的字符串中的特殊字符
  function realEscapeString($the_string){
    return mysql_real_escape_string($the_string);
  }
   
  // 正则限制字符串内只能为数字
  function eregNumber($the_string){
    if( ereg("^[0-9]+$",$the_string) )
      return true;
    else
      return false;
  }
   
  // 判断字符串是否为空
  function strlenString($the_string){
    return strlen($the_string);
  }
   
  // 判断字符串长度
  function ifOverStrlenLength($the_string){
    if( strlen($the_string) > $this->length )
      return true;
    else
      return false;
  }
 
}
 
?>

然后在需要过滤字符串的页面中实例化该类

$string = new StringFiltration();

接着在过滤或判断字符串时调用类中定义好的方法,于是页面中会出现一些调用方法的语句。

$email = $string->realEscapeString($_POST['email']);
$postId = $string->eregNumber($id);

 
在上面的例子中,我们可以看到,在面向对象处理字符串之前,我们必须定义一个类,然后再在需要的页面中实例化这个类并调用这个类中的方法,这里看来,面向对象的效率相比面向过程是低了,而且也很麻烦,不过这样的优势也很明显,实际处理或判断字符串的语句都写在类的内部,在调用方法的页面并不会出现各种复杂的自定义函数和诸如正则表达式这样复杂的语句,页面的结构乃至整个网站的结构更加清晰了,并且在写好一个类后,日后进行 PHP 开发时都可以再使用这个类,从长远来看效率反而高了。因此一直都在进行 PHP 面向过程编程的开发者不妨换种思路,试试面向对象。

PHP 相关文章推荐
php入门之连接mysql数据库的一个类
Apr 21 PHP
PHP 输出URL的快捷方式示例代码
Sep 22 PHP
php中的路径问题与set_include_path使用介绍
Feb 11 PHP
PHP把空格、换行符、中文逗号等替换成英文逗号的正则表达式
May 04 PHP
php通过隐藏表单控件获取到前两个页面的url
Sep 09 PHP
laravel安装zend opcache加速器教程
Mar 02 PHP
PHP实现的QQ空间g_tk加密算法
Jul 09 PHP
[原创]php求圆周率的简单实现方法
May 30 PHP
php使用FFmpeg接口获取视频的播放时长、码率、缩略图以及创建时间
Nov 07 PHP
php通过pecl方式安装扩展的实例讲解
Feb 02 PHP
laravel实现Auth认证,登录、注册后的页面回跳方法
Sep 30 PHP
Laravel 自定命令以及生成文件的例子
Oct 23 PHP
WordPress中的shortcode短代码功能使用详解
May 17 #PHP
CodeIgniter生成静态页的方法
May 17 #PHP
CodeIgniter连贯操作的底层原理分析
May 17 #PHP
CI框架常用方法小结
May 17 #PHP
CodeIgniter记录错误日志的方法全面总结
May 17 #PHP
CI框架整合widget(页面格局)的方法
May 17 #PHP
深入剖析浏览器退出之后php还会继续执行么
May 17 #PHP
You might like
第十三节 对象串行化 [13]
2006/10/09 PHP
深入mysql_fetch_row()与mysql_fetch_array()的区别详解
2013/06/05 PHP
输入值/表单提交参数过滤有效防止sql注入的方法
2013/12/25 PHP
laravel 5 实现模板主题功能
2015/03/02 PHP
Android App中DrawerLayout抽屉效果的菜单编写实例
2016/03/21 PHP
给jQuery方法添加回调函数一款插件的应用
2013/01/21 Javascript
js获取滚动距离的方法
2015/05/30 Javascript
JQuery入门基础小实例(1)
2015/09/17 Javascript
使用javaScript动态加载Js文件和Css文件
2015/10/24 Javascript
基于JS代码实现图片在页面中旋转效果
2016/06/16 Javascript
微信JS-SDK自定义分享功能实例详解【分享给朋友/分享到朋友圈】
2016/11/25 Javascript
前端JS面试中常见的算法问题总结
2016/12/23 Javascript
详解Vue组件之间的数据通信实例
2017/06/17 Javascript
在Vue中如何使用Cookie操作实例
2017/07/27 Javascript
vuejs 单文件组件.vue 文件的使用
2017/07/28 Javascript
Bootstrap Table 在指定列中添加下拉框控件并获取所选值
2017/07/31 Javascript
Vue 页面跳转不用router-link的实现代码
2018/04/12 Javascript
vue实现Excel文件的上传与下载功能的两种方式
2019/06/28 Javascript
vue+koa2搭建mock数据环境的详细教程
2020/05/18 Javascript
[01:30:15]DOTA2-DPC中国联赛 正赛 Ehome vs Aster BO3 第二场 2月2日
2021/03/11 DOTA
Python实现partial改变方法默认参数
2014/08/18 Python
Python 解决中文写入Excel时抛异常的问题
2018/05/03 Python
Python3 SSH远程连接服务器的方法示例
2018/12/29 Python
Python利用itchat库向好友或者公众号发消息的实例
2019/02/21 Python
Python实现的服务器示例小结【单进程、多进程、多线程、非阻塞式】
2019/05/23 Python
Python使用PyQt5/PySide2编写一个极简的音乐播放器功能
2020/02/07 Python
html5 标签
2009/07/16 HTML / CSS
html5写一个BUI折叠菜单插件的实现方法
2019/09/11 HTML / CSS
世界领先的在线地板和建筑材料批发商:BuildDirect
2017/02/26 全球购物
特教教师先进事迹
2014/05/21 职场文书
学校交通安全责任书
2014/08/25 职场文书
大学生实训报告总结
2014/11/05 职场文书
表扬稿范文
2015/01/17 职场文书
联谊会开场白
2015/06/01 职场文书
关于Javascript闭包与应用的详解
2021/04/22 Javascript
如何解决flex文本溢出问题小结
2022/07/15 HTML / CSS