关于oop:面向对象还是不面向PHP?

关于oop:面向对象还是不面向PHP?

PHP Object Oriented or not?

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

我真的不知道返回并重写我已经完成的部分是否值得。面向对象的PHP是否值得重写一个体面的应用程序的全部或一部分?


鉴于您的应用程序不完整,我想说将其重新构建为基于对象的应用程序可能会有所帮助。

要考虑的一件事是最终应用程序的预期大小。在一定复杂度以下,除了学习经验以外,基于对象的方法可能会过大。

我开始避开像瘟疫之类的物体,因为我在大学类上对它们的最初介绍很糟糕。最近我不得不从事一个在php对象中实现的项目。进行所需的更改比其他项目容易得多。从那以后,我就经常在对象模型中工作,发现它非常方便快速创建和维护。


只是不同意共识...在大多数情况下,我不会说。无论如何,这不是关于商业代码的学术练习。如果它可以正常工作,请不要重写它。如果您必须去更改/添加位,则应按照面向对象的实践进行重构(无论如何,不?鼋龀鲇诖四康模琒O上有很多关于重构的文章。)

在实践中,如果您没有做很多OOP,那么您将从小处着手,并对此有所了解。

一旦您掌握了基础知识,良好的初学者设计模式指南(我喜欢Head First本书)将非常有用。大多数PHP书籍都会教给OOP相当差的知识。他们教您有关继承的知识,但通常不会教您有关松散耦合和偏爱继承而不是继承的知识。一本设计模式书将使您对此有更深入的了解。

PHP仍然因无法正确执行" OO"而享有盛誉。我认为这不公平,但这反映了这样一个事实,即人们无需真正理解OOP就可以轻松上手。我会大吃一惊,说大多数PHP程序员(称其微不足道-称其为51%)对OOP不满意。我认为用PHP进行良好的OO是有可能的,如果您已经熟悉该语言,那么这是一种提高技能的好方法。

编辑:

只需添加一些免责声明...

  • 我对大多数PHP程序员不熟悉OOP的评论不适用于当前的SO读者!
  • 不建议您对OOP不满意,这适用于您不熟悉OOP的情况

  • 典型答案:"取决于。"

    我倾向于将显示页面写为从头开始,从到脚本页面。但是该页面上发生的事情是对象。金达就像一个穷人的ASP。虽然您可以具有基于OOP的输出,但我一直认为对于将数据转储到浏览器这样繁琐的任务来说,它太麻烦了。

    因此,业务规则和数据访问是面向对象的。演示文稿是脚本。

    如果您有不是OOP的业务规则,我会认真考虑在两??个条件下将它们写为对象:(1)是"您有时间/精力/金钱吗?",(2)是"您有一个好的PHP IDE,可以使您的生活更轻松吗?"如果它有效,并且更改它意味着在Notepad中编写,那么我将其称为完成。 :-)


    学习面向对象的技术将非常有用,尤其是将来使用其他语言进行编程时。

    由于您只是刚刚启动了应用程序,因此可以重写和改进您编写的部分。这取决于您的截止日期。


    我不会说这很关键,但是如果您要进一步使用该应用程序,我建议您现在就进行操作,尽管这并不是一项艰巨的任务。我要说,一个编写良好的OOP程序的可维护性可能会远远超过前期成本。尤其是当您考虑到您将能够在进行过程中重构许多代码时。


    有两种可能性:要么您的应用程序是一次性的,仅需立即运行,就永远不会被触摸,改编,扩展或修改,否则您的应用程序将成为您将继续使用的东西的开始并长时间使用。

    如果是前者,请不要破坏完全可用的代码。您的时间与您有更好的关系。

    如果是后者,则必须牢记有关PHP的一个重要事实,那就是:写得不好的PHP是维护的噩梦。没有写得不好的Perl那样糟糕-因为那是什么? -但非常严重,以至于您迟早会强烈希望偷窃一台时光机,回到写您现在发现自己正在维护的代码的那一刻,然后用冰镐刺入眼中。

    因此,如果您要随着时间的推移维护此代码,请花一些时间正确地进行操作。这意味着:某种模板系统,HTML内没有嵌入PHP标记,用于单独功能的单独文件以及类classs类!

    您的眼窝会谢谢您。


    在我看来,我们phper可以彻底抛弃Object(类实例)的概念,我们只需要Array和Mode类:

    所有处于初始模式的数组都支持其方法的任何数组功能:

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

    使用->mode()验证最小数据集,然后切换模式类:

    1
    2
    3
    <?php
    $array1->mode('class1', $success);
    ?>

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

    处于某个模式的数组仍可以使用数组函数作为其方法,但是在使用其中任何一个之后,该数组将切换回基本数组模式,
    并且我们需要使用->mode('class1', $success);切换回模式。

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

    我们可以修改PHP引擎,以摆脱OO(面向对象)的一部分,并支持Mode Class,我们可以将其称为MyPHP。

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

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

    我想在这里重申其他答案。这取决于应用程序的大小以及您想了解多少有关OOP的知识。我会谨慎使用PHP来学习OOP。

    关于多少PHP是面向对象的... PHP4带有一些OOP元素,PHP5更好,但是还没有融入到语言中。 PHP可以双向运行,而且我个人希望您可以选择。


    不,我认为如果该应用程序正在运行,则无需重写它。
    PHP根本不是真正的面向对象。他们努力工作,但有时我认为即使PHP开发人员也无法真正理解OOP的意义。
    如果您想学习OOP(肯定是个好主意),请尝试使用像Smalltalk这样的真正的OOP语言来学习基本概念。 Java也不错2学习基础知识,尽管它也不是完全面向对象的


    我想说的是,尝试OO只是因为如果正确的话,您所拥有的东西比程序上的要容易得多,而重新使用

    我还要说的是,OO比程序更井井有条。如果您的规模较小,则可以轻松地获得或不获得草率的代码OO。但是,当您进行较大的项目时,您的程序必须更加有条理并经过深思熟虑。在某些较大的项目中,OO往往会迫使您变得更有条理,使事情变得容易一些。


    推荐阅读