我目前正在创建博客系统,我希望将来可以转变为完整的CMS。
有两个类/对象可用于全局访问(mysqli数据库连接和一个用于检查用户是否已登录的自定义类)。
我正在寻找一种不使用全局对象的方法,如果可能的话,每次调用时都不会将对象传递给每个函数。
答案 0 :(得分:13)
您可以将对象设为静态,然后您可以在任何地方访问它们。例如:
myClass::myFunction();
这将适用于脚本中的任何位置。您可能希望阅读静态类,并且可能使用Singleton类在可以在任何地方使用的静态对象内创建常规类。
<强>扩展强>
我认为你要做的事情与我对数据库类的做法非常相似。
class myClass
{
static $class = false;
static function get_connection()
{
if(self::$class == false)
{
self::$class = new myClass;
}
return self::$class;
}
// Then create regular class functions.
}
在您获得连接后,使用$ object = myClass :: get_connection(),您将能够定期执行任何操作。
$object = myClass::get_connection();
$object->runClass();
<强>扩展强>
执行静态声明后,只需调用get_connection并将返回值赋给变量即可。然后其余的函数可以与使用$ class = new myClass调用的类具有相同的行为(因为这就是我们所做的)。您所做的只是将类变量存储在静态类中。
class myClass
{
static $class = false;
static function get_connection()
{
if(self::$class == false)
{
self::$class = new myClass;
}
return self::$class;
}
// Then create regular class functions.
public function is_logged_in()
{
// This will work
$this->test = "Hi";
echo $this->test;
}
}
$object = myClass::get_connection();
$object->is_logged_in();
答案 1 :(得分:8)
您可以将当前的全局对象传递给构造函数。
<?php
class Foo {
protected $m_db;
function __construct($a_db) {
$this->m_db = $a_db;
}
}
?>
答案 2 :(得分:3)
我最近修改了我的框架,为我们公司CMS的第二版做准备。我 undid 我为了用普通对象替换它们而制作了大量静态的东西。通过这样做,我创造了大量的灵活性,过去依赖于我经历并入侵核心文件。我现在只使用静态构造,唯一的选择是全局函数,它只与低级核心功能有关。
我将展示我的bootstrap.php文件的几行(我的所有请求都通过该文件发送,但你可以通过将它包含在每个文件的顶部来实现相同的结果)来向你展示我的意思是。这是你在你的情况下可能使用的非常大的版本,但希望这个想法是有用的。 (这些都略有修改。)
//bootstrap.php
...
// CONSTRUCT APPLICATION
{
$Database = new Databases\Mysql(
Constant::get('DATABASE_HOST'),
Constant::get('DATABASE_USER'),
Constant::get('DATABASE_PASSWORD'),
Constant::get('DATABASE_SCHEMA')
);
$Registry = new Collections\Registry;
$Loader = new Loaders\Base;
$Debugger = new Debuggers\Dummy; // Debuggers\Console to log debugging info to JavaScript console
$Application = new Applications\Base($Database, $Registry, $Loader, $Debugger);
}
...
正如您所看到的,我有创建应用程序对象的所有选项,我可以将其作为构造函数中的参数提供给其他对象,以使它们能够访问这些“全局”必需品。
数据库对象不言自明。注册表对象充当我可能想要访问应用程序中其他位置的对象的容器。加载器充当用于加载模板文件等其他资源的实用程序。并且调试器可以处理调试输出。
例如,我可以更改我实例化的数据库类,并且我有一个与SQLite数据库的连接。我可以更改调试器的类(如上所述),现在我的所有调试信息都将记录到我的JavaScript控制台。好的,现在回到这个问题。你如何让其他对象访问所有这些?您只需将其传递给构造函数的参数。
// still bootstrap.php
...
// DISPATCH APPLICATION
{
$Router = new Routers\Http($Application);
$Router->routeUri($_SERVER['REQUEST_URI']);
}
...
不仅如此,我的路由器(或我用它构建的任何对象)也更灵活。现在我可以用不同的方式实例化我的应用程序对象,并且我的路由器将相应地表现不同。
答案 3 :(得分:1)
好吧,如果您已经有一些引用博客系统的对象,可以将这些对象组合成这些对象,以便它们是$blog->db()
和$blog->auth()
或其他任何对象。