64

我读过一些帖子,其中有人说(不建议、不讨论、不提供)PHP 不应该用于大型项目。

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

  1. 什么定义了“大型项目”?
  2. 为什么不?使用PHP有哪些陷阱

我经营着一个小型开发团队,从经验中我知道质量构建、组织、文档、评论和封装是我们的首要任务。我们能够使用我们自己的框架和方法开发伟大的项目,但如果我在浪费时间,我仍然不想进一步投资。

想法?

4

11 回答 11

98

我真的很讨厌人们直截了当地说 PHP 是一种糟糕的语言,因为您可以编写将表示与逻辑混合在一起的代码,或者它允许您进行 SQL 注入。这与语言无关,那是开发人员。

PHP 已证明自己具有高度可扩展性:Wikipedia 是 Internet 上最大和最受欢迎的站点之一,它运行 PHP。说够了?

有很多工具/库可以为您提供工作框架,从而减少有人编写糟糕、难以维护的代码的可能性:参见 CakePHP、Symfony、PDO、Smarty 等。

它受到了不好的评价,因为它是一种进入门槛非常低的语言:它是免费的,你可以获得非常便宜的 PHP 托管,文档是最好的,网上有很多教程,而且它做了很多事情非常容易(例如:打开一个 URL 并获取文件的内容:)file('http://www.google.com');。这意味着很多新手都选择了它,并用它制作了很多非常狡猾的网站,但无论你选择什么语言作为你的第一个,这都会发生。

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

于 2008-12-22T00:21:43.973 回答
34

很多说不使用它的人实际上是在说不要使用 PHP 4。归根结底是这样

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

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

PHP 经常可以使自己成为纠结的意大利面条代码库,并使您的“应用程序”实际上只是一系列脚本(参见 Moodle 以获得一个很好的例子......)

我认为很多“不要将 PHP 用于大的东西”来自 PHP 的原始目的:模板语言。我可以理解,但是有很多项目证明你可以做到(Drupal、mediawiki、Facebook)。

于 2008-12-21T23:58:13.380 回答
19

没有理由不能将 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 等)?

于 2008-12-22T00:00:51.597 回答
18

由于我链接的问题已被删除,我将在此处放置一些问题:

问题


我在另一个问题线程中发表了一个诙谐的评论,称 PHP 是一种糟糕的语言,但它却像疯了一样被否决了。显然这里有很多人喜欢 PHP。

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

以下是我不喜欢它的原因:

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

  • PHP 的内置函数的参数顺序不一致,例如 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 参数有时会在参数签名中交换位置?这太荒谬了。但归根结底……这真的重要吗?我的带有智能感知和 php.net 的 IDE 只需单击浏览器即可,这很简单,没什么大不了的。它对 PHP 作为一种语言有负面影响吗?是的。它会妨碍我成为一名有效的程序员的能力吗?不。

PHP 开发人员不断弃用内置函数和低级功能。一个很好的例子是当他们弃用函数的传递引用时。这对任何做函数回调的人来说都是一场噩梦。

就个人而言,我认为这不是一个好点。弃用对于一门语言的发展来说是必要的,尤其是像 PHP 一样有缺陷的语言。PHP 因“轻松成为一名糟糕的程序员*”而受到很多抨击,但与此同时,当 PHP 团队试图从语言中删除愚蠢的结构时,例如调用时传递-参考。消除调用时间传递引用是他们做过的最好的举措之一。对于新手开发人员来说,没有比使用此“功能”更容易的方法了。

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

我不认为普遍缺乏考虑,我认为你只是被这种特殊的变化刺痛了,嘴里一直有酸味。语言变化通常提前几个月甚至几年就知道了。为从 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 的“优势”真的是没有好的替代品存在。至少这就是为什么我尽可能远离所有 Web 编程。PHP 很烂,而且我也不太热衷于任何替代方案。

PHP 有很多基本问题,甚至都不好笑。从缺乏 unicode 支持,到许多经常导致意外安全漏洞的隐式类型转换,到完全混合表示和......其他所有内容,或者到不使用的默认数据库模块(最后我检查过)参数化查询。我们正在谈论一种为两件事而设计的语言,数据库访问和生成 HTML,这两者都很糟糕。

这只是一个令人讨厌的混乱,一种由没有资格或能力设计语言的人设计的语言。;)


于 2008-12-22T00:00:19.023 回答
4

对我来说,PHP 最糟糕的罪过是表示与业务逻辑的耦合。并不是说您不能以更好的方式编写它,而是它不鼓励您这样做,如果有的话,它鼓励您不要这样做。

大量的安全漏洞也与 PHP 站点有关。我无法证明它是不成比例的(毕竟很多网站都是用 PHP 编写的),但我怀疑它是。如果我是对的,那么由于安全漏洞是一类错误,我怀疑 PHP 网站总体上也倾向于更多错误。

(顺便说一句,我不认为指向几个大型网站并说他们设法用 PHP 做到这一点是反对这一点的任何论据。这有点像说香烟不会致癌,因为你的隔壁邻居吸烟并活到100岁。)

于 2008-12-22T00:07:21.287 回答
2

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

Recapping - Facebook、Wikipedia、Yahoo.com、Digg、Flickr 和许多其他大型网站都在 PHP 上运行。如果您曾经接近于制作那种水准的东西,您仍然可以放心,您可以使用 PHP 实现目标。

您的应用程序的可维护性、可扩展性、可靠性、安全性和性能如何完全取决于您,并且与语言无关。虽然支持 PHP,但它有非常方便的工具来构建 Web 应用程序。

于 2008-12-22T00:36:26.517 回答
2

对我来说,谈到大型甚至大型项目,它(主要)归结为一个词:依赖关系

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

最大的优势是编码免费且快速。只需编写一个脚本,它就会达到它的目的。无需冗长,只需编写代码。

在某种程度上,最大的缺点是检查这个脚本是否不会干扰其他脚本。或者更好:更改其他人依赖的旧脚本。您确定所有依赖项都按您的意愿工作吗?

这对于“正常”网页生成来说是不正确的,无论正常在这里是什么意思。但是我们有一个产品依赖于大约 500k 行源代码,为客户定制的代码也包含额外的 100k 行代码。而且我非常高兴编译器检查所​​有依赖项并警告/错误我以防我做错了什么(比如,在这里说最低级别,错误输入变量或方法调用)。

我认为这一点以及其他语言本质上提供更易于使用的“企业”功能(即用于“银行用途”的应用程序服务器)的事实归结为为什么许多人看不到大型 PHP(或更好:巨大)项目。

于 2008-12-22T00:38:54.110 回答
1

我们公司使用 PHP 运行了几个大型网站,并且没有遇到与语言相关的问题。

于 2008-12-21T23:47:33.637 回答
1

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

在大型部署中,语言必须足够简单和具体才能编写。PHP 省略的一些东西,比如变量类型的声明,在以后变得非常难以理解和处理。

另一点是不断添加功能和取消其他一些功能。它假设在 PHP 5 中添加 OOP 将使程序员的事情变得更容易,但是向后兼容性的考虑呢?

这种编程语言之所以如此,主要原因在于它的起源:个人主页。它不是为大型部署而设计的。

我知道要使这种语言成为企业级语言需要付出很大的努力,而就我个人而言,我正在等待一种足够好的开源服务器端编程语言;但在这一天到来之前,桥下会流很多水。

于 2009-10-02T01:33:50.443 回答
0

这些都是很好的答案。

我是个新手。我只写了 5 年代码,但我直接支持和管理 85 个小型到大型网站,我会告诉你,网站关闭一天可能会被起诉,这对你的学习欲望有很大帮助如何制作更好的代码。

很高兴听到成熟的开发人员分享他们对此事的看法。我不认为 PHP 是最好的,但似乎我对“最佳实践”的投资得到了很好的服务。

谢谢大家!

于 2008-12-22T06:04:24.563 回答
0

见:http ://www.ukuug.org/events/linux2002/papers/html/php/

于 2010-05-29T07:10:55.120 回答