话说paperen都N久没写东西了,这段时间都是在折腾,昨天才从广州折腾回来,感觉生活有时候真是很累很累……工作都是要求你会框架,会改造一些开源东东,确实自己这方面还是不行啊,oop这种思想也不经常使用,或许是自己懒吧,当习惯了以前那种编码风格后老是照着那种模式去编,而没有再去研究一些更好的方法,例如大家推荐的oop风格与框架开发。?

昨晚看了一些书,也得到了一些启发。其实对于php中类的概念与c++中的类是差不多的,应该说几乎一样吧,不过php的class不支持多重继承,书中说你可以使用接口去弥补,不过这里多余的东西就不多说了。?

记得paperen之前那篇解析自己是怎样写php网站的文章吧,思想是很简单的,统一入口index,在index页中判断传入的参数决定给予浏览者哪个页面与应该调用哪个相应的处理文件(一般都要写写.htaccess文件来完成网址重写的功能),例如首页是index.inc.php(这里就paperen我就叫处理文件吧)在这里面可以处理一些与数据库交互的操作与运算,然后再调用需要的文件(视图文件)index.tpl。

201003061267863979

一当我们将index.php页的代码写好后后面除非需要一些额外功能否则就不用动index.php的代码了,因为它只是作为统一的入口获得参数并转向相应的地方进行相应的处理,它只是一个入口,而使用这种方法来建设网站,很显然的重点在与index.inc.php这种处理文件,对于不同功能的页面差别也是在这里,比如对于网站首页你需要查取数据库中所有表的前五条数据,而对于关于板块中你需要查询某个表中的一些字段,那么其差异性就完全在index.inc.php与about.inc.php中体验出来了,而当然啦,你还需要扩展我们定义那个$m数组加入about键值的标题与mod值,而每个处理文件最后require的tpl文件也不一定相同,不过可以肯定的是都需要head.tpl与foot.tpl文件。?

而对于使用oop的思想去做的话,我们又应该怎去设计呢?对于一个网站肯定是得要分块去设计的,头部,脚部,正如上面那样分了head.tpl与foot.tpl的文件,因为整个网站肯定会有部分是相同的,我们不可能在每个文件中将这些重复的代码重写一遍,之后再考虑怎样实现不同页面的不同布局,不同标题,不同的数据操作。引入不同JavaScript文件与css文件。而paperen自己也写了一个这样的class,放出来仅供参考,其实与《php与mysql web开发》一书上放出来的例子差不多。(class.inc.php)

?class site
?{
??public $title,$jsarray,$cssarray,$body,$nav;
??public function set_title($title){
???$this->title=$title;
??}
??public function set_jsarray($jsarray){
???$this->jsarray=$jsarray;
??}
??public function set_cssarray($cssarray){
???$this->cssarray=$cssarray;
??}
??public function set_nav($nav){
???$this->nav=$nav;
??}
??public function set_body($body){
???$this->body=$body;
??}
??public function display(){
???global $p;
???$title=$this->title;
???$jsarray=$this->jsarray;
???$cssarray=$this->cssarray;
???$nav=$this->nav;
???require(TMP_PATH."head.tpl");
???if(!empty($this->body)){
????require(TMP_PATH.$this->body);
???}
???require(TMP_PATH."foot.tpl");
??}
?}
?>

定义了一些set函数用来往这个类中放不同的参数。(index.php的代码)

?require("include/common.inc.php");
?$s=new site;
?$s->set_title("test use oop");
?$s->set_jsarray(array('1'=>'js.js','2'=>'base.js'));
?$s->set_cssarray(array('1'=>'style.css'));
?$s->set_nav($temp);
?$s->set_body($tmp);
?$s->display();
?unset($s);
?>

common.inc.php代码

?define('SITE_URL','http://192.168.1.16/test/oop/');
?define('INC_PATH',dirname(__FILE__)."/");
?define('SITE_ROOT',INC_PATH."../");
?define('TMP_PATH',SITE_ROOT."templates/");
?define('JS',SITE_URL."js/");
?define('CSS',SITE_URL."css/");
?require(INC_PATH."class.inc.php");
?require(INC_PATH."fun.inc.php");
?$temp=array('index'=>'index.tpl.php','about'=>'about.tpl.php');
?new_addslashes(extract($_GET));
?$tmp=read_tmp();
?>

fun.inc.php代码

?function new_addslashes($string){
??if(!is_array($string)) return addslashes($string);
??foreach($string as $key => $val) $string[$key]=new_addslashes($val);
??return $string;
?}
?function read_tmp(){
??global $p,$temp;
??return isset($temp[$p]) ? $temp[$p] : $temp['index'];
?}
?>

201003061267865794

怎么paperen我觉得这样好像与不使用类去做的时候的思路差不多呢,区别或者出在第二步,如果使用oop将会产生一个对象去处理,我们需要往里面放入一些参数然后display它。?

或许是自己刚刚接触使用oop的思想去建设网站吧,其实许多地方都得完善一下(至少要检查一下参数的正确是否存在某个文件吧),对于以前的手法自己已经很熟了,所以突然转到使用面向对象的方法去做的话可能会真的需要一段时间去适应,而paperen我也承认自己是一个一旦适应了就很难改变的人=。=