你问 ThinkPHP 适不适合(零基础)速成找工作,没问题;你问 ThinkPHP “好不好”,也就算了。和 Django 对比,还有人觉得 ThinkPHP 好,我真的要出来说一句了—— 技术角度上,ThinkPHP 无论如何也配不上和 Django 对比。

ThinkPHP 的代码质量非常一般,风格尤其糟糕——大量单字母命名、全局函数、全局变量(还有组合体——单字母全局函数)、滥用 GET / POST 数组……比如想象一下表单里用了个单字母的key(出于混淆或压缩 URL 的目的),结果行为莫名其妙,最后发现这玩意儿竟然是框架默认的全局 GET 参数之一……最关键的是,这些还是他们引以为豪的特性!暴露给开发者的公开接口都这样了,框架内部就更不用说——随处可见“缩行”神技、没有统一的代码规范、对 PHP 的类型转换带来的坑不注意规避……

安全方面也尤为堪忧。且不说编码质量导致的细节漏洞,整个 SQL query builder 的设计简直令人吓掉下巴!最早我也没关注,还觉得作为一个现代框架(ThinkPHP 3.X),善用 prepared statement 、 parameterized query 应该是基本的,有可能的话还应该做好类型绑定(尤其在动态语言里),然而……直到我看到乌云上接二连三的爆出 ThinkPHP 的 SQL 注入漏洞(现在应该有很多都已经公开细节了,可以自己去搜搜看),修了一个甚至还间接导致 regression 出了个新的,觉得一个框架怎么这么容易被注入,我才去看了一眼那几个修复的 patch 以及整个 SQL 子系统,吓得我……官方甚至还有过类似“就是这么设计的”、应该开发者自己应对的回应——这话很多时候是对的,但我可一点也不觉得传任何值给 query builder (而且也没有强制使用“unsafe”之类的功能)导致注入是开发者应该应对的问题……

说到了 regression ,也就不得不提最关键的一点——测试在哪里?反正我是一点也不敢使用一个这么庞大却没有单元测试的框架的……( Knuth 的 TeX 都有测试呢……又不是编程之禅里的“大师”……)

另外有一个可以讨论的问题——升级。我是做过从 ThinkPHP 1.X 升到 2.X 再升到 3.X 的事情的。接口、行为甚至整个结构、模型都会变化,还记得升级文档是一份不厚的PDF,有很多细节没有完全覆盖到。和 Django 对比,即使是 Django 早期变化比较大的时期,也没觉得升级这么痛苦,大部分时候还会提前几个版本给 deprecated 警报……更不用说 Django 最近很长一段时间的升级都比较平滑了,这也和其架构合理有关。当然你也可以支持这种破坏性比较大的升级,前提是你愿意花时间跟进大版本,否则老版本最后总是会没有安全支持的——看看现在多少旧版本的 ThinkPHP 站点被脚本小子拿来玩?

ThinkPHP 也是有“优势”的,从上至下全中文——注释、commit message、文档、社区……真的几乎一句英文也没有(当然抛开代码),想要也没有,扫清了需要学英语这一大障碍。

我认为,只有出于历史原因被迫(虽然这种情况下我强烈建议换工作)或者技校速成,其他情况下别碰这个大坑。讨论“框架优劣”的话,也是 Laravel、Symfony 之类的 vs Django 更有意义。

Update (a.k.a. off-topic):

有不少人提到 CodeIgniter ,也是我用过的第一个框架,同时也是我读过的代码比例最高的一个PHP框架。中肯地说 CodeIgniter 的设计、架构乃至代码质量都是不错的,文档也很易懂。不过不论如何 CodeIgniter 的定位和 ThinkPHP 这类完全不同,就是一个轻量级的框架,最重要的区别之一在于数据层抽象非常简单。更不幸的是其开发停滞了很长一段时间,尤其是在 PHP 5.3 之后没能跟上(不但没有使用新特性,而且还存在兼容问题)……不推荐在新项目中使用 2.x 的 CodeIgniter ( PHP 5.3 之后有太多重要的新特性了)。至于前段时间 CodeIgniter 转让给了我这儿的一所 college (BCIT)来维护,推出了 3.x 版,没有用过就不评论了。

还有一个曾经很喜欢的框架是 CakePHP ,代码规范、测试完整、团队活跃,很喜欢它的数据模型,算是少数几个 ORM 做得不错的 PHP 框架了,调试功能也很强大,再加上自动生成代码和数据库等“scaffolding”功能,可以说是比较接近 Django 。然而可惜的是,我最喜欢的 data model 部分在 2.x 版本的实现有问题——历史包袱沉重、逻辑过度复杂,导致在极端情况下(例如复杂的层叠、链接)出现 bug ,而且很难修;我花过时间查 bug 、试图修复、也和 CakePHP 团队讨论了,最后认为很难在不破坏兼容性的情况下完全修复,所以留在了 3.x 版本里重构整个 data model 系统。如今 3.0 好像已经出来了,不过我仍然没用过……

Laravel 太新、 Symfony 太重,所以这两个其实我也是没用过的;Yaf 完全就是不同的方向了。

python django框架 比php_ThinkPHP, Django这两个框架孰优孰略,忽略语言本身?相关推荐

  1. 实时流处理框架Storm、Spark Streaming、Samza、Flink,孰优孰劣?!

    https://mp.weixin.qq.com/s?__biz=MzU1NDA4NjU2MA==&mid=2247486490&idx=1&sn=e25a05be8cf98c ...

  2. Node.js VS Python:孰优孰劣?

    转载自品略图书馆 http://www.pinlue.com/article/2020/07/2814/1111088479253.html 导读:人们可能会在Node.js和Python之间选择时感 ...

  3. 3dmax和python哪个好学_3Dmax和Maya孰优孰劣?初学者入门该如何选择?

    大家好,本人次时代游戏建模师一枚.入坑游戏建模已经有三年之久了,也算是小有经验,今天在这里给大家分享一些游戏建模的知识.如果觉得我的分享对你有帮助可以关注UP主,加我企鹅号前三位142,中间四位644 ...

  4. SAP BOPF和ESF2这两个框架有什么区别

    SAP社区上有这样一个讨论帖子: BOPF和ESF2 的区别? https://archive.sap.com/discussions/thread/3602400 BOPF全称: 可以看下这位SAP ...

  5. python框架django的使用_Django框架的基本使用,若依框架

    Django框架的基本使用,若依框架 Django框架的基本使用 Django是一个功能强大的web框架 框架模式 1.MVC和MTV框架 MVC:Web服务器开发领域里著名的MVC模式,所谓MVC就 ...

  6. Python框架篇之Django(Django项目搭建全过程、Web框架与Django)

    文章目录 一.Web框架与Django本质 二.从安装到实现一个完整的Django项目 一.Web框架与Django本质 1.Web框架的理解 框架,特指为解决一个开放性问题而设计的具有一定约束性的支 ...

  7. python学习第八天---用Django框架创建可重用注册登录系统

    python学习第八天---用Django框架创建可重用注册登录系统 实现的功能 项目开始前的整体规划 搭建环境完成基础配置 创建app 更改语言和时区 数据库表生成 启动开发服务器 浏览器访问,检测 ...

  8. 【Python/Web】Django(一)Django框架的配置和使用

    序章 Python下面有许多受欢迎的web框架,例如Flask.Twisted等,Django也不例外.许多成功的网站都是基于Django,Django作为一个开源的Web应用框架,采用了 MVT 的 ...

  9. python开源项目框架二次开发_Python中三大框架各自的应用场景(DJango,flask,Tornado)...

    django:主要是用来搞快速开发的,他的亮点就是快速开发,节约成本,正常的并发量不过10000,如果要实现高并发的话,就要对django进行二次开发,比如把整个笨重的框架给拆掉,自己写socket实 ...

最新文章

  1. 未来一年最有可能成为独角兽的29家美国初创公司
  2. JWT简介json web token bear token
  3. git删除远程已经没有的分支
  4. Oracle 制造死锁和查询死锁
  5. golang 数组组合成最小的整数_golang数组-----寻找数组中缺失的整数方法
  6. 光耦在短距离通信中的应用
  7. Java操作某方法时报错:java.lang.NoSuchMethodError
  8. 常用文本编辑器 editor 的常用插件 —— CopyEdit
  9. jQuery实现一个简单的选项卡效果
  10. 用u盘安装mysql,奥维互动地图企业服务器基本环境安装 ——U盘引导安装CentOS 6.5...
  11. 在IDEA中如何使用eclipse快捷键
  12. 微信小程序 audio 音频 组件
  13. laravel 软删除
  14. 【JZOJ 3397】雨天的尾巴
  15. js处理null和underfined
  16. springcontext.xml 中方言是红色的_12种方言都能听懂!讯飞智能录音笔A1评测:小如钥匙坠+复古磁带造型...
  17. SQL中modify和alter用法区别
  18. mysql存储函数中游标报错 No data - zero rows fetched, selected
  19. 批量删除github工程仓库的办法
  20. 塔望3W消费战略全案|牛小范:即食牛排如何打造品牌「高级感」

热门文章

  1. AltiumDesigner PCB导入CAD
  2. 【推导】计蒜客17119 2017 ACM-ICPC 亚洲区(西安赛区)网络赛 F. Trig Function
  3. poj 1284 Primitive Roots(原根+欧拉函数)
  4. 小米今日正式进军越南市场 借助合作方铺渠道分销
  5. BZOJ 1426 收集邮票 ——概率DP
  6. 软件测试体系划分与职业素养
  7. Activity一共有以下四种launchMode
  8. Nginx+MSM+Tomcat做负载均衡,session共享
  9. FineUI小技巧(4)关闭窗体那些事
  10. CCNA笔记-交换机安全