PHP開發(fā)框架比較
Laravel 是一個簡單優(yōu)雅的 PHP WEB 開發(fā)框架,將你從意大利面條式的代碼中解放出來。通過簡單,、優(yōu)雅、表達式語法開發(fā)出很棒的 WEB應(yīng)用!
開發(fā)運行效率示例:下面的例子分別利用三種框架做了個數(shù)據(jù)插入到Mysql數(shù)據(jù)庫并查詢輸出的示例,,示例只是實現(xiàn)基本的增加查詢功能并沒有進行數(shù)據(jù)校驗,。下面的例子中將展示不同框架代碼量的,公平起見運行效率的統(tǒng)計方法沒有用框架底層的調(diào)試類而是采用原生的php方法計算運行時間和內(nèi)存使用量: 數(shù)據(jù)表:CREATE TABLE `test_article` ( `id` int(11) NOT NULL auto_increment COMMENT '主鍵', `title` varchar(255) default NULL COMMENT '標(biāo)題', `content` text COMMENT '內(nèi)容', `updated_at` datetime default NULL, `created_at` datetime default NULL, --laravel必須這兩個字段(和Rails的一模一樣) PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
代碼量展示:laravel:視圖:新增頁面: <!doctype html> <html> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> <title>測試新增</title> </head> <body> <?php echo Form::open('test/new','POST');?> 標(biāo)題:<?php echo Form::text('title',$title);?> 內(nèi)容:<?php echo Form::text('content',$content);?> <?php echo Form::submit('提交');?> <?php Form::token()?> <?php echo Form::close();?> </body> </html> 如果要實現(xiàn)表單自動填充的話還是要手動指定的有些麻煩 新增成功頁: <!doctype html> <html> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> <title>保存成功</title> </head> <body> <h1>保存成功</h1> </body> </html>
展示頁面: <!doctype html> <html> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> <title>顯示數(shù)據(jù)</title> </head> <body> 標(biāo)題:<?php echo $title?><br/> 內(nèi)容:<?php echo $content?><br/> </body> </html>
模型:<?php class Article extends Eloquent { public static $table = 'test_article';
}
控制器:<?php class Test_Controller extends Base_Controller {
/** * 頁面展示 */ public function action_init() { return View::make('test.new'); } /** * 保存數(shù)據(jù) */ public function action_new() { $title = Input::get('title'); $content = Input::get('content'); $article = new Article; $article->title = $title; $article->content = $content; $article->save(); return View::make('test.success'); }
/** * 顯示數(shù)據(jù) */ public function action_show($id) { $article = Article::find($id); return View::make('test.show',array('title'=>$article->title,'content'=>$article->content)); }
} CodeIgniter:視圖:新增頁面: <!doctype html> <html> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> <title>測試新增</title> </head> <body> <?php $this->load->helper('form');?> <?php echo form_open('test/tonew'); ?> 標(biāo)題:<?php echo form_input('title');?> 內(nèi)容:<?php echo form_input('content');?> <?php echo form_submit('mysubmit', '提交');?> </form> </body> </html>
同樣的表單自動填充也不省事,不對稱的標(biāo)簽格式總讓人心里不舒服 新增成功頁: <!doctype html> <html> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> <title>保存成功</title> </head> <body> <h1>保存成功</h1> </body> </html>
展示頁面: <!doctype html> <html> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> <title>顯示數(shù)據(jù)</title> </head> <body> 標(biāo)題:<?php echo $title?><br/> 內(nèi)容:<?php echo $content?><br/> </body> </html>
模型:
<?php class Article_model extends CI_Model {
/** * 構(gòu)造函數(shù) */ public function __construct() { $this->load->database(); } /** * 新增函數(shù) */ public function to_new() { $data = array( 'title' => $this->input->post('title'), 'content' => $this->input->post('content') ); return $this->db->insert('test_article', $data); } /** * 查詢一條數(shù)據(jù) * @param $id */ public function show_one($id) { $query = $this->db->get_where('test_article', array('id' => $id)); return $query->row_array(); }
} 無論怎樣類初始化后DB連接就建立了,,而且數(shù)據(jù)查詢很不方便,,完全拋棄了POJO類的概念,要手動加屬性這點開發(fā)效率上是無法和YYUC和laravel相比的,。 控制器:<?php class Test extends CI_Controller { /** * 構(gòu)造函數(shù) */ public function __construct() { parent::__construct(); $this->load->model('article_model'); }
/** * 頁面展示 */ public function init() { $this->load->view('test/new'); } /** * 保存數(shù)據(jù) */ public function tonew() { $this->article_model->to_new(); $this->load->view('test/success'); } /** * 顯示數(shù)據(jù) */ public function show($id) { $data = $this->article_model->show_one($id); $this->load->view('test/show',$data); } } YYUC:視圖:新增頁面: <!doctype html> <html> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> <title>測試新增</title> </head> <body> <form action="new.html" method="post"> 標(biāo)題:{$article->text('title')} 內(nèi)容:{$article->text('content')} <button type="submit">提交</button> {tk()} </form> </body> </html>
新增成功頁: <!doctype html> <html> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> <title>保存成功</title> </head> <body> <h1>保存成功</h1> </body> </html>
展示頁面: <!doctype html> <html> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> <title>顯示數(shù)據(jù)</title> </head> <body> 標(biāo)題:{h $article->title}<br/> 內(nèi)容:{h $article->content}<br/> </body> </html> 安全起見,,視圖中轉(zhuǎn)義要輸出的字符 模型:簡單的數(shù)據(jù)處理,沒有驗證,、虛擬字段填充與回填,、復(fù)雜數(shù)據(jù)計算等操作,使用自動模型構(gòu)建就好,,所以完全沒必要自定義模型 控制器:初始化和新增: if(Request::post()){ //數(shù)據(jù)提交 $article = new Model('article'); if($article->load_from_post()->save()){ Page::view('success'); } }else{ //初始化顯示 $article = new SampleModel('article'); } 數(shù)據(jù)顯示: $article = new Model('article'); if(!is_numeric(get(1)) || !$article->find(get(1))->has_id()){ //數(shù)據(jù)不合法或者不存在跳轉(zhuǎn)到404頁面 上兩個框架判斷起來稍顯麻煩就沒寫 如果有這種情況上兩個框架會直接拋異常的 goto_404(); } 已經(jīng)自動集成阻止跨站提交模塊 性能消耗:三個框架均設(shè)置為生產(chǎn)模式,。 laravel:新增展示: 內(nèi)存使用情況: 數(shù)據(jù)保存: 內(nèi)存使用情況: 數(shù)據(jù)顯示: 內(nèi)存使用情況:
CodeIgniter:新增展示: 內(nèi)存使用情況: 數(shù)據(jù)保存: 內(nèi)存使用情況: 數(shù)據(jù)顯示: 內(nèi)存使用情況:
YYUC:新增展示: 內(nèi)存使用情況: 數(shù)據(jù)保存: 內(nèi)存使用情況: 數(shù)據(jù)顯示: 內(nèi)存使用情況: 綜述:laravel是非常優(yōu)美和整潔的php框架,路由功能非常強大,,更像一個路由核心,,有著良好的請求分發(fā)和路由控制,代碼風(fēng)格整齊劃一,。但是似乎laravel擴展的功能太過簡單,,沒有太多的具體實現(xiàn)。最重要的是所有請求都要走路由,,看了它的2.x和3.x版新版本才有默認(rèn)規(guī)則,,最新版簡直就和ROR一模一樣,比如數(shù)據(jù)表結(jié)構(gòu)什么的連字段的要求都是一樣的,,Rails雖好也不至于模仿的這么真真切切,。基于laravel的前臺的各種控件很少,,網(wǎng)上甚至沒有一個基于laravel的完整的例子。中文文檔還在翻譯中對于新人來說用laravel開發(fā)效率可能會大打折扣,,而且laravel在安全性方面考慮的并不多這也是讓人頭疼的一部分,,好像只有一個防止跨站提交的過濾器。個人認(rèn)為最重要的是選擇使用laravel人現(xiàn)在并不多??蚣芙Y(jié)構(gòu)設(shè)計的非常優(yōu)秀,,但是還是稍顯復(fù)雜的,引入了最新的命名空間,,和閉包回調(diào)的機制,,每次請求要加載的文件太多了或多或少的拖了性能,所以內(nèi)存消耗方面laravel是最大的,。 Codeigniter功能強大但是顯得又過于雜亂了,,特別是控制器和視圖的對應(yīng)上完全背離了約定大于配置這一原則,沒有Rails的外部包裹機制,,內(nèi)部引入也顯得頁面和代碼不分家,。Codeigniter沒有模型類的自動裝載功能,實際開發(fā)起來效率就會有些低,,視圖代碼不講究對稱讓人看了不順心,。好像Codeigniter并沒有自動的POJO類的概念,Model類側(cè)很重Active Record模式,,數(shù)據(jù)庫的操作很大程度上依賴了手寫,。還有就是開發(fā)的時候沒有顯示的類調(diào)用,這樣就得不到IDE友好提示,,開發(fā)效率上多少會有影響的,。 其實所有MVC的框架機制是一樣,但是YYUC其中一個特點是按需加載,,控制器是程序片段而不是一個類,,通常的面向類的控制器如果對應(yīng)10個請求的話那么每次頁面請求都會無端的加載9段多余的其他代碼。php不像Java常駐內(nèi)存,,每次請求能少加載些就少加載些,。YYUC控制器中的變量是不需要顯示的聲明注入到視圖中的,視圖和控制器在同一個級別之下,,這樣即提高了開發(fā)效率又加快了代碼的執(zhí)行效率,。YYUC的Model既有原始POJO類的特點也可以通過子類實現(xiàn)Active Record模式,可以在開發(fā)時靈活選擇,。通過插件規(guī)則YYUC內(nèi)置了很多常用控件,,像分頁、日期,,上傳,,圖片截取,驗證碼,、顏色選取,、富文本編輯器、HTML5的視頻音頻兼容播放、HTML5的WebSocket兼容支持等等,。 |
|