前几天下载了ThinkPHP的代码来看,给我的印象没有CodeIgniter(CI)的那么好。或许是因为我下载的是最新的RC版本吧!里面的Examples不全,打开几个提示404,因为比较关心数据库操作方面的代码。另外,跑了一下里面的Blog的Example,功能都挺完善的。不过花了十几分钟看了一下代码,就害怕了。不大喜欢的原因有下:
1、代码很大,这么一个小blog在用了框架之后,还需要敲那么多代码,开发时间也不短吧。
2、把HTML、CSS、Script写在controller里,让controller变得很臃肿,代码也有点混乱。为何不写到View里面去呢?
protected function ajaxUploadResult($info) { // Ajax方式附件上传提示信息设置 // 默认使用mootools opacity效果 //alert($info); $show = '<script language="JavaScript" src="'%20.%20WEB_PUBLIC_PATH%20.%20'/Js/mootools.js"></script><script language="JavaScript" type="text/javascript">' . "\n"; $show .= ' var parDoc = window.parent.document;'; $show .= ' var result = parDoc.getElementById("' . $info['uploadResult'] . '");'; if (isset($info['uploadFormId'])) { $show .= ' parDoc.getElementById("' . $info['uploadFormId'] . '").reset();'; } $show .= ' result.style.display = "block";'; $show .= " var myFx = new Fx.Style(result, 'opacity',{duration:600}).custom(0.1,1);"; if ($info['success']) { // 提示上传成功 $show .= 'result.innerHTML = "<div style=\"color:#3333FF\"> 文件上传成功!";'; // 如果定义了成功响应方法,执行客户端方法 // 参数为上传的附件id,多个以逗号分割 if (isset($info['uploadResponse'])) { $show .= 'window.parent.' . $info['uploadResponse'] . '("' . $info['uploadId'] . '","' . $info['savename'] . '");'; } } else { // 上传失败 // 提示上传失败 $show .= 'result.innerHTML = "<div style=\"color:#FF0000\"> 上传失败:' . $info['message'] . '";'; } $show .= "\n" . '</script>'; //$this->assign('_ajax_upload_',$show); header("Content-Type:text/html; charset=utf-8"); exit($show); return; }
3、混合使用了Java、 www.2cto.com 微软.Net、PHP三种代码风格(或者确切的说,从Java、微软.Net借鉴了函数、文件或变量的命名风格,但是没有PHP化)。不过在使用上比较一致,出问题几率也不会太大,只是我不是很习惯。
4、在controller代码里写Business Logic和数据库操作。我看Model里的代码基本都很短,看来是基本上博客的功能都写在controller里面去了。比较像Fat Controller的写法,但是数据库的操作写到Model里应该好些吧(按我理解的MVC来说)。Fat Model比Fat Controller多很多好处,便于代码重用。
5、这个要举例说明一下,在看代码的时候,发现一句注释。
if (!empty($id)) { $Blog = D("BlogView"); $result = $Blog->where('Blog.id=' . $id)->find(); // 这里为什么用select()就读不出来 if ($result) { $this->assign('vo', $result); } else { $this->redirect('index'); return; } } else { $this->redirect('index'); }
因为我对数据库操作方面比较关心,之前看过部分ThinkPHP的文档。拜托,写这代码的朋友,TP里select读出来的是记录集,find得到的是记录,你这么assign过去,当然读不出来啦。要把$result改成$result[0]才可以读出来的嘛。这样我感觉TP的Example编写者也对使用者太不负责任了。不过也没多大问题,只是一个RC版本。
6、混合有字符串式拼凑的SQL请求,有些我没读懂!!!可能需要时间深入探究。过多使用这类SQL,会有安全隐患吧(例如SQL注入)。
public function tag() { $Tag = M("Tag"); if (!empty($_GET['name'])) { $name = trim($_REQUEST['name']); $list = $Tag->where("module='Blog' and name='$name'")->field('id,count')->find(); $tagId = $list['id']; $count = $list['count']; import("@.ORG.Page"); $listRows = 10; $fields = 'a.id,a.userId,a.categoryId,a.cTime,a.readCount,a.commentCount,a.title,c.title as category'; $p = new Page($count, $listRows); $p->setConfig('header', '篇日志 '); $dao = D("Blog"); $list = $dao->query("select " . $fields . " from " . C('DB_PREFIX') . 'blog as a,' . C('DB_PREFIX') . 'tagged as b, ' . C('DB_PREFIX') . 'category as c where b.tagId in (' . $tagId . ') and a.categoryId= c.id and a.status=1 and a.id=b.recordId order by a.id desc limit ' . $p->firstRow . ',' . $p->listRows); if ($list) { $page = $p->show(); $this->assign("page", $page); $this->assign('list', $list); } $this->assign('tag', $name); $this->assign("count", $count); } else { $list = $Tag->where("module='Blog'")->select(); //dump($list); $this->assign('tags', $list); } $this->display(); }
7、代码风格能体现一个程序员的水平,跟CI的Examples相比,还是有一定差距。注释写的比较随意。我有时写代码,注释也挺随意的。有时候为了尊重其他人,还是需要像写代码一样很大耐心地去写注释。
8、跟代码无关。附带的用户文档不是很人性化,在我本本上都看到字体很大,行距很大,一段简单功能的PHP代码就显示了两页。有些代码为了语法高亮使用了图片,不过图片的质量太低了,可能我玩多了单反。作成HTML其实也方便用户使用、查找的嘛,弄个PDF多了些麻烦。
以上观点仅针对ThinkPHP 3.0 RC1的Example而言。我没有看过核心代码,所以无权评论。同时也没有否定国内MVC框架实力的意思,只不过我觉得,TP的开发者应该在一些细节上多下些功夫,多灌注一些心血,让TP的手册和例子的质量有所提高!
摘自 Xiaoxia

PHP在現代編程中仍然是一個強大且廣泛使用的工具,尤其在web開發領域。 1)PHP易用且與數據庫集成無縫,是許多開發者的首選。 2)它支持動態內容生成和麵向對象編程,適合快速創建和維護網站。 3)PHP的性能可以通過緩存和優化數據庫查詢來提升,其廣泛的社區和豐富生態系統使其在當今技術棧中仍具重要地位。

在PHP中,弱引用是通過WeakReference類實現的,不會阻止垃圾回收器回收對象。弱引用適用於緩存系統和事件監聽器等場景,需注意其不能保證對象存活,且垃圾回收可能延遲。

\_\_invoke方法允許對象像函數一樣被調用。 1.定義\_\_invoke方法使對象可被調用。 2.使用$obj(...)語法時,PHP會執行\_\_invoke方法。 3.適用於日誌記錄和計算器等場景,提高代碼靈活性和可讀性。

Fibers在PHP8.1中引入,提升了並發處理能力。 1)Fibers是一種輕量級的並發模型,類似於協程。 2)它們允許開發者手動控制任務的執行流,適合處理I/O密集型任務。 3)使用Fibers可以編寫更高效、響應性更強的代碼。

PHP社區提供了豐富的資源和支持,幫助開發者成長。 1)資源包括官方文檔、教程、博客和開源項目如Laravel和Symfony。 2)支持可以通過StackOverflow、Reddit和Slack頻道獲得。 3)開發動態可以通過關注RFC了解。 4)融入社區可以通過積極參與、貢獻代碼和學習分享來實現。

PHP和Python各有優勢,選擇應基於項目需求。 1.PHP適合web開發,語法簡單,執行效率高。 2.Python適用於數據科學和機器學習,語法簡潔,庫豐富。

PHP不是在消亡,而是在不斷適應和進化。 1)PHP從1994年起經歷多次版本迭代,適應新技術趨勢。 2)目前廣泛應用於電子商務、內容管理系統等領域。 3)PHP8引入JIT編譯器等功能,提升性能和現代化。 4)使用OPcache和遵循PSR-12標準可優化性能和代碼質量。

PHP的未來將通過適應新技術趨勢和引入創新特性來實現:1)適應云計算、容器化和微服務架構,支持Docker和Kubernetes;2)引入JIT編譯器和枚舉類型,提升性能和數據處理效率;3)持續優化性能和推廣最佳實踐。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

Dreamweaver Mac版
視覺化網頁開發工具

MantisBT
Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

SAP NetWeaver Server Adapter for Eclipse
將Eclipse與SAP NetWeaver應用伺服器整合。

VSCode Windows 64位元 下載
微軟推出的免費、功能強大的一款IDE編輯器

PhpStorm Mac 版本
最新(2018.2.1 )專業的PHP整合開發工具