【ThinkPHP】開發的一些建議

版本的選擇

目前分了 3.1和3.2版本,是不能直接升級到3.2的,3.2徹底基於5.3以上版本,代碼風格什麼的都改變了,最大的就是應用了「命名空間」的概念。我以前是作C#開發的因此對於我一點也不陌生,並且很堅持的支持這樣的升級,可是目前PHP的這種命名空間還不是很順手,根據版本命名來看應該是個過分版本。等下一次調整吧。php

不要使用內置的分頁

建議不要使用TP內置的分頁,內置的分頁把HTML也封裝到裏面了,雖然也能夠隨意修改HTML模板,可是該死的URL竟然是拼接來的,這限制了使用場景,其實利用模型的page很容易就能夠本身封裝一個分頁的,而我本身根本就沒把分頁封裝,直接暴露出來而後包含一個文件,直接在HTML裏面拼裝分頁,很靈活。前端

模型實例時請使用D方法mysql

官方說M方法快速高效但D方法才能夠使用一些高級的特性,例如在model中本身定義的一些方面必須經過D方法以後才能夠調用,sql

爲每一個模型創建類文件

便是爲每一張表創建xxxModle.class.php,這樣作雖然很麻煩可是實際過程當中頗有用,我我的習慣建一個公共的模型文件CommonModel.class.php,內置 _list_和 getOne方法,cookie

<?php
class CommonModel extends Model {
    public function _list_($map = array() ,$page = 1,$limit = 16, $orderby = "id desc"){
        $list['count'] = $this->where($map)->count('id');
        $list['page'] = $page;
        $list['map'] = $map;
        $list['limit'] = $limit;
        $pagecount = ceil($list['count'] / $list['limit']);
        if ($pagecount < 1) $pagecount =1;
        $list['pagecount'] = $pagecount;
        $vlist = $this->where($map)->page($page,$limit)->order("$orderby ")->select();
        $vvlist = array();
        foreach ($vlist as $k) {
            if (method_exists($this, 'ckvo')) {
                $vvlist[] = $this->ckvo($k);
            }else{
                $vvlist[] = $k;
            }
        }
        $list['volist'] = $vvlist;
        return $list;
    }
    public function getOne($map='')
    {
        $vo = $this->where($map)->order('id desc')->find();
        if (method_exists($this, 'ckvo')) {
            $vo = $this->ckvo($vo);
        }
        return $vo;
    }
}
?>

使用了page方法,而且返回了分頁全部必須的參數,這裏還建議儘可能不要使用TP的關聯方法,這裏我用ckvo方法代替了,性能

public function ckvo($vo='')
    {
    	if (!$vo) return;
    	$Comment = D('Comment');
    	$comment = $Comment->getAll($vo['id'],'Info');
    	if ($comment) {
            $vo['Comment'] = $comment;
        }
    	return $vo;
    }

這樣雖然屢次查詢了,但並不比TP的聯合查詢性能差,其實最終mysql解析二者原理都同樣的,關鍵是這樣我能夠任意組合也更方面查詢。優化

public function ckvo($vo = '')
    {
    	if (!$vo) return;
    	$LotteryItem = M('LotteryItem');
    	$map['lid'] = $vo['id'];
    	$vlist = $LotteryItem->where($map)->select();
    	for ($i=0; $i < 6; $i++) { 
    		$vo['Item'][$i] = $vlist[$i];
    	}
        if ($vo['status'] == 0) 
            $vo['status_text'] = "未開始";
        elseif ($vo['status'] == 1) 
            $vo['status_text'] = "報名中";
        elseif ($vo['status'] == 2) 
            $vo['status_text'] = "抽獎中";
        elseif ($vo['status'] == 3) 
            $vo['status_text'] = "抽獎結束";
    	return $vo;
    }

後臺請使用普通URL模式

若是後臺沒有其餘需求,請使用平臺URL模式即設置 URL_MODEL = 0,通常作URL優化是更好的方便收錄,但後臺都不想被收錄吧,這還不是最主要的,自定義模式的URL(非平臺模式)在結合前端開發的時候帶來很大的困擾,例如默寫時候須要jq對URL解析就很不方便判斷了,而且我發如今設置cookies的時候也會有路徑的問題(因此致使內置的cookie很很差使)總之儘可能使用普通URL模式。this

相關文章
相關標籤/搜索