当前位置:编程学习 > php >>

浅谈PHP代码设计结构

coding多年,各种代码日夜相伴,如何跟代码友好的相处,不光成为职业生涯的一种回应,也是编写者功力的直接显露。
如何看待程序和代码呢?
那就让我们从程序定义来谈起,
如果从业务最终呈现来看,一个程序可以看成是一个真实业务需求的逻辑代码映射。
如果从程序逻辑结构看,程序就是数据结构加算法的结合。
这样看,为满足更多的业务需求,更好的满足这些需求,就需要更多的程序代码,
当程序代码堆积达到一定数量后,如何管理好,整理好已有的代码将会成为一个只管重要的问题。这个也是一个程序员编程3~5后,从中级向更高级别探索的一个瓶颈。
满足需要可工作的代码是好的,可被多个需求不断复用的代码,就是更好的了。
随着软件设计的发展,代码的集合,功能逻辑不断向下沉淀封装的趋势越来越明确。
使用好一个工具很快,掌握好一种设计思想就要不断的尝试和改进了。
有专门处理数据的代码,有专门处理呈现的代码,如何在业务流程中管理配置他们?这些逻辑如何更好的被封装,被复用。
其实对于PHPer来说,这些思想在处理具体业务来说有些麻烦,这也是PHP的最大优势非常的自由方便,自由简单随意的基本语法,方便的连内存资源都不用考虑,很快就可以hello一个,
但这也正是PHP一个先天的重大劣势,没有一个系统的成脉络的设计体系,
PHP出生时就是一个单一的满足业务的语言,并没有像JAVA一样有很系统设计体系和原则。在JAVA有三个最基础的设计原则:1,不支持全局变量。2,不写万能类。3,代码必须是类封装。
JAVA的第一个,第三个原则是在语法上就限制了,第二个原则是评判一个JAVA程序员是否入门的标准。PHP相对来说就没什么这样的语法上的设计原则限制,可接触了一些big company真没有体系原则呀,哎,
但在我们设计思想里可不能真的没有原则呀!
PHP程序其实是怎么方便怎么来,解释器很强大,可以屏蔽包容各种思路的程序代码,只要语法OK,不在乎代码设计。
正因早期的PHP太随意了,入门很容易,不用很好的对代码进行有效的管理和方便的复用。
随着PHP的发展,PHP已经告别在PHP3~PHP4时代动态标记语言,但因为向上兼容原则,PHP还是一个语法宽松的语言,
系统化的程序设计原则还没有强制融入到语言核心中来。
这样并不代表我们不需要使用成熟的设计思想来完善和编写我们的程序代码。
JAVA的程序设计原理和代码积累,是JAVA的精髓,随着时间的积累越发明显。
将JAVA的程序设计思想,引入到PHP的编程过程中来。是一个完善PHP代码的很好的方法。
1,代码分级封装
2,文件灵活调用加载,资源随用随创建
3,平整抗老化的目录结构
解决这些能为程序编写过程,带来非常多的益处。
如何解决呢?
可以通过对于MVC设计思想进行的拆解封装,来实现清晰,有效,一致性的程序设计思想。
一个程序从逻辑结构上可看做是模型(Model),视图(View)和控制Controller)三个逻辑块。
在JAVA中Model层实现系统中的业务逻辑,通常可以用JavaBean或EJB来实现。 View层用于与用户的交互,通常用JSP来实现。Controller层是Model与View之间沟通的桥梁,通常是router servlet向应用端的扩展。
可 PHP 没有这样清晰的划分,所以需要将设计思想揉入到程序代码中去。
1,程序代码类封装
对于一个应用需求(ex: similar相似商品页),将需求先分为3个文件:similar.controller.php;similar.model.php.similar.view.php
通过名字我们也可以看出各文件中的代码用途,剩下就是要给各个文件中的类进行命名。
因为是这对一个应用的不同操作类,所以需要给各个类加不同的类目后缀,
例如similar.controller.php
//controller 控制程序类  完成此类中的方法是程序各页面流程,每一个方法对应一个同步请求页面(以配合页面的调用规则)
class similar{
//相似商品页的展现
functio do_opensearch($_param){
//请求参数过滤
//请求商品数据
//根据呈现规则处理商品数据
//渲染商品数据获取呈现html
//展示呈现html
}
}
对应的请求就是
http://s.etao.com/similar/opensearch/
similar.model.php
//model 数据操作程序类  完成对此应用的数据请求封装,返回结果的结构解析处理
class similarMODEL{
}
similar.view.php
//model 呈现操作程序类  完成对此应用的数据呈现封装,返回给已经处理好的
class similarVIEW{
    function view_getDetail($_goodDataArr){
        return $html;
    }
}
2,类调用
我们很清晰的将各个逻辑将不同代码封装在了不同文件和类中了。如何灵活的调用呢?PHP是一个解释语言,没有像JAVA和C一个的编译过程,无法享受编译语言,在预编译过程中的自动连接功能。
其实现在PHP解释器也已经意识到这个问题,并在5.3.1以后提出了autoload方法来解决,当解释器遇到一个非声明类或者函数时会自动运行autoload去再加载一次,如果还没有才报错。
详情参见 http://php.net/manual/en/language.oop5.autoload.php
但这样还是一个被动解决方案。下面提供一个主动动态加载方案。加入资源系统调动类
在讲解这个类的使用之前先看一下我们之前加载并使用一个类文件的过程:
文件:similar.controller.php
require_once PATH."similar.model.php";
$sModelObj = new similarMODEL;
$goodsData = $sModelObj->getGoodsInfoByNid($nid);
这是在过程中调用,如果在controller类内调用的话就需要写成这样,
require_once PATH."similar.model.php";
class similar{
public $_modelObj;
function __construct(){
$this->_modelObj = new similarMODEL;
}
//相似商品页的展现
functio do_opensearch($_param){
//请求商品数据
$goodsInfoArr = $this->_modelObj->getGoodsInfoByNid($nid);
}
}//end class
如果controller类需要使用另一个MODEL,例如forest,ha3什么的就要声明多个类内元素变量。如果利用PHP 的变量传导特性,建立一个资源调度类,来统一加载和调度需要的类并声明,使用起来就会方便很多。下面我们来详细的分解下这个资源调度类的设计,
public static function getObj($_appName,$_typeStr='class') {
 
if($_typeStr=='class'){
$className = $_appName;
}else{
$className = $_appName.strtoupper($_typeStr);
}
//资源对象已创建 直接返回使用
if( isset(self::$_modelObjArr[$className]) && is_object(self::$_modelObjArr[$className]) ){
return self::$_modelObjArr[$className;
}
//加载文件资源类文件
$file = dirname(__FILE__)."{$_appName}/{$_appName}.{$_typeStr}.php";
if( file_exists($file) ){
require_once $file;
if( class_exists($className) ){
return self::_createObj($className);
}else{
$errStr =  "no class {$className} in file {$file}"; //类名错误
}
} else {
$errStr = "no class file {$file}"; //类文件错误
}
self::_showErr($errStr);
}
//创建资源对象
public static function _createObj($_className){
if( isset(self::$_modelObjArr[$_className]) && is_object(self::$_modelObjArr[$_className]) ){
return self::$_modelObjArr[$_className];
}else{
self::$_modelObjArr[$_className] = new $_className();
return self::$_modelObjArr[$_className];
}
}
//错误提示
public static function _showErr($_errTypeStr=''){
echo $_errTypeStr;  exit;
//errorlog($_errTypeStr);
}
}//end class
改用Box资源调度类,加载类程序
文件:similar.controller.php
 /**
 * 加载指定类型的类程序
 **/
 class Box {
 //声明一个进程内资源对象池
 public static $_modelObjArr;
 //获取一个资源对象
 class similar{
function __construct(){
 }
 //相似商品页的展现
 functio do_opensearch($_param){
 //请求商品数据
 $goodsInfoArr = Box::getObj('similar','model')->getGoodsInfoByNid($nid);
 $html = Box::getObj('similar','view')->view_getDetail($goodsInfoArr);
 //其他已封装好的数据逻辑
 $hotHtml = $this->_getHotHtml();
 }
 function do_search($_param){
 $goodsInfoArr = Box::getObj('similar','model')->getGoodsInfoByNid($nid);
 $html = Box::getObj('similar','view')->view_getDetail($goodsInfoArr);
 }
 function _getHotHtml(){
 $hotInfoArr = Box::getObj('similar','model')->getGoodsInfoByNid($nid);
 $html = Box::get

补充:Web开发 , php ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,