类。重点是什么?

时间:2010-01-03 01:50:24

标签: php oop class

我在PHP中对OOP相当新,我已经制作了几个基本脚本,但没有什么令人印象深刻的。所有我真正从中得到的结论是,制作一组函数并include它们可能会更容易。

类的结构似乎只是混淆了一个简单的过程。在将所有内容整理到一个类中时,它并没有真正添加任何功能。

所以我显然错过了一些东西。有人可以通过创建类来解释添加了哪些功能

12 个答案:

答案 0 :(得分:21)

类是面向对象设计(分别是编程和分析)的概念,它们用于封装数据和方法

其他面向对象的编程技术可能包括诸如

之类的功能
  • 信息隐藏,
  • 数据抽象,
  • 封装,
  • 模块化,
  • polymorphism和
  • 继承

来自文章.. top-15-best-practices-for-writing-super-readable-code

  

面向对象编程可以帮助您创建结构良好的代码。但这并不意味着您需要完全放弃程序编程。实际上创建两种风格的混合可能是好的。

来自http://java.sun.com/docs/books/tutorial/java/concepts/class.html

  

在现实世界中,您经常会发现许多相同类型的单个物体。可能存在数千种其他自行车,所有相同的品牌和型号。每辆自行车都是使用相同的蓝图构建的,因此包含相同的组件。在面向对象的术语中,我们说你的自行车是被称为自行车的物体类的一个实例。类是创建单个对象的蓝图。

最后,关于程序和面向对象编程范式之间差异的简短youtube video ......

答案 1 :(得分:9)

虽然初看起来可能只是简单地使用一组函数并包含它们,但是类有其优点。类可以存储变量,那些变量“稍后”。

这是php.net的一个经过编辑的例子

<?php
$item_name = 'Widget 22';
$item_price = 4.90;
$item_qty = 2;
$item_total = ($item_price * $item_qty);
echo "You ordered $item_qty $item_name @ \$$item_price for a total of: \$$item_total.";
?>

v.s:

<?php
class Item {
  protected $name, $price, $qty, $total;

  function __construct($name, $price) {
    $this->name = $name;
    $this->price = $price;
  }

  function calculate($qty) {
    $this->total = number_format(($this->price * $qty), 2);
  }

  public function __toString() {
    return "You ordered ($this->qty) '$this->name'" . ($this->qty == 1 ? "" : "s") .
    " at \$$this->price, for a total of: \$$this->total.";
  }
}

$widget22 = new Item("Widget 22", 4.90);

$widget22->calculate(2);

echo $widget22;
?>

另一个巨大的好处是你可以做更多的。假设您想要计算另一个项目的价格并打印出来。无需复制所有奇特的逻辑,您只需调用新项目即可完成。

答案 2 :(得分:2)

OOP的一大优势是代码重用。例如:假设您设计了一个通用的“Socket”类,它以非常低的级别与服务器通信。然后,我可能会认为我想编写一个FTP类,它允许用户在连接到FTP服务器时下载文件。我可以“子类化”您的Socket类并扩展其功能以支持FTP,而无需重写代码。

现在,约翰想写一个HTTP类,与HTTP服务器进行交互。他也可以继承你的Socket类来实现这一点,而无需重写低级套接字代码。

注意在这个例子中没有重复的套接字代码;我和约翰分享了它。代码重复很糟糕,因为如果重复代码中存在错误,代码中的其他位置可能会出现完全相同的错误,您可能无法实现。

有关课程的更多详细信息,请参阅Wikipedia

答案 3 :(得分:1)

类是组织程序的一种方式。类可用于表示现实世界中的实体,或编程世界中的工件,通过允许我们以更高的粒度来推理它们,从而降低程序的复杂性。

在心理学中众所周知,专家将知识组织成“块”,以便他们更容易和更快地推理他们的领域。课程允许我们更轻松快速地推理我们的课程。

此外,类允许我们将关于实体的知识与自然与该实体相关联的方法/过程/函数/操作组合在一起。同样,这提供了一种在我们的程序中组织信息的自然方式。

类的其他优点,例如继承,但主要是类是组织程序结构的认知方式,以降低复杂性。

答案 4 :(得分:1)

我认为完全一样。

我已经阅读了一些关于OO-PHP的书籍,我最喜欢的是PHP In Action

虽然当我阅读书籍时,我认为“嘿,这是非常有用和有趣的信息。”,我还没有使用大量的OO-PHP。

简单的需求就像从服务器获取信息和JSON-back它真的不需要OOP。我确定它是“最佳实践”,但对于许多人的需求而言,这是不切实际的。一些类,如数据库连接和类似的数据处理可以实时节省,但PHP有时更容易和更快地仅部分使用OO。

答案 5 :(得分:1)

几个月后,我发布了关于类的类似问题,我已经使用PHP几年了,我真的没有看到需要使用类,它们只是复杂化了一个简单的过程,就像你说的那样我终于决定跳上班级列车而且我还在学习,但我现在很乐意使用它们而且我现在有一种完全相反的方式来思考它们,我认为它们现在是PHP中最好的功能!

我承认他们对于一个小型应用程序来说可能有点过分,但像我这样的大型社交网站远远不够小,它有数百个文件,现在我正在转换为类,它现在结构更好,更容易构建,更新,管理我的代码和其他用户可以进入并理解我的整个网站,因为它使用类。另一个很棒的功能是你可以将你可能拥有的所有功能分解成单独的类文件,并使用autoload()函数仅在需要类时自动加载正确的文件,这对于一个大项目来说也很棒。课程使事情变得更加有效。

我只能说,这是你需要深入了解它的真正好处之一。

答案 6 :(得分:0)

如果您的网站很小,那么在程序编程中编写代码肯定很容易(这就是您的简单流程所称的代码)。但随着您网站的发展,您肯定需要对事物进行排序。

例如,您将需要类作为数据库实体的模板。您可能需要类来表示每个页面,而在单个文件中您可能会创建多个页面。因此,这些都是OOP的优点。

在另一个例子中,你有40个以上的功能。您可能希望将它们组合在一起。将它们作为静态方法放在一个类中肯定会有所帮助。它会清理它,以便将来当你回到相同的代码时,一切看起来都很熟悉。

答案 7 :(得分:0)

在我开始使用类之前,我总是想到同样的事情 - 意识到它更简单,更好。 你应该创建你提到的那些函数,但是要在一个类中收集它们。这些函数可以在一个类中共享相同的变量,因此在必须多次使用相同的函数时更简单。

我现在能想到的最好的例子就是连接数据库。

您可以将所有这些函数包含在class中,而不是使用连接的各个函数,发送查询,获取结果和关闭连接。这将允许您使用相同的函数多次与数据库进行通信,而无需为页面上的特定用途定制大量变量。

答案 8 :(得分:0)

如果您只是编写程序式函数,然后将它们拼接成一个类,那么您将无法获得OOP的许多好处。我认为Open Closed PrincipleDependency Inversion Principle描述了OOP的一些最大好处,除非你故意将它们设计到你的代码中,否则你不会得到它。

但是,OOP并不完全适合所有事情。我认为程序编程非常适合Web开发。它涉及将(相当)简单的请求转换为一堆HTML,这是一个高度程序化的任务。如果包含一些函数更简单,那么试图将OOP形状的块推入程序形状的孔中是没有意义的。但是,我认为如果网站非常复杂,OOP将是更好的选择。

答案 9 :(得分:0)

管理复杂性。

编辑:也许我会再详细说明一下。

程序是复杂的实体,历史上已经提出了许多方法来驯服它们的复杂性。

程序编程,函数,结构化编程,抽象数据类型和面向对象编程只是帮助程序员管理理解程序所需的心理努力的模型。

对象编程并不能解决所有问题,当然对于一个小脚本来说它太过分了,但它适用于大型应用程序或系统。

我的原始答案试图总结这本巨大的Code Complete书的全部内容:尽力管理复杂性,让您和您的继任者理解您的程序。如果您认为对象编程可以帮助您完成此任务,那就太棒了,但是您更好地质疑它的便利性并尝试找到更好的方法。

答案 10 :(得分:0)

答案 11 :(得分:0)

在PHP中,类至少可以为您保存一堆include语句。 __autoload()函数的延迟加载非常方便。此外,您可以确信不同包含中的函数名称不会冲突。

除此之外,您可以开始考虑围绕类创建API。只能由类中的其他函数所需的函数可以标记为private。最后,您应该能够忽略类中的实际代码,并将它们视为API调用。

  

如果我致电Do::stuff($a, $b),我会收到此回复。

这就是你需要知道的全部内容。你可以忘记它是如何在课堂内“引擎盖下”的。

然后,当然,这里有非静态函数的类。这些可以做正常功能无法做到的各种有趣的事情。