没有大型项目的PHP? 为什么不?

我已经阅读了几篇文章,其中有人指出(不build议,不讨论,不提供)PHP不应该用于大型项目。

作为一个主要的PHP开发人员,我问两个问题:

  1. 什么定义了一个“大项目”?
  2. 为什么不? 什么是使用PHP的陷阱

我经营一个小型的开发团队,从经验中我知道质量build设,组织,文档,评论和封装是我们的首要任务。 我们可以用我们自己的框架和方法来开发优秀的项目,但是如果我浪费时间的话,我不想再投资。

思考?

当人们认为PHP是一种糟糕的语言时,我真的很讨厌它,因为你可以编写将表示与逻辑混合在一起的代码,或者允许你允许SQL注入。 这与语言无关,这就是开发者。

PHP已经certificate自己是高度可扩展的:维基百科是互联网上最大和最受欢迎的网站之一,它运行PHP。 说够了?

有很多工具/库在那里给你一个工作的框架,使得不太可能有人编写差的,维护性较差的代码:请参阅CakePHP,Symfony,PDO,Smarty等等。

它已经收到了一个坏的说唱,因为它是一个非常低的入门障碍的语言:它是免费的,你可以得到非常便宜的PHP托pipe, 文档是最好的 ,有大量的在线教程,再加上它使很多东西非常容易(例如:打开一个URL并获取文件的内容: file('http://www.google.com'); )。 这意味着很多新手都拿起它来制作很多非常狡猾的网站,但是随着你的第一个select,就会发生这种情况。

使用一个可靠的ORM框架(关于哪个是最好的,有大约30个关于这个问题的问题),它会把你处理得很好。

很多人说不使用它真的说不使用PHP 4.这是归结于此

你可以用任何语言编写好的代码

你可以用任何语言编写错误的代码

PHP经常可以使自己变成纠结的意大利面代码库,并使你的“应用程序”真的只是一系列的脚本(请参阅Moodle的一个很好的例子…)

我想很多'不要使用PHP的大型东西'来自于PHP的原始目的:模板语言。 我可以理解,但是有很多项目certificate你可以做到(Drupal,mediawiki,Facebook)。

Theres没有理由不能使用PHP的大型项目。 毕竟,Facebook是build立在PHP之上的。 但是会有问题,但是任何大型项目都有问题。

PHP如此普及的原因是低入门和廉价托pipe。 它作为一个Apache扩展运行,你几乎可以开始编码。 如果你使用更多的企业平台,比如.Net或者Java,他们的进入壁垒要高得多,但是他们也有很多基础设施来帮助你扩展应用。

例如,PHP中的数据库抽象是(imho)悲哀的。 它是供应商特定的。 使用MySQL,人们往往会做这样的事情:

 function get_users($surname) { mysql_query("select * from users where surname = '$surname'"); ... } 

这有几个原因是不好的:

  • 它使查询caching使用不佳;
  • 它不处理字符的转义(当然,这可以通过mysql_escape_string()来完成,但是你会惊讶于人们不会这样做); 和
  • 编码的方式相当容易,以允许SQL注入攻击。

就个人而言,我更喜欢mysqli出于所有上述原因,但它有它自己的问题:即使用LONGTEXT字段崩溃MySQL,至less2005年至今,仍然没有修复(是的,我和其他人已经提出了一个错误)。

将其与Java(我更熟悉)相比较,JPA或Ibatis是更好的ORM解决scheme,具有更高的启动成本,但它们将帮助企业规模。

所以你不被禁止在PHP上做大型项目。 更难的是你必须自己做更多的工作来复制其他平台提供给你的东西。

这就是说,PHP + memcached / APC + beanstalkd走了很长的路要走。

哦,这是另一个问题:PHP并不真正支持后台处理或线程。 你需要其他的东西(或独立的脚本)。 如果你正在使用别的东西,为什么不把它用于Web的东西呢(比如Java,Ruby,.Net等)呢?

由于我所链接的问题已被删除,所以我将在这里放置一些:


我在另外一个叫PHP的可怕语言的线程中发表了一个口头评论,而且这个评论被认为是疯狂的。 显然有很多人喜欢PHP。

所以我真的很好奇。 我错过了什么? 什么使得PHP成为一门好语言?

这是我不喜欢它的原因:

  • PHP具有内置函数和库函数的不一致命名。 可预测的命名模式在任何devise中都很重要。

  • PHP具有不一致的内置函数的参数sorting,例如array_map和array_filter,在简单的情况下会令人厌烦,并引发各种意想不到的行为,甚至更糟。

  • PHP开发人员不断弃用内置函数和低级function。 一个很好的例子就是当他们不推荐函数的传递引用。 这为任何正在做functioncallback的人创造了一个噩梦。

  • 缺乏重新devise的考虑。 上述弃用消除了在许多情况下为function提供默认关键字值的能力。 他们在PHP 5中修正了这个问题,但他们不赞成在PHP 4中传递引用!

  • 名字空间执行不当(以前根本没有名字空间)。 既然名称空间存在,我们用什么作为解引用字符? 反斜杠! 通用的字符逃脱,即使在PHP!

  • 过分广泛的隐式types转换导致错误。 我没有问题的隐式转换,比如说,浮动到整数或返回。 但PHP(最后我检查)将愉快地试图神奇转换一个数组为一个整数。

  • recursion性能差。 recursion是用任何语言编写的基本重要的工具; 它可以使复杂的algorithm变得简单得多。 不好的支持是不可原谅的。

  • 函数不区分大小写。 我不知道他们在想这个。 一种编程语言是一种为计算机和代码阅读器指定行为的方式,而不会含糊不清。 不区分大小写引入了很多模糊性。

  • PHP鼓励(实际上需要)处理与表示的耦合。 是的,您可以编写不这样做的PHP,但实际上编写错误(从声音deviseangular度来看)的代码更容易。

  • PHP的性能是没有caching没有。 有没有人出售PHP的商业caching产品? 哦,看,PHP的devise师呢。

最糟糕的是,PHP让人相信deviseWeb应用程序很简单。 这确实使涉及的许多工作变得更容易。 但事实是,devise一个既安全又高效的Web应用程序是一项非常困难的任务。

通过说服这么多人来编程,PHP已经教会了整个程序员坏习惯和糟糕的devise。 让他们获得他们缺乏安全使用的理解的能力。 这导致PHP的声誉不安全。

(但是,我会承认PHP不会比其他任何Web编程语言更安全)。

这是什么,我错过了PHP? 我看到的是一种有机种植,pipe理不善的糟糕的程序员产生的语言。

所以说服我,否则!


评分最高的答案


我会刺探你的每一个要点

PHP具有内置函数和库函数的不一致命名。 可预测的命名模式在任何devise中都很重要。

我既爱又恨这个话题。 因为这个问题的核心是正确的。 为什么一些双字函数用下划线分开,有些不是? 为什么有时候在争论的签名中针和干草堆参数交换位置? 这很可笑。 但是在一天结束的时候……这真的很重要吗? 我的IDE与intellisense和php.net只是一个浏览器点击,这只是平原没有那么大的一笔交易。 它是一种对PHP作为一种语言的消极吗? 是。 这会妨碍我成为一名有效的程序员吗? 没有。

PHP开发人员不断弃用内置函数和低级function。 一个很好的例子就是当他们不推荐函数的传递引用。 这为任何正在做functioncallback的人创造了一个噩梦。

我个人认为这不是一个好的观点。 弃用语言对语言的发展是非常必要的,尤其是像PHP这样的语言。 PHP因为“容易成为一个糟糕的程序员”而受到很大的冲击,但是同时PHP组织也会遇到麻烦,当他们试图从语言中去除愚蠢的构造时,例如呼叫时间传递-参考。 通过参考消除通话时间是他们所做的最好的举措之一。 新手开发者没有比这个“function”更容易让自己在脚下自拍的方法。

缺乏重新devise的考虑。 上述弃用消除了在许多情况下为function提供默认关键字值的能力。 他们在PHP 5中修正了这个问题,但他们不赞成在PHP 4中传递引用!

我不认为总体上缺乏考虑,我认为你刚刚被这个特殊的变化所刺痛,并留下了一个口味不好的味道。 如果不提前几年,语言变化往往是已知的几个月。 提供了一个从4到5的迁移指南,版本差异logging在手册中。 呼叫时间通过引用是一个可怕的“特点”,并没有给予开发者任何其他手段无法expression的力量。 我很高兴它消失了(连同像魔术引号一样的其他垃圾)

名字空间执行不当(以前根本没有名字空间)。 既然名称空间存在,我们用什么作为解引用字符? 反斜杠! 通用的字符逃脱,即使在PHP!

对此我五味杂陈。 我的一部分人认为“谁在乎,字符逃脱在string之外没有任何意义”,而我的一部分人认为“他们肯定会用更好的东西”。 但他们可以吗? 我不知道,我不是Zendparsing器的开发者。 这是一个巨大的疏忽,直到5.3 PHP从来没有命名空间? 是的,一点没错。

过分广泛的隐式types转换导致错误。 我没有问题的隐式转换,比如说,浮动到整数或返回。 但PHP(最后我检查)将愉快地试图神奇转换一个数组为一个整数。

我认为可以不同意PHP是如何做到这一点,但不同意它使语言“不好”。 但是,问我想在这个话题上坐多less,并且认为是弱还是强。 (PS我根本没有)为了logging:当论证的types重要时,PHP将发出E_WARNING级别的错误,并且不能通过强制解决。

recursion性能差。 recursion是用任何语言编写的基本重要的工具; 它可以使复杂的algorithm变得简单得多。 不好的支持是不可原谅的。

PHP是一个networking的DSL。 我已经做了全职工作了8年,并可能使用recursion4或5次,通常用于某种types的恼人的目录或XML遍历。 这通常不是Web开发所需要的模式。 我并不是在performance缓慢,但这是一个学术问题,而不是生产问题。 如果您需要真正强大的recursion性能,PHP已经是您的错误语言。

函数不区分大小写。 我不知道他们在想这个。 一种编程语言是一种为计算机和代码阅读器指定行为的方式,而不会造成歧义。 不区分大小写引入了很多模糊性。

我完全同意这一点。

PHP鼓励(实际上需要)处理与表示的耦合。 是的,您可以编写不这样做的PHP,但实际上编写错误(从声音deviseangular度来看)的代码更容易。

*嗯,这个话题听起来非常熟悉…

但严重的是,我发现人们会抱怨绝对100%的语言会让你实现任何你想要的输出系统(单独的PHP模板系统的体积和风格就是这么说的) – 或者 – 跳过所有的开销,只是直接输出。 这不会使PHP不好。 这是使PHP很好的一部分。

PHP的性能是没有caching没有。 有没有人出售PHP的商业caching产品? 哦,看,PHP的devise师呢。

你是指字节码caching(如加速器),还是输出caching?

如果是前者,那么我真的不知道我有多关心这个话题。 加速器免费且易于运行。 我们可以争论为什么这不是语言的一部分,但最后我不认为这很重要。

如果你正在谈论输出caching,那么我不知道该对你说什么。 任何具有重要stream量需求的Web项目都需要caching(例如,种子播客#27)。 这不是一个PHP特有的问题。

总之,我认为你认为PHP是一个非常学术的“坏”语言。 而在你以前的文章中,你可能被像我这样使用PHP来“完成任务”的人拒绝了。


第二高评分答案


所有的批评(还有一些)是有效的。 你被允许甚至期望讨厌PHP。

但是,再一次,它有一些好处:

  • 普及
  • 快速(特别是使用操作码caching)
  • 巨大的社区(和伟大的文档)
  • 作品

最后,通过编写用其他语言编写的优秀代码,你可以克服许多缺点。 您可以在PHP中编写可靠,安全和好闻的代码,这些代码多次运行得更快,并且比许多替代方法更容易托pipe和扩展。


第三高评分答案


这是什么,我错过了PHP? 我看到的是一种有机种植,pipe理不善的糟糕的程序员产生的语言。

简单。 糟糕的程序员对他们的语言非常防守。 ;)PHP很容易学习,比其他方法容易得多,一旦你学会了,它就不是很明显1)PHP有什么问题,2)如何更好的select,3)如何切换到,学习,其中一个select。

也许事实上,人们有什么select呢? ASP? 由于无法在大多数Web服务器(Apache)上运行,或者自行进行一些荒谬和过度的工程deviseselect(webforms?Viewstate?AJAX),您的asynchronous请求被拦截并按顺序运行? )Ruby on Rails?也许,除了有多lessWeb服务器再次支持它呢?现在并不是那么容易上手,而且很慢,所以也许PHP的“力量”实际上是没有好的select存在的,至less这就是为什么我尽可能地远离所有的networking编程PHP很烂,我也不太喜欢任何的select。

PHP有这么多基本问题,甚至不好笑。 从缺乏Unicode的支持,到许多隐式types转换,往往会导致意想不到的安全漏洞,完全混合的演示文稿和…一切,或默认的数据库模块不(最后我检查)使用参数化查询。 我们正在谈论一种为两件事情所做的语言,即数据库访问和生成HTML,而且两者都很糟糕。

这只是一个令人讨厌的混乱,一个由不合格或不具备能力的人devise的语言。 ;)


对我来说,最糟糕的PHP罪孽是performance与业务逻辑的耦合。 这并不是说你不能以更好的方式写出来,但这并不鼓励你,如果有的话鼓励你不要。

大量的安全漏洞也与PHP站点相关联。 我不能certificate这是不成比例的(毕竟很多网站都是用PHP编写的),但我怀疑是这样。 如果我是正确的,那么因为安全漏洞是一类错误,所以我怀疑PHP站点总的来说更容易出错。

(我不认为指向几个大的网站,并说他们用PHP来设法这么做,反过来也是这样的一个说法,这有点像是香烟不会因为你隔壁的邻居抽烟而导致癌症并活到100)

看看这个类似的问题 – PHP可以处理企业级的网站以及Java

回收 – Facebook,维基百科,Yahoo.com,Digg,Flickr和其他许多巨型网站都运行在PHP上。 如果你接近做出这种口径的东西,你仍然可以放心,你可以用PHP来到那里。

您的应用程序的可维护性,可扩展性,可靠性,安全性和性能完全取决于您,并且与语言无关。 虽然支持PHP,但它为build立Web应用程序提供了非常方便的工具。

对于我来说,谈论大型甚至是巨大的项目,它主要归结为一个词: 依赖关系

脚本语言的问题就像世界上的每一件事情一样:最大的优势是最大的劣势。

最大的好处是编码自由且快速。 只要写一个脚本,它将服务器的目的。 没有繁琐的需要,只是代码。

在某种程度上,最大的缺点是要检查这个脚本是否不妨碍其他脚本。 或者更好:更改其他人依靠的旧脚本。 你确定所有的依赖关系都可以按照你的意愿工作吗?

对于“正常”的网页生成来说,这是不正确的,无论这里有什么常规的手段。 但是我们有一个产品依赖于大约500k行的源代码,客户端的定制也包含额外的10万行代码。 我很高兴编译器检查所​​有依赖关系,并在出现错误的情况下发出警告/错误信息(例如,在这里讲最低级,错误地调用一个variables或方法)。

我认为这一点以及其他语言本质上(即用于“银行用途”的应用程序服务器)提供更简单易用的“企业”特征这一事实使得许多人不认为PHP在大型(或更好:巨大)项目。

我们公司使用PHP运行几个大型网站,并没有任何与语言有关的问题。

这些都是很好的答案。

我是一个新手。 我只编了5年的编码,但是我直接支持和pipe理85个小型到大型的网站,我会告诉你什么,一天网站被起诉的可能性将会对你的学习有很大的帮助如何和做出更好的代码。

听到已有的开发人员分享他们对这个问题的想法真是太好了。 我不认为PHP是最好的,但似乎我在“最佳实践”方面的投资是很好的。

感谢大家!

有一些PHP语言的构造对我来说还不够好。 例如,function的名称。 使用多种方式来命名一种语言的function是非最佳做法。 下划线(function_name),单词粘在一起(函数名)等等之间的混合。我的意思是,这真是一团糟。 有太多的function非常相似或做相同的事情,但他们的名字是如此混乱。 这不是一个好的编程语言的特点。

在大型部署中,语言必须足够简单且具体。 PHP像variablestypes的声明一样省略了,以后变得很难理解和处理。

其他的一点是不断增加的function和取消其他一些。 它假设在PHP 5中添加OOP会使程序员更容易,但是后向兼容性的考虑呢?

这种编程语言是这样的主要原因是由于它的起源:个人主页。 它不是为大型部署而devise的。

我知道有很大的努力使这种语言成为一种企业级的语言,而且我个人正在等待一个足够好的开源服务器端编程语言。 但直到这一天来,它会在桥下运行很多水。

请参阅: http : //www.ukuug.org/events/linux2002/papers/html/php/