PHP 对象 - 模式和正确用法

标签 php oop class object application-design

我只是想知道是否有人可以帮助我了解如何在 PHP 中充分利用对象。

我对 PHP 对象的理解是它应该代表一个实体,提供获取和更改该实体属性的方法。例如,一个名为 Post 的对象将包含单个帖子的所有属性,可以根据需要访问和修改这些属性。

让我有些困惑的是像 CodeIgniter 这样的库不使用这个庄园中的对象。他们将类更像是一组函数的包装器。因此 CodeIgniter 中的“帖子”类不会保存一篇帖子的属性,它会提供获取、编辑和删除帖子的功能。

那么,如果我想从数据库中取出每篇文章并将其放入 Post 对象中,会发生什么情况呢?我对此的理解是,我实际上需要两个类“Posts”和“Post”,一个定义 Post 对象,另一个处理从数据库中获取 Posts 并将它们放入 Post 对象。

这两种类型的类是否有名称(“适当的”对象/函数集合)?两个类像这样一起工作是否很常见,还是我完全误解了如何使用对象?

与其拥有一个 Post 对象,不如在我的 Posts 类中拥有一个名为 getSinglePost($id) 的方法,它只返回一个数组会更有意义吗?

希望这个问题有意义,期待得到一些反馈。

最佳答案

有关介绍,请参阅 What is a class in PHP?

对于答案,我将专门解决您的问题。搜索以粗体显示的术语以了解有关其含义的更多信息。

My understanding of a PHP object is that is should represent an entity, providing methods to get and alter the properties of that entity.

实体只是对象的一种可能用途。但是还有值对象服务对象数据访问对象等——当你走面向对象的路线时,一切都将是一个对象具有一定的责任感。

What causes me some confusion is that libraries like CodeIgniter don't use objects in this manor.

是的,Code Igniter 并没有真正接受 OOP。他们更多地使用基于类的编程方法,这更像是使用类和少量 OOP 进行程序化编程。

They treat classes more like wrappers for a group of functions. So a 'Posts' class in CodeIgniter would not hold properties of one post, it would provide functions for fetching, editing and deleting posts.

不过这很好。帖子类可以是 Repository,例如内存中的 Post 实体集合,负责在后台检索和持久化这些实体。我对 Design Patterns 和 Code Igniter 持谨慎态度,因为众所周知,它们使用自己的模式解释(例如,它们的 Active Record 更像是一个 查询对象).

So what happens if I want to get every post out of a database and put it into a Post object?

这里有很多选择。一种常见的方法是使用 Data Mapper,但您也可以使用 PDO 并将数据行直接提取到 Post 对象等中。

My understanding of it is I would in fact need two classes 'Posts' and 'Post', one that defines the Post object and one that handles fetching the Posts from the database and putting them into Post objects.

这就是前面提到的 RepositoryData Mapper 方法。您通常将它们与表数据网关 结合使用。但是,另一种方法是不使用 Posts 类,而是使用 Active Record 模式,该模式将数据库中的一行表示为一个对象,并附加了业务和持久性逻辑。

Do these two types of class have a name ('Proper' objects / Collections of functions)? And is it common to have two classes working together like this or have I completely misunderstood how to use objects?

是的,他们一起工作。 OOP 是关于对象协作的。

Instead of having a Post object would it make more sense to have a method in my Posts class called getSinglePost($id) that just returned an array?

那将是一个返回记录集表数据网关。当您没有很多业务逻辑并且可以节省域模型时,这很好,例如在CRUD应用程序

关于PHP 对象 - 模式和正确用法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12768497/

相关文章:

php - Windows 上的 Memcached(不是 memcache)PHP 扩展

java - 如何在 Java 中使用用户输入引用类型、对象名称和参数在运行时创建对象

python - 使用数据类初始化对象时修改属性

Java 使用 .class

java - 使用不同类中对象的实例变量

php - 使用for循环从数组中获取最大数字

php - 在数组中寻找字符串

php - 如何修复 laravel 中的 gettallheaders.php 错误?

c++ - 将类函数与其实际功能分开声明有什么好处?

ios - 对类对象使用 objc_setAssociatedObject 是否正确?