0

关于我正在从事的这个项目的最佳实践和性能,我有几个问题。请原谅我提出了一个巨大的问题。

我目前正在使用 PHP 和 MySql 构建一个基于文本的游戏,到目前为止核心文件中约有 2,500 行。目前,这是一个完全模块化的函数库。一些用于数据访问,一些用于数据操作,等等。

我的第一个问题是:一个类 ItemManager 包含几十个专门用于在数据库中添加、更新和删除游戏项目的方法。这些方法的唯一共同点是它们与数据库交互。目前,构造函数要求一个 mysqli 对象,然后在它的所有函数中使用它。但是,一旦我将 MongoDB 添加到项目中,其中一些功能可能会与不同的数据库进行交互。

将所有这些功能简单地设为静态是否可以接受或更可取?当只有一个对象时,我认为没有理由实例化对象,也不需要它来维护类成员。那么,我应该使用静态方法吗?为什么?

第二个问题:有人可以帮助我了解在 PHP BESIDES 模块化中使用类的好处(因为我可以使用函数文件实现相同的效果)?来自 Java 背景,我认识到 OOP 在持久环境中的好处,因为对象在应用程序的整个生命周期中维护数据和状态。但是,使用 PHP,脚本的生命周期只有几分之一秒,并且所有状态信息都存储在数据库中。几乎所有的函数都只是操作数据库,那么目的是什么?当我只能调用函数时,实例化对象不是没有意义吗?我可以只做包含分类数据操作类的完全静态类而不实例化类的对象吗?我应该在函数文件上使用类的原因是什么?不是基本一样吗?完全静态的函数可以接受吗?

感谢您抽出宝贵时间,我不知道如何将这个问题缩减为更少的文字,所以我很抱歉。

4

3 回答 3

0

那么,我应该使用静态方法吗?为什么?

静态方法通常访问静态变量,它们是全局状态(在这方面它们与全局变量没有什么不同),这是不好的,原因有很多。

此外,虽然可以将对象实例替换为具有相同接口的其他对象,但只需将其他对象传递给使用它的函数,静态方法就不容易被替换。因此,您不能模拟它们,并且使用它们的代码不容易进行单元测试。

如果可以,请不要使用静态方法。

于 2013-06-01T18:59:07.123 回答
0

1)坚持使用对象,因为它很容易被其他数据库驱动程序替换或扩展(例如,您可以覆盖一些函数以透明地重定向到 MongoDB 以获得特殊的 getter。)如果您确定只使用一次实例,请使用单例,或者更好的是,一个 regitry 模式。

2) PHP 的寿命并没有那么短。它使用 MVC 模式处理引导、路由、模型、业务逻辑和输出。因此,虽然单个请求可能只需要几秒钟,但它可能涉及数百个类和数千个方法。

以你的 RPG 为例:有一天你可能会决定让它成为多人游戏。现在您可以实例化第二个玩家对象,或者调整大约 500 个函数。前一个只有类才有可能。

一个很大的原因是人类的局限性:人们不太可能记住数千个功能的含义,尤其是在团队工作时。通过使用对象,您可以定义苗条的 API。如果播放器对象具有公共方法 add_item(\item $item) 和 remove_item(\item $item),则不需要记住所有这些检查、计算和数据库处理功能。您甚至可以询问其他开发人员“创建一个只有一个 attack() 方法的 \monster 项目”。就是这样,你已经完成了,合作是最好的。

结论如果您具有 Java 背景并了解 OOP,请不要三思而后行放弃该习惯。PHP 不是脚本小子使用的预 OO 脚本。这是一个成熟的 OO 环境——但如果你利用它,这取决于你。

于 2013-06-01T19:00:00.973 回答
0

将所有这些功能简单地设为静态是否可以接受或更可取?当只有一个对象时,我认为没有理由实例化对象

如果您想要做的只是这个类能够做的事情,那么就没有理由实例化对象。通过使用静态方法,您可以通过在整个代码库中硬编码类名来将所有客户端代码与类耦合。如果稍后您决定可能需要不同的项目管理器服务来满足您的要求,那么您肯定会遇到糟糕的一天。

请注意,“不同的项目管理器”可以是“用于单元测试其余代码的模拟管理器”的简单代码。因此,即使在永远不会支持替代方案的情况下,使用这样的静态也会使您的代码实际上无法测试。

当然,您已经提到很可能有一个不同的项目管理器:如果当前的项目管理器接受一个对象,那么显然在您的管理器代码和接口mysqli之间没有抽象层。mysqli如果您想使用不同的对象连接到 Mongo,当前的项目管理器代码将如何支持这两种配置?您不需要编写一个新的项目管理器类吗?如果类名到处都是硬编码的,你将如何将它与其余代码集成?

我们也从反面来看情况:你有什么static收获?

显然,它使项目管理器成为“单例”对象,这听起来像是个好主意,因为“只有一个”。这个想法在 PHP 中不能被忽视(就像在其他支持多线程并且存在隐藏的跨线程依赖的语言中一样),但它仍然没有太多的水。如果您希望您的项目经理成为单身人士,那么就不要创建第二个实例。如果您出于某种原因想强制执行此操作,请使用静态变量来计算实例化并在尝试多个实例时抛出。最后,制作类final,使这个限制不能被删除。结果:一个不是static.

这就是它的全部意义,static鉴于上述情况,作为一个论点站得住脚是非常薄弱的​​。

并且不需要它来维护类成员。那么,我应该使用静态方法吗?为什么?

我不确定这意味着什么——你说构造函数已经需要一个数据库驱动程序对象,它完全有权成为类成员。这是另一个明显的暗示,静态不是这里的方法。

有人可以帮助我了解在 PHP BESIDES 模块化中使用类的好处(因为我可以使用函数文件实现相同的效果)?

我不会在这里为 OOP 提出明显的论据,而是提出一个反驳点:您可以实现相同的运行时效果,但您肯定无法为您的应用程序实现相同级别的可维护性和可调试性。为什么要使用劣质的解决方案?

来自 Java 背景,我认识到 OOP 在持久环境中的好处,因为对象在应用程序的整个生命周期中维护数据和状态。但是,使用 PHP,脚本的生命周期只有几分之一秒,并且所有状态信息都存储在数据库中。几乎所有的函数都只是操作数据库,那么目的是什么?当我只能调用函数时,实例化对象不是没有意义吗?

进程的生命周期是几分之一秒。代码库的生命周期以月、年和几十年来衡量。这就是人们维护它的时间,这就是我们首先使用 OOP 的原因。

全局变量可以像类成员一样保存状态,并且在“面向对象”成为一个术语之前很久,人们就一直在维护状态。OO 的好处是管理代码的源代码级模型的复杂性,我肯定不会同意将其描述为毫无意义的冒险。

于 2013-06-01T19:26:25.870 回答