发布时间:2018-04-11 编辑:钰歆博客 阅读(593)
参照:http://www.thinkphp.cn/topic/44951.html
PHP中面向过程和面向对象只是两种不同的编程选择,各自有着优缺点,
我们可以想象, Web 页面的解析本身就很过程化,在 HTML 中嵌入面向过程处理的代码是非常自然的手段。
【tp3.2框架本身就是MVC分离就在做着面向对象编程工作,只是我们在开发的时候有时候喜欢把不同的业务逻辑都写入同一个控制器里面,
这有点违背面向对象编程,容易让人觉得不好维护,所以适当的把不同的业务逻辑归纳进不同的类里面,互相调用来编程。】
面向过程:
开发周期短,发布快,效率较高
面向对象:
开发周期长,效率较低但易于维护,改进,扩展和开发 API
最明显的地方是代码功能更加清晰:
数据处理,用户登陆,内容呈现等各写成一个类,在页面中只需包含这些类、实例化对象,
然后再用简洁的语句应用对象就行,这与面向过程中把数据处理,用户登陆,还有内容等部分写在一起相比,
前者的编程思路肯定更加清晰和易于理解,相信团队开发中应该更为偏向于面向对象编程。
例子:
在处理表单或接受 url 参数时,为了防止 SQL 注入等问题, PHP 开发者常常需要过滤字符串。
在面向过程的方式中,我们会在需要过滤字符串的语句中调用各种过滤字符串的库函数或自定义函数,
这样下来,页面中就会出现很多不同的过滤函数甚至还有复杂的正则表达式,即使在页面中写了足够的注释难免还是比较混乱,
下面看看面向对象的处理方式。
首先是定义了一个简单的处理字符串的类,把各种复杂的字符串处理写成方法
<?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 面向过程编程的开发者不妨换种思路,试试面向对象
标签: