我有一个名为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()函数触发 - 不知道如何做到这一点,以及它是否是一个好的解决方案?
你能告诉我什么是最好的,如果有更好的方法可以做到吗?
答案 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_vars和extract。使用这些可以将变量从一个范围导出到另一个范围。
一个愚蠢的例子可能是:函数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)
最佳做法是使用ServiceLocator或InversionOfControll-Container检索类实例,而不会违反DI-Principle。对于模板文件,您可以创建视图助手对象以直接访问其他对象。