6

我目前正在创建博客系统,我希望将来能把它变成一个完整的 CMS。

有两个类/对象可用于全局访问(mysqli 数据库连接和一个检查用户是否登录的自定义类)。

我正在寻找一种在不使用全局对象的情况下执行此操作的方法,并且如果可能的话,不要在每次调用它们时将对象传递给每个函数。

4

4 回答 4

13

您可以将对象设为静态,然后您可以在任何地方访问它们。例子:

myClass::myFunction();

这将在脚本中的任何地方工作。但是,您可能想阅读静态类,并可能使用 Singleton 类在静态对象内创建可以在任何地方使用的常规类。

展开

我认为您尝试做的与我对 DB 类所做的非常相似。

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();
于 2009-07-18T17:29:50.997 回答
8

您可以将当前的全局对象传递给构造函数。

<?php
  class Foo {
    protected $m_db;
    function __construct($a_db) {
      $this->m_db = $a_db;
    }
  }
?>
于 2009-07-18T17:32:42.333 回答
3

我最近修改了我的框架,为我们公司 CMS 的第二个版本做准备。我解开了大量静态的东西,以便用普通对象替换它们。在这样做的过程中,我创造了巨大的灵活性,过去依赖于我浏览和侵入核心文件。我现在只在唯一的替代方案是全局函数时使用静态构造,这仅与低级核心功能相关。

我将展示我的 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']); 
}

...

Not only that, but my Router (or whatever object I construct with it) is more flexible, too. Now I can just instantiate my application object differently, and my Router will behave differently accordingly.

于 2013-08-10T04:29:56.030 回答
1

好吧,如果您已经有一些引用博客系统的对象,您可以将这些对象组合到其中,以便它们是$blog->db()$blog->auth()或其他。

于 2009-07-18T17:30:55.033 回答