ThinkPHP, Django这两个框架孰优孰略,忽略语言本身?
程序员文章站
2024-01-01 19:34:34
...
帮忙从易用性,拓展性分析下
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 完全就是不同的方向了。 拖拉机和车的区别..
过不 国内很多项目的开发环境 就是农田... 下面数据的时间点是 20150818
github 上搜索
Django
thinkphp
完全没有可比性,think php 不支持 pdo(sql 注入的风险),不支持命名空间, 据说新版本改了,以这种跟进速度,我就不吐槽了 laravel 飘过 PHP 框架 ,国内用的多的应该是YII吧 忽略语言本身你谈个P啊?框架的很多特性就是基于语言特性的。 ThinkPHP早就停止更新了,所以喜欢用ThinkPHP的人还是早点换http://asp.net吧~
国内很多人喜欢用着几百年前都已经过时的东西,比方说ThinkPHP或者是PHPWind,这样不好,项目组选框架的时候一定要找有人维护的框架,要不GitHub提一个pull request都没人理,多闹心~
Django也是一个挺好的框架,适合初学者 我没有用过TP,但是就我使用TP与YII2的经验而言。。我不喜欢TP。
= =我看到TP里面的全局函数 M函数 D函数 就感觉恶心(我是一个面向对象思维者) 阿诺,PHP不是最好的语言吗? 只说TP学的蛮快,1上午
回复内容:
你问 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 完全就是不同的方向了。 拖拉机和车的区别..
过不 国内很多项目的开发环境 就是农田... 下面数据的时间点是 20150818
github 上搜索
Django
thinkphp
完全没有可比性,think php 不支持 pdo(sql 注入的风险),不支持命名空间, 据说新版本改了,以这种跟进速度,我就不吐槽了 laravel 飘过 PHP 框架 ,国内用的多的应该是YII吧 忽略语言本身你谈个P啊?框架的很多特性就是基于语言特性的。 ThinkPHP早就停止更新了,所以喜欢用ThinkPHP的人还是早点换http://asp.net吧~
国内很多人喜欢用着几百年前都已经过时的东西,比方说ThinkPHP或者是PHPWind,这样不好,项目组选框架的时候一定要找有人维护的框架,要不GitHub提一个pull request都没人理,多闹心~
Django也是一个挺好的框架,适合初学者 我没有用过TP,但是就我使用TP与YII2的经验而言。。我不喜欢TP。
= =我看到TP里面的全局函数 M函数 D函数 就感觉恶心(我是一个面向对象思维者) 阿诺,PHP不是最好的语言吗? 只说TP学的蛮快,1上午