将过程PHP转换为面向对象的PHP

Ste*_*ong 8 php oop static procedural-programming namespaces

我目前有一个相当大的应用程序完全用程序PHP编写.我希望进一步提高我的PHP体验,并使用面向对象技术重新编写我的大部分应用程序.

OOP有很多方面可以帮助减少代码量并使其更易于阅读.但是,我有几个问题.

1)据我所知,一个类被用作任意数量对象的蓝图,但任何一个类只代表一个对象,永远不会超过一个.因此,一个班级可以代表一个玩家,但从不代表多个玩家.

2)因为我要包含很多不同的类,我是否使用"Loader"类来加载它们spl_autoload_register或者我只是spl_autoload_register在我的应用程序的程序文件中使用?

编辑:所以我的自动加载器将是一个类,然后我创建一个启动自动加载的实例或只是一个带有该函数和我将包含的spl_autoload_register的php文件,以避免在多个文件中重复相同的代码?

3)我的一些课程依赖于其他课程.我以前从未遇到过这个,所以老实说我不知道​​答案.如果我包括我的主程序文件中的所有类,但我的播放器类并没有包括它需要的功能类,会因为主程序球员类的工作包括哪些球员依赖于类?

编辑:所以即使一个类可以实例化一个类型为Player的对象,并且该类没有直接包含Player类,它仍然可以工作,因为控制器类确实包含了Player类?

4)在多种情况下,我需要处理我正在创建的对象.我想知道我应该怎么做.例如,在我的Player类中,我有时需要从一个Player向另一个Player发送一些东西.那么,我是否在Player类中实现一个静态方法,该方法将两个Players作为参数并进行传输或者我还要做其他事情?

编辑:好的,所以避免使用静态方法.现在我遇到了一个严重的问题:我的应用程序中有多次运行的方法,但是我无法将它们作为静态方法实现.我应该将它们作为实例方法实现吗?例如,从一个播放器发送到另一个播放器.我是否会创建一个实例方法来获取Player对象并将其发送它或从中发送?

5)我有很多方法并不真正属于任何一个类的实例,它们也不适合作为静态方法.这些是否应该作为Common或类似的静态方法在自己的类中声明?在这种情况下,在实践中做了什么?

编辑:这些方法是否属于使用它们的特定应用程序文件,或者可能存储在自己的"functions.php"文件中?

6)我想学习如何使用命名空间,但我的代码永远不会被其他人使用,我永远不会在我的应用程序中使用其他人的代码.在我的应用程序中,命名空间是不必要的添加还是学习如何使用它们是个好主意?无论如何,一个应用程序是否有一个命名空间(应用程序名称?)或每个类是否属于它自己的命名空间?

7)最后,是否有一个用于数据库连接的类,以及一个用于网络方法的类?我的应用需要两者.我认为转换我的代码以使用面向对象技术时遇到的主要问题是确定将哪些方法放在哪里,因为目前它们都在一个整体文件中.

感谢您提供的任何帮助和见解.

Nik*_*iko 2

1)我的理解是,一个类可用作任意数量对象的蓝图,但任何一个类仅代表一个对象,绝不会超过一个。所以一个类可以代表一名玩家,但不能代表多个玩家。

通常,您还将拥有表示对象集合的类,例如“Players”类,可用于从所有玩家的集合中检索单个玩家:

$players = new Players();
$john = $players->findByName("john");
Run Code Online (Sandbox Code Playgroud)

2)由于我将有很多不同的类要包含,我是否使用“Loader”类来使用 spl_autoload_register 加载它们,还是只在我的应用程序的程序文件中使用 spl_autoload_register ?

这很大程度上取决于您项目的复杂性。一个简单的自动加载器函数通常就足够了,但您可以看看Zend Framework Autoloader 类

3)我的一些课程依赖于其他课程。我以前从未遇到过这个问题,所以老实说我不知道​​答案。如果我在主程序文件中包含所有类,但我的播放器类不包含其运行所需的类,那么由于主程序已包含播放器所依赖的类,因此播放器类是否可以工作?

是的。然而,通过自动加载,您根本不需要担心这个问题。如果不使用自动加载,最好在定义类的文件中包含所需的类(用于require_once()避免多次包含同一文件)。

4) 在很多情况下,我需要处理我正在创建的对象。我想知道我应该怎么做。例如,在我的 Player 类中,我有时需要从一个 Player 向另一个 Player 发送一些内容。那么,我是否在 Player 类中实现一个静态方法,该方法以两个 Player 作为参数并进行传输或执行其他操作?

静态方法几乎总是错误的方法。普通方法属于实例(即特定玩家),静态方法属于类,即玩家的一般“想法”。如果您需要将内容从一个玩家转移到另一个玩家,为什么不这样实现:

class Player {
    public function transferMoney(Player $recipient, $amount) { ... }
}

$tom = new Player("tom");
$marc = new Player("marc");

$tom->transferMoney($marc, 500);
Run Code Online (Sandbox Code Playgroud)

5)我有很多方法并不真正属于类的任何一个实例,也不适合作为静态方法。这些是否应该在自己的类中声明为 Common 或类似的静态方法?在这种情况下,实践中是怎么做的呢?

我无法合理地回答这个问题。然而,PHP 中仍然有一些简单的函数,这似乎是解决这种情况的最佳方法。然而,如果你正确地进行 OOP,你很可能永远不会遇到这样的问题。这通常是您的类设计的问题,使您认为这些方法不属于任何对象。

6)我想学习如何使用命名空间,但我的代码永远不会被其他人使用,我也永远不会在我的应用程序中使用其他人的代码。命名空间是我的应用程序中不必要的添加,还是学习如何使用它们是一个好主意?不管怎样,一个应用程序是否有一个命名空间(应用程序名称?),或者每个类都属于它自己的命名空间?

命名空间很棒,但是如果没有它们,您的代码可能也能正常运行。由于命名空间可以嵌套,因此通常每个组件都有一个顶级命名空间和子命名空间。

7) 最后,有一个用于数据库连接的类和一个用于网络方法的类是否常见?我的应用程序需要两者。我认为将代码转换为使用面向对象技术时遇到的主要问题是确定将哪些方法放在哪里,因为目前它们都在一个整体文件中。

这取决于您如何模拟您的实际情况。如果数据库连接和“网络”对您来说是两个不同的东西,那么两个类就是最佳选择。