在另一个PHP类中使用许多不同对象实例的最佳方法是什么?

时间:2014-02-21 17:12:46

标签: php html oop

我有一个名为Page的类,它为当前页面加载一个包含所有HTML(模板文件)的PHP文件。在我的模板文件中,我想使用其他对象的实例,这些实例在Page类(例如User,PDO或其他类)之外初始化。我的问题是,我如何以最聪明的方式做到这一点。

在我的页面类中,我有一个名为get_page()的方法,它加载我的模板文件(包含我GUI的所有代码。

public function get_page() {
        // Load theme template
        ...

        $template_file = ABSPATH_THEME . 'tpl.' . $result['template_file'] . '.php';

        if(file_exists($template_file)) {
            $page = require_once($template_file);
            return $page;   
        }
    }

如您所见,模板文件已加载到我的Page类中,因此它不会访问在Page类外部初始化的类的实例。

我可以提出不同的解决方案:

1)在构建页面时,我将不同类的所有实例传递给我的类Page。我认为这是正确的方法,但如果我在设计中需要5个,10个或20个不同的对象,那么可能会非常复杂。

2)找到一种方法将模板文件包含在Page类之外,但是从get_page()函数触发 - 不知道如何做到这一点,以及它是否是一个好的解决方案?

你能告诉我什么是最好的,如果有更好的方法可以做到吗?

6 个答案:

答案 0 :(得分:0)

你可以在php的顶部包含类

例如。 /CLASSPATH/ClassName.php

然后你可以为该类创建一个实体并在任何地方使用它

例如。 $ entity = new ClassName();

答案 1 :(得分:0)

我认为你最好的选择是将它们作为参数传递,具体取决于你需要什么,你可能想让它们成为属性。

编辑:这假设通过“使用其他对象的实例”意味着您需要使用已在其他地方实例化的对象。

答案 2 :(得分:0)

如果通过“其他类的istances”你指的是其他通用对象(你提到PDO和用户这是goos的例子)我将它们存储在$_SESSION数组(或$_GLOBAL数组中,$_SESSION是大多数情况下的最佳选择。)

然后您只需使用$_SESSION['PDO']->...之类的

即可访问它们

答案 3 :(得分:0)

处理php应用程序rooting的最常用方法之一是实现MVC设计patern,或使用MVC Framework。 Google的“MVC php”了解详情,祝你好运。

答案 4 :(得分:0)

查看函数get_defined_varsextract。使用这些可以将变量从一个范围导出到另一个范围。

一个愚蠢的例子可能是:函数A将本地定义的变量传递给函数B.

function A()
{
    $var1 = "1";
    $var2 = "2";
    // etc

    $data = get_defined_vars();
    B($data);

}

function B($data)
{
    extract($data);
    // somescript.php can use $var1, $var2, etc if B is call from A.
    require("somescript.php");
}

A();

答案 5 :(得分:0)

最佳做法是使用ServiceLocatorInversionOfControll-Container检索类实例,而不会违反DI-Principle。对于模板文件,您可以创建视图助手对象以直接访问其他对象。