【发布时间】:2015-05-27 23:31:12
【问题描述】:
我正在尝试创建我的第一个面向对象的 Web 应用程序,并且对如何全局引用对象有疑问。不确定是否有必要,但这里有一些背景知识。该应用是单页应用。
Index.php 创建一个“Page”类的新实例。此实例检查 url 参数(page=???),然后检查是否存在适当的内容类并调用其中的函数。如果该页面类不存在,它会调用另一个 404 类并显示它。
每个页面内容类都是从 BasePage 类扩展而来的。所以例如index.php?page=Home 会像这样工作
+---------+ +----------+
| | creates instance of Page.php | |
|index.php|----------------------------->| page.php |
| | | |
+---------+ +----------+ +----------+
| | /
| base.php | /
| | / "Page" loads the relevant class
+----------+ / and calls a function within it
home.php | |/_
extends base.php +----------+
| |
| home.php |
| |
+----------+
希望到目前为止这是有道理的。我现在遇到的问题是我需要一个从“用户”类的实例创建的“用户”对象。这个 User 对象将在几乎每个页面、Index.php、page.php 和 home.php 中被引用。到目前为止,我已经在其他每个类中创建了 User 类的实例。这可行,但通常会导致多次调用数据库并创建多个用户对象。我认为最好的方法是使 User 类成为单例类,但是我在哪里创建该单例对象。如果我在 base.php 中创建实例,home.php 会引用它,但 page.php 和 index.php 没有。如果我在 index.php 中创建实例,除非我将它传递给每个类,否则没有其他页面可以访问它——这会变得混乱。 (我知道,我试过了)。
所以我的问题是,如何制作每个页面都可以访问的单例对象?我认为将它放在全局范围内会有所帮助,但是 a)我不知道该怎么做,并且 b)我已经阅读了很多关于为什么全局变量是坏东西的文章。
任何人都可以提供任何建议吗?我应该如何创建我的用户对象?
谢谢
【问题讨论】:
-
What has been happening up to now is I have created instances of the User class in every other class.你不能从你的类中创建用户并用用户对象作为参数来构造它们吗?这将防止多个用户被实例化 -
将用户对象作为参数传递给其他类的构造函数是比使用单例更简洁的解决方案。另外,您确定每个页面都必须扩展基本页面类吗?
-
我鼓励您了解autoloading in PHP 和dependency injection。这两者都将在您的解决方案中发挥作用。
-
是的,我已经尝试将用户对象传递给其他类的构造函数,但实际上,还有很多其他类被使用。将 User 对象作为参数传递变得非常混乱,并且感觉不是正确的做法。其他一些类包含静态方法,因此我不仅需要将对象传递给构造函数类,还需要传递给其中的每个方法
-
除了不使用静态方法之外,将对象传递给您的类是可行的方法。不过,您可以在大多数较新的 PHP 版本中使用
$myClassInstance::staticMethod()。