为什么使用PHP OOP而不是基本功能?

时间:2009-04-04 03:00:23

标签: php oop

有一些关于此事的帖子,但我没有明确知道何时使用面向对象的编码以及何时在include中使用编程功能。有人还向我提到,OOP运行起来非常繁重,并且会增加工作量。这是对的吗?

假设我有一个包含50个函数的大文件。我为什么要在课堂上打电话?而不是通过function_name()?我应该切换并创建一个包含我所有功能的对象吗?优势或具体区别是什么?它为PHP中的代码OOP带来了哪些好处?模块化?

10 个答案:

答案 0 :(得分:41)

在很多场景中,程序编程都很好。使用OO是为了使用它是没用的,特别是如果你最终会得到POD个对象(普通旧数据)。

OO的力量主要来自继承和多态。如果您使用类,但从不使用这两个概念中的任何一个,那么您可能不需要首先使用类。

OO闪耀的最好的地方之一是允许你摆脱开关型代码。考虑:

function drive($the_car){

    switch($the_car){

      case 'ferrari':
          $all_cars->run_ferrari_code();
          break;

      case 'mazerati':
          $all_cars->run_mazerati_code();
          break;

      case 'bentley':
          $all_cars->run_bentley_code();
          break;
    }
}

以其OO替代方案:

function drive($the_car){

    $the_car->drive();
}

多态性将允许基于运行时信息发生正确类型的“驱动”。


关于多态性的注释:

这里的第二个例子有一些前提:那就是所有汽车类都会扩展abstract类或实现interface

两者都允许您强制扩展或实现类来定义特定的功能,例如drive()。这是非常强大的,因为它允许你drive()所有汽车,而不必知道你正在驾驶哪一辆;这是因为他们正在扩展一个包含drive()方法的抽象类,或者实现一个强制定义drive()方法的接口。

因此,只要您确保所有特定车辆都扩展抽象类car或实现canBeDriven之类的接口(两者都必须声明 drive()方法)你可以在你知道的汽车(但不是什么类型的汽车)的对象上调用drive()方法,而不用担心它没有被定义,因为PHP会抛出致命的错误直到你在特定的汽车类中定义这些方法为止。

答案 1 :(得分:13)

我会尽量保留我的答案,因为Majd Taby和Coobird的答案非常好。

我多年来一直是程序员程序员,并没有与OOP编程作斗争,但从未真正看到太多相关性......直到我开始在团队中工作并构建更重要和复杂的项目。

在我看来,当你需要为更复杂的应用程序编写精简,易于维护的代码时,OOP真的很棒。并且请注意,不是在所有情况下,但有一些程序在某种程度上不能很好地发挥作用。

我的大多数OOP实现的例子都是针对那些项目,我有几件事情都是相关的,但都有些不同。有很多表格,很多用户,很多产品等的网站。

它们都有类似的行为名称,如print(),update()等......但是通过将它们封装为对象并改变类中的方法实现,我可以使我的代码在运行时非常简单和干净整个现场。此外,这个是关键,尽管有不同的行为,我可以使用不同的对象在整个应用程序中使用相同的方法调用。它允许第二个开发人员在我处理更深层代码时处理实际实现。

我不知道是否有任何帮助,但不是很久以前在你的情况下说话,我喜欢OOP。

答案 2 :(得分:12)

在程序中使用面向对象的编程方法而不是程序编程方法并不真正依赖于语言(无论是否为PHP),而是依赖于您尝试解决的问题类型。

(我只是在我的例子中使用伪代码,因为我对PHP不太熟悉。)

例如,如果你有一个程序,你只是按顺序执行一堆函数,那么程序就可以了。例如,如果它是一个简单的字符串操作程序,那么程序方法就足够了:

perform_truncation(my_string, 10)
to_upper(my_string)
perform_magic(my_string, hat, rabbit)

但是,如果您要处理许多不同的项目(例如文件或任何其他表示的对象),那么面向对象的方法会更好。

例如,如果您有一堆Car并希望它们drive,那么在程序上,您可以执行以下操作:

drive_car(first_car)
drive_car(second_car)

在OOP中,Car可以驱动自己:

RedCar myRedCar();
BlueCar myBlueCar();

myRedCar.drive();
myBlueCar.drive();

而且,由于每辆车都是不同的车型,因此可以对其行为进行不同的定义。此外,它们可以是子类,也可以是Car它们可能具有共同功能。

这实际上归结为问题的类型,它使得程序方法比面向对象更好,反之亦然。

除了程序性或面向对象的问题之外,拥有一个具有许多功能的源文件可能是一种“代码味道”。对于包含许多功能的类,也可以这说,这些功能可以作为单独的类中的单独函数更好地执行。

这里的问题可能是代码组织,而不是决定选择程序或面向对象的编程。将功能组织到单独的源文件中可能需要的是放弃编写程序的程序方法。

毕竟,在程序编程方法中编写了大量程序,这些程序编写得很好,易于维护。

答案 3 :(得分:6)

  

假设我有50个大文件   功能,我为什么要打电话   这些在课堂上?而不是   函数名()。我应该切换吗?   创造拥有我所有人的对象   功能

转移到OOP不应该像上面描述的那样被视为一个简单的“切换”。

OOP需要一种完全不同的编程思维方式,包括重新布线你的大脑。由于大脑的重新布线不会在一夜之间发生,许多人不愿意将自己暴露在所需的重新布线过程中。不幸的是,重新布线需要投入时间和精力:研究,教程,试验和错误。

这实际上涉及退一步并了解OOP背后的概念,但回报将非常值得作为在www前几天完成此过程的人发言。

在你“掌握”并遵循日常的OOP最佳实践后,你会告诉别人你的编程生活如何变得更好。

一旦你真正了解OOP,你就会回答自己的问题。

答案 4 :(得分:2)

如果在Utilities类中有50个函数而不是50个静态方法,则会“污染”全局命名空间。

使用具有50个静态方法的类,方法名称是您的类的本地名称。

答案 5 :(得分:2)

我不能说哪一个更好。但根据我的经验,您可以使用OOP进行更好的代码管理。你知道哪个代码在哪里,在哪个文件中定义了什么功能,等等。 关于OOP的运行时开销,我在某处阅读(我认为这是真的)如果你在经典函数中编写错误的代码,并且在OOP中编写相同的错误代码,那么函数版本的效果会更好。因此,如果您的代码写得不好,则没有证据表明OOP会使您的应用程序变慢。还要记住,这些“慢”和“开销”的东西都是以毫秒为单位测量的。因此,如果您的应用程序没有为很多用户服务(例如一分钟内超过100个用户),您可能感觉不到任何差异。

答案 6 :(得分:2)

OOP允许您创建代码的结构化容器,称为类,可以是彼此的父/子。这有助于构建应用程序,因为它更易于维护,并且如果正确完成,可以减少代码冗余。 OOP确实增加了一些开销,但它并不是真正引人注目的,并且由于程序代码的不可维护性而被淘汰。如果您正在编写一个大型应用程序,请使用OO,特别是如果它将由许多人处理。

例如,假设您正在设计一个简单的网站。您可以创建一个Page对象。页面对象负责进入数据库并获取页面的各种设置,例如元数据,标题标签,甚至页面上某些“组件”的数量及其类型(例如日历控件,小部件)等等。)

然后,您可以创建另一个扩展Page的类,比如Index。索引将是索引或主页。如果您有产品目录,则可以使用Catalog类扩展页面。由于您的目录部分和您的主页都需要从数据库中获取有关页面元数据和页面基本结构的数据,因此有1个对象可以帮助您。在这两种情况下,页面都会完成所有工作并从数据库中获取页面数据,将其加载到变量中,然后可以在索引类和目录类中访问这些变量。您不必编写代码进入数据库并在您编写的每个页面中再次获取它。

现在还有其他方法可以在程序上执行此操作,例如使用包含。但是,您会发现自己减少错误和错误。例如,您可以在Page类中定义抽象方法。这意味着必须在扩展它的任何对象中定义此方法。所以说你在Page类中创建了一个setPageAttributes()函数作为abstract。执行此操作时,您将创建一个空函数。在创建索引类时,您必须创建一个setPageAttributes()函数(意图填充它,例如访问Page类中定义的变量并使用它来设置页面,模板或页面上的实际元素)查看您正在使用)或者您收到PHP错误。

如果您正在与其他人合作以编写您的项目,抽象方法将告诉该人,“嘿,您需要在您编写的任何代码中定义这些函数”。这迫使应用程序保持一致。

最后,如果不进行OOP,则不能使用MVC格式等框架。虽然没有必要去MVC并且存在争议,但它确实将应用程序的所有组件分离出来,并且在许多人(设计人员,编码人员,营销人员)处理相同代码的环境中是必要的。

答案 7 :(得分:2)

使用oop可以获得以下好处:

  1. 构建
  2. 复用性
  3. 易于维护
  4. 封装数据
  5. 制作具有50个功能的大文件。你可以这样做,但是当涉及到函数的流程以及数据数据如何在每个函数之间进行绑定将是一个最大的问题。

    对于将来的维护,如果你想要更换流量的最大块,相信我你必须去每个功能并玩它。此外,您永远不知道如何在代码的其他部分中使用您的函数。所以面向对象的编程始终是可取的。

    有关好处的详细信息,您可以在OOP in PHP

    上阅读我的帖子

答案 8 :(得分:0)

接受的答案似乎忽略了说可以根据变量名来调用函数,例如herew:

function drive($the_car){
    $the_car();
}

不可否认,在这种情况下,每辆车都需要有一个功能,但它比建议的switch语句更有效。


可以轻松提供其他变量:

function operate($the_car,$action){
    $the_car($action);
}

function ferrari($action){
    switch($action){
        case 'drive':
            echo 'Driving';
            break;

        case 'stop':
            echo 'Stopped';
            break;

        default: return;
    }
}


operate('ferrari','drive');

这里有一个switch语句,但是它提供了原始示例中没有的其他功能,所以它绝不是一个矛盾。

答案 9 :(得分:0)

OOPs概念在PHP中使用,以保护代码。由于所有查询都是用函数文件而不是代码文件编写的,因此没有人能够轻易破解我们的代码。所以最好在PHP中使用类而不是直接编写查询。