我读过一些帖子,其中有人说(不建议、不讨论、不提供)PHP 不应该用于大型项目。
作为一名主要的 PHP 开发人员,我问了两个问题:
- 什么定义了“大型项目”?
- 为什么不?使用PHP有哪些陷阱
我经营着一个小型开发团队,从经验中我知道质量构建、组织、文档、评论和封装是我们的首要任务。我们能够使用我们自己的框架和方法开发伟大的项目,但如果我在浪费时间,我仍然不想进一步投资。
想法?
我读过一些帖子,其中有人说(不建议、不讨论、不提供)PHP 不应该用于大型项目。
作为一名主要的 PHP 开发人员,我问了两个问题:
我经营着一个小型开发团队,从经验中我知道质量构建、组织、文档、评论和封装是我们的首要任务。我们能够使用我们自己的框架和方法开发伟大的项目,但如果我在浪费时间,我仍然不想进一步投资。
想法?
我真的很讨厌人们直截了当地说 PHP 是一种糟糕的语言,因为您可以编写将表示与逻辑混合在一起的代码,或者它允许您进行 SQL 注入。这与语言无关,那是开发人员。
PHP 已证明自己具有高度可扩展性:Wikipedia 是 Internet 上最大和最受欢迎的站点之一,它运行 PHP。说够了?
有很多工具/库可以为您提供工作框架,从而减少有人编写糟糕、难以维护的代码的可能性:参见 CakePHP、Symfony、PDO、Smarty 等。
它受到了不好的评价,因为它是一种进入门槛非常低的语言:它是免费的,你可以获得非常便宜的 PHP 托管,文档是最好的,网上有很多教程,而且它做了很多事情非常容易(例如:打开一个 URL 并获取文件的内容:)file('http://www.google.com');
。这意味着很多新手都选择了它,并用它制作了很多非常狡猾的网站,但无论你选择什么语言作为你的第一个,这都会发生。
使用一个可靠的 ORM 框架(关于 SO 有大约 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()
但你会惊讶于人们不这样做的频率);和出于上述所有原因,我个人更喜欢 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 开发人员不断弃用内置函数和低级功能。一个很好的例子是当他们弃用函数的传递引用时。这对任何做函数回调的人来说都是一场噩梦。
重新设计时缺乏考虑。上述弃用在许多情况下消除了为函数提供默认关键字值的能力。他们在 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,这两者都很糟糕。
这只是一个令人讨厌的混乱,一种由没有资格或能力设计语言的人设计的语言。;)
对我来说,PHP 最糟糕的罪过是表示与业务逻辑的耦合。并不是说您不能以更好的方式编写它,而是它不鼓励您这样做,如果有的话,它鼓励您不要这样做。
大量的安全漏洞也与 PHP 站点有关。我无法证明它是不成比例的(毕竟很多网站都是用 PHP 编写的),但我怀疑它是。如果我是对的,那么由于安全漏洞是一类错误,我怀疑 PHP 网站总体上也倾向于更多错误。
(顺便说一句,我不认为指向几个大型网站并说他们设法用 PHP 做到这一点是反对这一点的任何论据。这有点像说香烟不会致癌,因为你的隔壁邻居吸烟并活到100岁。)
看看这个类似的问题 - PHP 可以处理企业级网站以及 Java
Recapping - Facebook、Wikipedia、Yahoo.com、Digg、Flickr 和许多其他大型网站都在 PHP 上运行。如果您曾经接近于制作那种水准的东西,您仍然可以放心,您可以使用 PHP 实现目标。
您的应用程序的可维护性、可扩展性、可靠性、安全性和性能如何完全取决于您,并且与语言无关。虽然支持 PHP,但它有非常方便的工具来构建 Web 应用程序。
对我来说,谈到大型甚至大型项目,它(主要)归结为一个词:依赖关系。
脚本语言的问题就像世界上的每一件事一样:最大的优势同时也是最大的劣势。
最大的优势是编码免费且快速。只需编写一个脚本,它就会达到它的目的。无需冗长,只需编写代码。
在某种程度上,最大的缺点是检查这个脚本是否不会干扰其他脚本。或者更好:更改其他人依赖的旧脚本。您确定所有依赖项都按您的意愿工作吗?
这对于“正常”网页生成来说是不正确的,无论正常在这里是什么意思。但是我们有一个产品依赖于大约 500k 行源代码,为客户定制的代码也包含额外的 100k 行代码。而且我非常高兴编译器检查所有依赖项并警告/错误我以防我做错了什么(比如,在这里说最低级别,错误输入变量或方法调用)。
我认为这一点以及其他语言本质上提供更易于使用的“企业”功能(即用于“银行用途”的应用程序服务器)的事实归结为为什么许多人看不到大型 PHP(或更好:巨大)项目。
我们公司使用 PHP 运行了几个大型网站,并且没有遇到与语言相关的问题。
PHP 语言的构造对我来说还不够好。例如,函数的名称。使用多种方法以一种语言命名函数不是最佳实践。下划线(function_name)、单词粘在一起(functionname)等之间的混合。我的意思是,这真是一团糟。有太多的功能非常相似或做同样的事情,但他们的名字是如此混乱。这不是好的编程语言的特征。
在大型部署中,语言必须足够简单和具体才能编写。PHP 省略的一些东西,比如变量类型的声明,在以后变得非常难以理解和处理。
另一点是不断添加功能和取消其他一些功能。它假设在 PHP 5 中添加 OOP 将使程序员的事情变得更容易,但是向后兼容性的考虑呢?
这种编程语言之所以如此,主要原因在于它的起源:个人主页。它不是为大型部署而设计的。
我知道要使这种语言成为企业级语言需要付出很大的努力,而就我个人而言,我正在等待一种足够好的开源服务器端编程语言;但在这一天到来之前,桥下会流很多水。
这些都是很好的答案。
我是个新手。我只写了 5 年代码,但我直接支持和管理 85 个小型到大型网站,我会告诉你,网站关闭一天可能会被起诉,这对你的学习欲望有很大帮助如何制作更好的代码。
很高兴听到成熟的开发人员分享他们对此事的看法。我不认为 PHP 是最好的,但似乎我对“最佳实践”的投资得到了很好的服务。
谢谢大家!