PHP面向对象编程还是非面向对象编程?

10

我有一个 Web 应用程序的起始版本,我在编写时没有使用 PHP 的面向对象功能。

我不确定是否值得返回并重写我已经完成的部分。面向对象的 PHP 是否值得重写整个或部分已经工作良好的应用程序?

10个回答

20

考虑到你的应用程序未完成,我认为将其改造成基于对象的应用程序可能会有所帮助。

有一件事需要考虑,那就是最终应用程序的预期大小。在某种复杂度以下,除了学习体验外,基于对象的实现可能过于繁琐。

我最初开始时避开使用对象,因为我在大学课堂上对它们的初步介绍很糟糕。最近,我不得不处理一个使用php对象实现的项目。相比其他项目,所需的更改要容易得多。从那时起,我经常在对象模型中工作,并发现它非常方便快捷,易于维护。


12

就是否同意大多数人的共识而言...在大多数情况下,我会说不需要。对于商业代码来说,这不是学术上的练习。如果它能工作,就不要重写它。如果你必须进去更改/添加代码片段,那么就要向OO实践进行重构(关于重构的SO文章有很多,当你改变代码时,不仅为了改变而进行重构)。

实践中,如果你没有做过很多OOP,那么你会想从小处开始,并逐渐掌握它。

一旦你掌握了基础知识,一本好的设计模式初学者指南(我喜欢Head First的书)非常有用。大多数PHP书籍会教你OOP相当差。他们会教你继承的概念,但通常不会教你松耦合和优先使用组合而不是继承的概念。设计模式书籍将为您提供更深入的了解。

PHP仍然因为没有正确地“运行”OO而声名狼藉。我认为这是不公平的,但这反映了事实,即人们很容易开始而没有真正理解OOP。我会冒险说,大多数(微不足道的51%)PHP程序员不熟悉OOP。我认为在PHP中做好OO是可能的,如果你已经熟悉这门语言,那么这是一个提高技能的好方法。

编辑:

再添加几个免责声明...

  1. 我的评论关于大多数PHP编程师不熟悉OOP,不适用于当前的SO观众!
  2. 如果你不熟悉OOP,不表示我认为你不熟悉

1
我正在努力想出促进更好的PHP代码的方法,但这是一项艰巨的任务... - Levi Morrison

4
典型答案:“这取决于情况。”
我倾向于将显示页面编写为一个从头到尾的脚本页面,从< html >到< /html >。但是在该页面上发生的事情是对象。有点像穷人的ASP。虽然您可以拥有基于OOP的输出,但我始终认为对于像将数据转储到浏览器这样乏味的任务来说,它太繁琐了。
因此,业务规则和数据访问是OOP的。演示文稿是脚本。
如果您有不是OOP的业务规则,我会严肃考虑将其编写为对象,前提是:(1)“您是否有时间/精力/金钱这样做?”和(2)“您是否有一个好的PHP IDE,可以使您的生活更轻松?”如果它有效,并且更改它意味着在Notepad ++中编写,则我会称之为完成。 :-)

2

我不会说这是至关重要的,但如果你打算在应用程序上继续深入发展,我建议现在就这样做,因为这并不是一项艰巨的任务。我认为,一个写得好的面向对象编程的可维护性可能远远超过前期成本。特别是当你考虑到你将能够随着进展逐步重构大部分代码时。


2
学习面向对象技术将非常有用,特别是对于未来在其他语言编程的时候。由于您刚刚开始应用程序,因此可以重写和改进您已经编写的部分,这取决于您的截止日期。

1

有两种可能性:要么你的应用程序只是需要立即工作且永远不会被触及、适应、扩展或修改,或者你的应用程序是你将长期使用并继续开发的一些东西。

如果是前者,请不要破坏完全可用的代码。你有更好的事情要做。

如果是后者,你必须记住PHP的一个重要事实,那就是:编写不良的PHP代码是维护的噩梦。虽然不像糟糕的Perl代码那么糟糕——因为什么比那还糟呢?——但足够糟糕,以至于早晚你会感到一种强烈的冲动,想窃取一台时光机,回到你现在正在维护的代码编写时刻,并用冰锥刺穿你的眼眶。

所以,如果你将来要维护这段代码,请花时间将其正确地完成。这意味着:某种模板系统,没有嵌入HTML中的PHP标记,为不同功能单独创建文件,以及类类类

你的眼眶会感谢你。


0

在我看来,我们PHP程序员可以彻底抛弃对象(类实例)的概念,我们只需要数组和模型类:

初始模式中的所有数组都支持任何数组函数作为其方法:

<?php
$array1->array_flip(this);
?>

使用->mode()来验证最小数据集,然后切换模式类:
<?php
$array1->mode('class1', $success);
?>

任何模式类中都没有->construct(),但有->validate()来验证最小数据集。

在模式中的数组仍然可以使用数组函数作为其方法,但是在使用它们之后,数组将被切换回基本数组模式, 我们需要使用->mode('class1', $success);来切换模式。

根本思想是数据中心编程,我们需要将数据(数组)和活动(类方法)分开。

我们可以修改PHP引擎,摆脱部分面向对象编程(OO),并支持模式类,我们可以称之为MyPHP。

例如:$array_man1可以设置为两种模式:cls_normal_mancls_crazy_man

<?php
$array_man1->mode('cls_normal_man')->normal_method1()->mode('cls_crazy_man')->crazy_method1();
?>

0

我会说尽量使用面向对象编程,因为如果做得好,你所拥有的可以更容易地被重复利用。

我还要说,面向对象比过程化更有组织性。当你处于小规模时,无论是面向对象还是过程化,都很容易逃脱松散的代码。但是当你进入大型项目时,你的过程化必须更加有组织和深思熟虑。而在一些大型项目中,面向对象往往会迫使你更有组织,使事情变得更容易。


0

不需要重写应用程序,如果它能正常工作的话。 PHP实际上并不是真正的面向对象编程。他们很努力,但有时我认为甚至PHP开发人员也不真正理解面向对象编程的意义。 如果你想学习面向对象编程(这肯定是一个好主意),可以尝试使用像Smalltalk这样的真正面向对象编程语言来学习基本概念。Java也是一个不错的选择,虽然它也不完全是面向对象编程。


0

我想重申这里其他答案的观点。它取决于应用程序的大小以及您希望学习有关面向对象编程的程度。不过,我建议小心使用PHP来学习面向对象编程。

至于PHP到底有多少是面向对象的... PHP4对其进行了一些OOP元素的添加,而PHP5更好,但它并没有完全融入语言中。PHP可以两种方式工作,个人而言,我喜欢你可以选择的这种方式。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接