我已经阅读了一些帖子,其中有人说过(不建议,没有讨论,没有提供)PHP不应该用于大型项目.
作为一名主要的PHP开发人员,我提出两个问题:
什么定义了"大项目"?
为什么不?使用PHP有什么陷阱
我经营一个小型开发团队,我从经验中了解质量建设,组织,文档,评论和封装是我们的首要任务.我们能够使用自己的框架和方法开发出色的项目,但是,如果我浪费时间,我不想进一步投资.
思考?
当人们断言PHP是一种糟糕的语言时,我真的很讨厌它,因为你可以编写将表示与逻辑混合的代码,或者它允许你允许SQL注入.这与语言没什么关系,那就是开发人员.
PHP已被证明具有高度可扩展性:维基百科是互联网上最大和最受欢迎的网站之一,它运行PHP.说够了?
有很多工具/库可以为你提供一个工作框架,使得人们不太可能编写糟糕的,可维护性较差的代码:参见CakePHP,Symfony,PDO,Smarty等等.
它收到了一个糟糕的说唱,因为它是一种入门门槛很低的语言:它是免费的,你可以得到非常便宜的PHP托管,文档是最好的,有很多在线教程,加上它做了很多东西非常简单(例如:打开一个URL并获取文件的内容:) file('http://www.google.com');
.这意味着很多新手都会选择它并制作了许多非常狡猾的网站,但这种情况会随着您选择的第一种语言而发生.
使用一个可靠的ORM框架(关于哪个最好的问题大约有30个问题),它会对你很好.
许多说不使用它的人真的说不要使用PHP 4.它归结为此
你可以用任何语言编写好的代码
和
你可以用任何语言编写错误的代码
PHP经常会使自己成为纠结的意大利面条代码库,并使你的"应用程序"真正只是一系列脚本(请参阅Moodle,以此作为一个很好的例子......)
我认为很多'不要将PHP用于大型东西'来自于PHP被其原始目的所摧毁:一种模板化语言.我可以理解,但有很多项目证明你可以做到(Drupal,mediawiki,Facebook).
没有理由你不能将PHP用于大型项目.毕竟,Facebook建立在PHP之上.但是会有问题,但任何大型项目都存在问题.
让PHP如此普及的原因在于进入门槛低,托管便宜.它作为Apache扩展运行,你几乎可以开始编码.如果你去更多的企业平台,如.Net或Java,他们有更高的进入门槛,但他们也有很多基础设施,可以帮助你制作可扩展的应用程序.
例如,PHP中的数据库抽象是(imho)可悲的.它是特定于供应商的.使用MySQL,人们倾向于做以下事情:
function get_users($surname) { mysql_query("select * from users where surname = '$surname'"); ... }
这有几个原因很糟糕:
它很难使用查询缓存;
它不会处理字符的转义(当然,这可以用,mysql_escape_string()
但你会惊讶于人们不经常这样做); 和
以允许SQL注入攻击的方式进行编码相当容易.
我个人更喜欢mysqli因为上述所有原因,但它有自己的问题:即使用LONGTEXT字段崩溃mysql并至少自2005年以来仍然没有修复(是的我和其他几个人提出了一个错误).
将此与Java(我更熟悉)相比较,JPA或Ibatis是具有更高启动成本的更好的ORM解决方案,但它们将在企业范围内为您提供帮助.
因此,您不会被禁止在PHP上执行大型项目.更难的是你必须自己做越来越多的工作来复制其他平台为你提供的东西.
话虽如此,PHP + memcached/APC + beanstalkd还有很长的路要走.
哦,这是另一个问题:PHP并不真正支持后台处理或线程.您需要其他东西(或独立脚本).如果您正在使用其他东西,为什么不将它用于Web内容(例如Java,Ruby,.Net等)?
由于我链接的问题已删除,我将在此处放置一些内容:
我在另一个问题线程中做了一个诙谐的评论,称PHP是一种可怕的语言,并且它像疯了一样投票.显然,这里有很多人喜欢PHP.
所以我真的很好奇.我错过了什么?是什么让PHP成为一门好语言?
以下是我不喜欢它的原因:
PHP具有内置和库函数的不一致命名.可预测的命名模式在任何设计中都很重要.
PHP具有内置函数的不一致参数排序,例如array_map与array_filter,这在简单的情况下很烦人并引发各种意外行为或更糟.
PHP开发人员不断弃用内置函数和低级功能.一个很好的例子是他们不赞成函数的pass-by-reference.这对任何做功能回调的人来说都是一场噩梦.
重新设计时缺乏考虑.上述弃用消除了在许多情况下为函数提供默认关键字值的能力.他们在PHP 5中解决了这个问题,但是他们不赞成PHP 4中的pass-by-reference!
名称空间执行不佳(以前根本没有名称空间).现在存在名称空间,我们将什么用作解引用字符?反斜杠!即使在PHP中,该字符通常用于转义!
过于宽泛的隐式类型转换会导致错误.我没有问题隐式转换,例如,浮点数到整数或再返回.但是PHP(我最后检查过)会很乐意尝试将数组神奇地转换为整数.
递归性能差.递归是用任何语言写作的一个至关重要的工具; 它可以使复杂的算法变得更加简单.糟糕的支持是不可原谅的.
函数不区分大小写.我不知道他们在这个问题上有什么想法.编程语言是一种为计算机和代码的读者指定行为而不含糊的方法.不区分大小写引入了很多模糊性.
PHP鼓励(实际上需要)处理与表示的耦合.是的,您可以编写不会这样做的PHP,但实际上更容易以不正确的方式(从声音设计角度)编写代码.
PHP性能非常糟糕,没有缓存.有没有人出售PHP的商业缓存产品?哦,看,PHP的设计师.
最糟糕的是,PHP让人们相信设计Web应用程序很容易.它确实使得所涉及的大部分工作变得更加容易.但事实是,设计既安全又高效的Web应用程序是一项非常困难的任务.
通过说服那么多人接受编程,PHP教会了整个程序员小组的坏习惯和糟糕的设计.这使他们能够访问他们缺乏安全使用理解的功能.这导致PHP的声誉不安全.
(但是,我很乐意承认PHP不会比任何其他Web编程语言更安全或更不安全.)
PHP缺少什么?我看到一种有机种植,管理不善的混乱语言正在催生可怜的程序员.
所以说服我吧!
我会采取措施来回应你的每一个要点
PHP具有内置和库函数的不一致命名.可预测的命名模式在任何设计中都很重要.
我既爱又恨这个话题.因为它的核心是这个问题是正确的.为什么有些双字函数用下划线分开,有些不是?为什么needle和haystack参数有时会在参数签名中交换位置?这太荒谬了.但是在一天结束时......这真的很重要吗?我的IDE与intellisense和php.net只是一个浏览器点击,这显然不是一个很大的交易.PHP作为一种语言是否是否定的?是.它会阻碍我成为一名有效程序员的能力吗?没有.
PHP开发人员不断弃用内置函数和低级功能.一个很好的例子是他们不赞成函数的pass-by-reference.这对任何做功能回调的人来说都是一场噩梦.
就个人而言,我认为这不是一个好点.弃用对于语言的演变是必要的,尤其是那种与PHP一样多的语言.PHP因为"让它变得很容易成为一个糟糕的程序员*"而受到很多抨击,但与此同时,PHP组在尝试从语言中删除愚蠢的构造时也会遇到麻烦,例如调用时间传递-参考.消除呼叫时间传递是他们做过的最好的举动之一.对于一个新手开发者来说,没有比这个"功能"更容易的方式来射击自己.
重新设计时缺乏考虑.上述弃用消除了在许多情况下为函数提供默认关键字值的能力.他们在PHP 5中解决了这个问题,但是他们不赞成PHP 4中的pass-by-reference!
我认为根本没有考虑到这一点,我认为你只是因为这种特殊的变化而受到刺激,并且口中留下了酸味.语言变化通常是提前几个月,如果不提前几年.为从4到5的移动提供了迁移指南,并且手册中记录了版本差异.通话参与传递是一个可怕的"功能",并没有给开发者任何他们无法通过其他方式获得的表现力.我很高兴它已经消失了(还有像魔术引号一样的其他垃圾)
名称空间执行不佳(以前根本没有名称空间).现在存在名称空间,我们将什么用作解引用字符?反斜杠!即使在PHP中,该字符通常用于转义!
对此我五味杂陈.我的一部分认为"谁在乎,角色逃脱无论如何都没有任何意义",我的一部分认为"他们肯定可以使用更好的东西".但他们呢?我不知道,我不是Zend解析器的开发人员.这是一个巨大的疏忽,直到5.3 PHP从来没有名称空间?是的,一点没错.
过于宽泛的隐式类型转换会导致错误.我没有问题隐式转换,例如,浮点数到整数或再返回.但是PHP(我最后检查过)会很乐意尝试将数组神奇地转换为整数.
我认为不同意PHP如何做到这一点,但不同意它使语言变得"糟糕".但是问我有多想参与这个话题并争论弱势和强势打字.(PS我不这样做,在所有)对于记录:当一个参数的问题的类型和无法通过强制解决PHP将发出E_WARNING级别的错误.
递归性能差.递归是用任何语言写作的一个至关重要的工具; 它可以使复杂的算法变得更加简单.糟糕的支持是不可原谅的.
PHP是一个用于Web的DSL.我已经全职工作了8年,并且可能使用了4到5次递归,通常用于某些类型的烦人目录或XML遍历.它通常不是Web开发所需的模式.我并没有放弃缓慢的表现,但这是一个学术问题,远远超过了生产问题.如果你需要非常强大的递归性能,PHP已经是你错误的语言.
函数不区分大小写.我不知道他们在这个问题上有什么想法.编程语言是一种为计算机和代码的读者指定行为而不含糊的方法.不区分大小写引入了很多模糊性.
我完全100%同意这一点.
PHP鼓励(实际上需要)处理与表示的耦合.是的,您可以编写不会这样做的PHP,但实际上更容易以不正确的方式(从声音设计角度)编写代码.
*嗯,这个话题听起来非常熟悉......
但严重的是,我发现人们会抱怨一种语言绝对100%让你实现你想要的任何输出系统(PHP模板系统的单纯量和风格单独说到这一点),我觉得非常了不起 - 或者 - 跳过所有这些开销和只是直接输出.这根本不会让PHP变坏.这是使PHP变得更好的一部分.
PHP性能非常糟糕,没有缓存.有没有人出售PHP的商业缓存产品?哦,看,PHP的设计师.
你的意思是字节码缓存(如加速器),还是输出缓存?
如果是前者,那么我真的不知道我对这个话题有多关心.加速器免费且易于运行.我们可以争论为什么它不是语言的一部分,但最后,我认为这不重要.
如果你在谈论输出缓存,那么我不知道该对你说什么.任何具有重要流量需求缓存的Web项目(例如种子播客#27).这不是一个PHP特定的问题,在所有.
总之,我认为你认为PHP是一种非常学术化的"坏"语言.在您之前的帖子中,您可能被像我这样使用PHP"完成任务"的人投票.
你所有的批评(以及更多)都是有效的.您被允许甚至期望讨厌PHP.
但是,再一次,它有一些好处:
普及
快速(特别是使用操作码缓存)
庞大的社区(和伟大的文档)
作品
最后,通过编写用任何其他语言编写的优秀代码,您可以克服许多(如果不是全部)缺点.您可以在PHP中编写可靠,安全且具有良好气味的代码,这些代码可以运行得更快,并且比许多替代方案更容易托管和扩展.
PHP缺少什么?我看到一种有机种植,管理不善的混乱语言正在催生可怜的程序员.
简单.事实上,糟糕的程序员对他们的语言非常防守.;)PHP易于学习,比替代方案容易得多,一旦你学会了它,它就不是很明显1)PHP有什么问题,2)替代方案如何更好,3)如何切换到,学习,替代方案之一.
也许事实是,人们有什么选择?ASP?这本身有很多问题,从无法在大多数网络服务器(Apache)上运行,到自己的一些荒谬和过度设计的选择(webforms?Viewstate?AJAX,你的异步"请求被截获并按顺序运行? Ruby on Rails?好吧,也许,除了有多少网络服务器再次支持它?目前它并不容易接近.而且它很慢.所以也许PHP的"力量"确实没有好的选择存在.至少这就是为什么我尽可能远离所有网络编程.PHP糟透了,我也不太热衷于任何替代方案.
PHP有很多基本问题,甚至都不好笑.从缺乏unicode支持,到经常导致意外安全漏洞的许多隐式类型转换,到演示文稿和其他所有内容的完全混合,或者到没有(我最后检查过)的默认数据库模块参数化查询.我们谈论的是一种用于两件事的语言,即数据库访问和生成HTML,这两者都很糟糕.
这只是一个讨厌的混乱,一种由没有资格或能够设计语言的人设计的语言.;)