PHP如何面向对象?[关闭]


13

我有机会与同事进行了有趣的对话。他们大多数是Flash操作脚本或Java开发人员。

我们讨论了php处理OOP的能力。我说过,PHP 5.2或5.3可以处理几乎所有OOP内容。我错了吗?我并不想获得是/否的答案,但我想听听开发人员的更多意见。


我回答说,在这里
马丁威克曼

12
语言也不错,程序员也

@Jarrod Roberson:语言是天生的,怎么回事?如果是这样,请参考支持该声明的研究,因为我对阅读它非常感兴趣。
失误

4
@Jarrod,有一些合法的错误语言,尤其是在早期版本中。我想到了Actionscript,Javascript,Java和PHP的早期版本。
约旦

2
@JarrodRoberson,所以设计PHP的程序员...
dan_waterworth

Answers:


34

PHP 5.3实际上对OOP有相当不错的支持。

与OOP有关的PHP问题是,OOP实际上只是固定在该语言上,而在Java和ActionScript之类的语言中,它却是核心概念的一部分,尽管我认为这两种OOP语言都不好,因为它们的对象语义很差。

即使当今的PHP在很大程度上适合OOP,但问题是:

  1. 那里的绝大多数代码库(库,框架,自定义代码)不是用PHP 5.3编写的
  2. API的绝大多数是程序性的。array仍然是最重要和最常用的类型,它不是对象。
  3. 在可预见的将来,绝大多数PHP程序员只会坚持使用过程样式。与Objective-C相反,PHP不促进 OOP:Objective-C将C作为完整子集,因此允许以其最纯粹的形式之一进行过程编程,但是它显然赞成使用OOP。

PHP不能简单地摆脱所有遗留的东西。如果发布了PHP 6,那么大部分将被丢弃,它可能不会被使用。它会达到目的。
PHP无法采取足够的步伐逐步淘汰事物。因此,需要一段时间才能获得良好的语言应具备的必要的清晰度和一致性。

就我个人而言,我真的不喜欢PHP,仅因为所有这些包,API和所有东西。
但是,诸如Flow3,Symfony,CakePHP和Codeigniter之类的框架为OOP和其他强大的范例提供了坚实的基础。由于ActionScript和Java的局限性,需要付出足够的努力(位于PHP缺陷之上的抽象层),PHP可以达到甚至超越它们。

总结:PHP的OOP工具没有什么特别的错误。因此,您可以说这不是一种糟糕的面向对象语言。但是,PHP有很多特别错误的地方,例如OOP设施并不是真正地集成在一起,而只是包含在内,因此您可以说这是一种不好的 OO语言。


4
出于好奇,您能否解释一下为什么您认为Java是糟糕的OOP?
dkuntz2 2011年

2
咳咳 ..我可能会更新你的回答要具体为ActionScript 3。在此之前,Actionscript并非设计为面向对象的(基于ECMA),甚至Actionscript 2也只是AS1的包装。
Demian Brecht

1
我也很好奇您为什么认为Java是一种糟糕的OOP语言
星光灿烂的人

2
@Demian Brecht:Douglas Crockford似乎相对相信JavaScript(任何ECMA脚本)都是OO:javascript.crockford.com/javascript.html
back2dos,

2
区别可以很好地说明这一点:PHP具有对象能力,而不是面向对象的。
vartec

11

您会发现“ 可以处理 ”与“ 支持 ”不同。我的意思是,如果精巧地构造代码,即使有点儿困难,即使C” 也可以处理 “ OOP。问题在于,该语言是否超越了使 OOP成为最自然的编程方式来鼓励OOP的能力。

以我的经验(绝对有限),PHP 5.n的方言不这样做。滑出OOP进入几乎纯粹的过程代码太容易了。(请注意,出于这个原因,我认为PHP并不是一门糟糕的语言。有很多原因使我认为PHP是一门糟糕的语言,但OOP支持并不是其中之一。))


12
伙计,我可能会长久以来一直这样,月亮。以下是失败的代码段:$e = function_that_returns_an_array()[0];。要解决此问题,请执行以下操作:$a = function_that_returns_an_array(); $e = $a[0];。语法不允许您直接使用函数调用结果的语言会打倒我。另外,请告诉我以下数字是十进制:0246875。(提示:您将无法找到一种愚蠢的方式来实现该词法分析器!)PHP真是充满了这种愚蠢。
只是我的正确观点,

6
@Moon这是为您准备的一些阅读材料:softwarebashing.org/blog/2009/09/php-the-ultimate-sucktommorris.org/wiki/PHP%20Sucks有一些严重的问题,但很多问题只是个问题采摘。我真正讨厌PHP的是文化,它根本不像ruby和python那样专业或学术。替代方案更好,它们吸引了最好的程序员。例如,ruby和python都具有交互式外壳,不错的功能和简洁的语法。它们使用起来更加有趣。除了共享虚拟主机中的市场份额外,为什么还要使用php?
Keyo

8
“只有两种语言:人们抱怨的语言和没人使用的语言。” Bjarne Stroustrup。幽思。
西尔维德拉格(Sylverdrag)2011年

4
@JUST,谢天谢地,他们已修复5.4中的数组取消引用问题
查尔斯

5
Stroustrup只是很生气C ++是人们所追求的语言之一。
我的正确观点

8

语言的面向对象确实有两个定义:面向对象是它自己在语法和标准库中的内置对象,以及它对程序员编写的软件有什么影响。

根据第一个定义,PHP似乎是列表的底部。人们经常引用非对象字符串和数组作为证据。我认为,这个定义并不重要。如果确实需要,可以始终将其包装在一个对象中,但是人们不需要,因为他们不需要。通常,它将对代码产生的唯一变化function(var)var.function()。语法本身不能将非OOP更改为OOP。

至于第二个定义,人们即使在使用强烈执行这种构造的语言中也设法编写出差的面向对象的代码,而编写好的面向对象的代码的人则几乎不受语言的影响,除了被语法怪癖所困扰。换句话说,根据我的经验,没有不良的面向对象语言,只有不良的面向对象程序员。在这方面,PHP与其他任何语言一样出色。

也许某些语言更适合于学习面向对象的编程,但是我认为开发人员会有所不同。对我来说,直到我读了拉里·沃尔(Larry Wall)的有关perl怎么做(没有?)的骆驼书,它才被点击。必须明确地保佑引用属于一个类,这确实使我明白了对象的实例与类的真正含义。有些人赞成Java的“全对象全时”学习方法。由于OOP更加关注体系结构,因此在您了解基本变量,表达式,序列,选择和迭代之后,更容易学习,因此我认为任何不立即面向OOP的语言都具有教育优势。

当我的妻子向我介绍Java编程课程时,她一直对public static void main并将所有内容放到一个班上感到沮丧,她还没有什么背景知识,但是老师告诉她只是为了相信自己需要它。我试图对此进行解释,但是很难向一个刚刚了解变量的人解释,为什么它对于防止代码的其他部分访问它们会很有用,以及如何决定如何对其进行拆分。您可能会争辩说,学习过程编程首先会养成不良习惯,但是复制和粘贴您不了解的代码的习惯又如何呢?


似乎术语“对象”,“语言”,“面向对象”和“编程”尚未达成共识,并且模棱两可和相对,因此不可能有黑白答案。但是同样没有同意“黑色”和“白色”,其含义难以捉摸,等等。等等
TulainsCórdova2013年

5

PHP 对于面向对象的编程来说还不错。但是,PHP的性质鼓励快速进行黑客攻击和修复,而不是进行适当的面向对象的软件开发,并且许多书籍和教程都完全忽略了OOP概念。它可以很好地支持OOP概念,但是开发人员有责任应用它们。您可以使用PHP来执行大多数操作,而这些操作都可以使用诸如Java或C#之类的“真正” OOP语言来完成,但是与PHP相比,这些语言对OOP技术的执行更多,如果您愿意,可以使用过程样式。

我记不清确切的报价了,但有人将原始PHP与使用当时新的Ruby on Rails进行了比较,结果是这样的:Rails使编写好代码变得容易,而编写坏代码则变得很困难。PHP使编写错误代码变得容易,而使编写良好代码变得困难。 有关PHP的代码几乎是在OOP中总结的;它完全有能力成为一种好的OO语言,但是这样做却有些困难。


4

PHP分类

就像BASH或Perl一样,PHP只是一种粘合语言。擅长于此,但别无所求,可省去一些认真的工作。语言不是经过设计的。它只是通过随意混合(代码固定)的各种代码来演变而来的。

编译语言

与PHP相反,Java是经过适当设计的编译语言。有定义语言的JSR,许多企业级框架和概念,例如EJB,JMS,ESB,Spring,Struts,Hibernate等。

企业软件

在企业系统方面,Java EE是适合此目的的解决方案(企业版),而PHP用于试图通过雇用具有较低资格的廉价劳动力来降低成本的公司。

已经进行了相当大的努力,以使用各种框架将PHP拖入企业版。最值得注意的是Zend Framework 2。这里的根本问题不是PHP的面向对象,而是缺乏设计,缺少强类型,缺少标准问题的非标准解决方案(包括各种漏洞)以及完全缺少任何规定的体系结构。

软件设计(讨论架构)

使用PHP,架构软件的负担仍然完全由那些做得很差的开发人员来承担,即,他们通常根本没有任何架构,而只是随机编码和修复。安全性和交易缺失,需要开发人员来纠缠。在Java中,一种解决方案是带注释的EJB。还请考虑以下事实:在PHP中,如果忽略捕获异常或产生各种错误,则不会发生任何事情。那是直到运行时。使用Java,您将在设计时直接收到警告和错误。这就是所谓的健壮性,但是使用PHP只能继续做梦。

多线程

PHP不支持多线程。该代码始终是单个线程。这阻碍了其在较重负载下解决非凡问题的性能。使用Java EE,例如通过Runnable接口完全支持多线程。

支持和标准

还请考虑部署,Web服务和其他标准。在Java中,有像Oracle,IBM,RedHat,Apache等许多大公司,而PHP只有Zend。

结论

总而言之,PHP是一种非常糟糕的面向对象语言。严格来说,它甚至不是面向对象的,而是混合的,从版本> 5开始,它是不好的,因为OOP与过程编程混合在一起。我只会推荐PHP作为BASH之类的粘合剂,但是对于严肃的工作,我将使用Java EE。

相关思想

最新的Zend Framework 2的主要特点是它试图像Java EE,但是完全无法提供至少一组远程可比的可用软件包,功能,工具,自动化,错误检查,体系结构,设计和一切。

以我的经验,将PHP用于复杂项目比使用Java更昂贵。

还有一些谣言,例如PHP代表“漂亮恐怖编程”。我可以确认这些。


3

语言处理OOP的能力如何?我想问一下我可以用OO方式编写程序的程度如何。我可以通过将所有内容都设为static来对Java应该采取的一切态度表示赞同
PHP支持OOP;它不强迫我仅以面向对象的方式编写。它处理得如何好取决于我以一种面向对象的方式理解和编写程序的能力。


2

PHP支持特质!(从5.4开始)。在我的书中,任何可以本地处理水平重用的语言都是一种很好的面向对象语言。


1

好吧,我们必须考虑是什么使语言更加面向对象,又有什么原因使它像这样。

JavaScript是ECMAScript的一种实现,可以在浏览器环境中以解释语言运行。人们认为它是解释性语言这一事实​​对其句法/行为设计产生了很大影响。

例如,它不遵循OOP。但是除了有很多类似的事实外,OO语法师可能会发现其某些行为(如函数提升)非常令人困惑。

OO语言再次带来了很多东西,例如C ++,Java和C#,使它们像强类型一样高效地进行编译。但是,由于JS在解释环境中运行,因此它不遵循强类型,而是松散类型的语言。

除了上述行为差异外,还有许多语法上的差异,例如JS具有对象文字表示法,这很可能会使C#程序员感到困惑。但是,C#确实具有类似于Object Object的语法,即使它是经过编译的语言,并且这种语法也很少使用,因为它不是传统上的OO代码样式。

现在,还有另一点指示该语言是否是好的OO:它是从C ++演变而来的。随着Java,C#从C ++演变而来,并遵循相似的行为和语法,一个大社区确实将这种行为和语法视为唯一的OO事物,并认为任何不抑制此类相似性的语言都不是OO。

但是,让我们不要忘记OO是一个非常抽象的概念,它不与任何语法样式相关,甚至与任何特定的行为特性无关。

和PHP很好。只是看起来和感觉不像Java,C ++,C#并不会使它成为不良的OO语言。好吧,我学习了C ++,然后学习了Java,然后学习了C#。

所以,直到现在我的头都很好。然后,我从一本非常不错的书《 Wrox Pro》中学习了JS,这简直太夸张了。我只是喜欢JS的行为和语法独特性。然后,我意识到像Object一样的语法在C#中。现在,在学习PHP的同时,我感觉好像它带来了来自两个世界的许多东西。

我们真正要做的就是在实现OO时学习语言所具有的语法和行为精妙之处。一旦掌握了它们,我们可能会开始认为这是更好的OO实现。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.