题
我读过一些帖子,人们指出(没有建议、没有讨论、没有提供)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 中的数据库抽象(恕我直言)很糟糕。这是供应商特定的。使用 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_map 。array_filter 在简单的情况下很烦人,并会引发各种意外行为或更糟糕的行为。
PHP 开发人员不断弃用内置函数和较低级别的功能。一个很好的例子是他们弃用了函数的引用传递。这给任何从事函数回调等工作的人带来了一场噩梦。
重新设计时缺乏考虑。在许多情况下,上述弃用消除了为函数提供默认关键字值的能力。他们在 PHP 5 中修复了这个问题,但在 PHP 4 中弃用了引用传递!
名称空间执行不佳(以前根本没有名称空间)。现在名称空间已经存在,我们使用什么作为取消引用字符?反斜杠!该字符普遍用于转义,甚至在 PHP 中也是如此!
过于宽泛的隐式类型转换会导致错误。我对隐式转换没有问题,例如从浮点到整数或再返回。但是 PHP(我上次检查过)会很乐意尝试神奇地将数组转换为整数。
递归性能较差。递归对于任何语言的写作来说都是一个非常重要的工具。它可以使复杂的算法变得更加简单。糟糕的支持是不可原谅的。
函数不区分大小写。我不知道他们对此有何想法。编程语言是一种明确地向计算机和代码阅读器指定行为的方法。不区分大小写会带来很多歧义。
PHP 鼓励(实际上需要)处理与表示的耦合。是的,您可以编写不这样做的 PHP,但实际上以不正确的(从合理设计的角度来看)方式编写代码更容易。
如果没有缓存,PHP 的性能就很糟糕。有人出售 PHP 的商业缓存产品吗?哦,看,PHP 的设计者就是这么做的。
最糟糕的是,PHP 让人们相信设计 Web 应用程序很容易。它确实使所涉及的大部分工作变得更加容易。但事实是,设计一个既安全又高效的 Web 应用程序是一项非常困难的任务。
通过说服这么多人开始编程,PHP 教会了整个程序员群体的坏习惯和坏设计。它使他们能够访问他们不了解如何安全使用的功能。这导致了 PHP 不安全的名声。
(但是,我承认 PHP 并不比任何其他 Web 编程语言更安全或更不安全。)
我对 PHP 缺少什么?我看到一种自然生长、管理不善的语言正在滋生糟糕的程序员。
所以请说服我否则!
最受好评的答案
我会尽力回应您的每一个要点
PHP的内置和库功能的命名不一致。可预测的命名模式在任何设计中都很重要。
我对这个话题既爱又恨。因为从本质上讲,这个问题是正确的。为什么有些双字函数用下划线分隔,而有些则不然?为什么 Needle 和 haystack 参数有时会交换参数签名中的位置?这太荒谬了。但最终...这真的重要吗?我的 IDE 带有智能感知和 php.net,只需点击一下浏览器即可,这只是简单的没什么大不了的。这是对 PHP 作为一种语言的负面影响吗?是的。它会妨碍我成为一名高效程序员的能力吗?不。
PHP开发人员不断贬低内置功能和较低级别的功能。一个很好的例子是,当他们对功能的逐步推荐弃用时。这为任何人(例如功能回调)创造了一场噩梦。
就我个人而言,我认为这不是一个好点。弃用对于一种语言的发展是必要的,尤其是像 PHP 这样有很多缺陷的语言。PHP 因为“很容易成为一个糟糕的程序员*”而受到很多批评,但与此同时,当 PHP 小组试图从语言中删除愚蠢的结构(例如调用时间传递)时,他们也遇到了麻烦-参考。消除呼叫时间传递参考是他们做过的最好的举措之一。对于新手开发者来说,没有比这个“功能”更容易搬起石头砸自己脚的方法了。
重新设计时缺乏考虑。上述折旧消除了在许多情况下为函数提供默认关键字值的能力。他们在PHP 5中修复了这一点,但他们在PHP 4中逐渐弃用了传递!
我不认为普遍缺乏考虑,我认为你只是被这个特殊的变化刺痛了,嘴里留下了酸味。语言的变化通常会提前几个月甚至几年就知道。提供了从 4 到 5 的迁移指南,并且版本差异记录在手册中。调用时传递引用是一个可怕的“功能”,并且不给开发人员任何通过其他方式无法获得的表达能力。我很高兴它消失了(还有其他垃圾,比如魔术引语)
名称空间的执行不佳(以前根本没有名称空间)。现在,这个名称空间存在,我们将其用作解除字符?反斜杠!即使在PHP中,角色都普遍逃脱!
对此我五味杂陈。我的一部分认为“谁在乎,无论如何,字符转义在字符串之外没有任何意义”,我的一部分认为“他们肯定可以使用更好的东西”。但他们可以吗?我不知道,我不是 Zend 解析器的开发人员。PHP 在 5.3 之前根本没有命名空间,这是一个巨大的疏忽吗?是的,一点没错。
过度的Broad隐式类型转换会导致错误。我对浮动到整数或再次返回的隐式转换没有问题。但是PHP(我最后检查)将很乐意尝试将数组神奇地转换为整数。
我认为可以不同意 PHP 是如何做到这一点的,但不同意它使该语言变得“糟糕”。但问我有多想坐在这个话题上争论弱类型和强类型。(附注我不, 根本不) 作为记录:当参数的类型很重要且无法通过强制解决时,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)如何切换到以及如何切换到和学习,是替代方案之一。
也许事实上,人们还有什么选择呢?应用服务提供商?它本身就有很多问题,从无法在大多数网络服务器(Apache)上运行,到其本身的一些荒谬和过度设计的设计选择(网络表单?视图状态?AJAX,您的异步请求被拦截并运行 依次地?)红宝石在轨道上?好吧,也许,除了有多少网络服务器再次支持它?目前它并不容易接近。而且速度很慢。所以也许PHP的“实力”真的就是没有 好的 存在替代方案。至少这就是为什么我尽可能远离所有网络编程的原因。PHP 很糟糕,而且我也不太热衷于任何替代方案。
PHP 有很多基本问题,甚至一点都不好笑。从缺乏 unicode 支持,到许多隐式类型转换(通常会导致意外的安全漏洞),到表示和...的完全混合。其他所有内容,或默认数据库模块(我上次检查)不使用参数化查询。我们谈论的是一种为两件事而设计的语言:数据库访问和生成 HTML,而它在这两方面都很糟糕。
它只是一团糟,一种由没有资格或能力设计语言的人设计的语言。;)
对我来说,最严重的 PHP 罪过是表示与业务逻辑的耦合。这并不是说你不能以更好的方式编写它,而是它不鼓励你这样做,甚至鼓励你不要这样做。
PHP 站点也存在大量安全漏洞。我无法证明这是不成比例的(毕竟很多网站都是用 PHP 编写的),但我怀疑确实如此。如果我是对的,那么由于安全漏洞是一类错误,我怀疑 PHP 网站总体上也更容易出现错误。
(顺便说一句,我认为指出一些大型网站并说他们设法用 PHP 做到这一点并不是反对这一点的理由。这有点像说香烟不会致癌,因为你的隔壁邻居抽烟并且活到了 100 岁。)
看看这个类似的问题 -PHP 可以像 Java 一样处理企业级网站吗
回顾 - Facebook、维基百科、Yahoo.com、Digg、Flickr 和许多其他大型网站都在 PHP 上运行。如果您曾经接近制作出这样的作品,您仍然可以放心使用 PHP 来实现这一目标。
您的应用程序的可维护性、可扩展性、可靠性、安全性和性能完全取决于您,并且与语言无关。不过,PHP 拥有非常方便的构建 Web 应用程序的工具。
对我来说,谈论大型甚至巨大的项目,它(主要)可以归结为一个词: 依赖关系.
脚本语言的问题就像世界上所有事情一样:最大的优点同时也是最大的缺点。
最大的优点是可以免费且快速地编写代码。只需编写一个脚本即可实现其目的。不需要冗长的内容,只需编写代码即可。
在某种程度上,最大的缺点是检查该脚本是否不会干扰其他脚本。或更好:更改其他人依赖的旧脚本。您确定所有依赖项都按照您的预期运行吗?
对于“正常”网页生成来说,情况并非如此,无论“正常”在这里意味着什么。但我们的产品依赖于大约 50 万行源代码,并且为客户端进行的定制也包含额外的 10 万行代码。我非常高兴编译器会检查所有依赖项,并在我做错事情时发出警告/错误(例如,在这里说最低级别,错误输入变量或方法调用)。
我认为这一点以及其他语言本质上提供了更易于使用的“企业”功能(即用于“银行用途”的应用程序服务器)总结了为什么许多人没有看到大型 PHP(或者更好的是:巨大)的项目。
PHP 语言的构建有些地方对我来说还不够好。例如,函数的名称。使用多种方法来用一种语言命名函数并不是最佳实践。下划线(函数名)、单词粘在一起(函数名)等的混合。我的意思是,这真的是一团糟。有太多的函数非常相似或做相同的事情,但它们的名称却很混乱。这不是好的编程语言的特征。
在大型部署中,语言必须足够简单且易于编写。PHP 省略的一些东西,比如变量类型的声明,会变得非常难以理解和处理。
另一点是不断添加功能并取消一些其他功能。假设 PHP 5 中添加 OOP 会让程序员的事情变得更容易,但是向后兼容性的考虑呢?
这种编程语言之所以如此,主要原因在于它的起源:个人主页。它不是为大型部署而设计的。
我知道人们正在付出巨大的努力来使这种语言成为企业级语言,并且就我个人而言,我正在等待一种足够好的开源服务器端编程语言;但直到这一天到来之前,桥下将会流很多水。
我们公司使用 PHP 运行多个大型网站,并且没有遇到与该语言相关的问题。
这些都是很好的答案。
我是个新手。我只编码了 5 年,但我直接支持和管理 85 个大大小小的网站,我会告诉你,网站关闭一天而被起诉的可能性将极大地激发你的学习欲望如何编写更好的代码。
很高兴听到成熟的开发人员分享他们对此事的想法。我不认为 PHP 是最好的,但看来我对“最佳实践”的投资得到了很好的回报。
感谢大家!