【问题标题】:PHP global objectPHP 全局对象
【发布时间】:2011-03-24 12:05:38
【问题描述】:

我有一个单例模式数据库对象,我想声明一次以在系统中使用。我有一个主要的包含文件,它提供所有单独的类文件并创建一些全局变量。

这是包含文件:

<?php
// Main API. We want to include everything here and then make some Global Vars:
require_once('database.class.php');

// Create the DB here:
$database = Database::Singleton();

require_once('user.class.php');
require_once('settings.class.php');

// Start the session:
session_start();
?>

理论上,$database 应该是一个全局变量,其后包含的任何东西都可以访问(即user.class.phpsettings.class.php。但是,当我尝试从Database 类中调用Database 类中的方法时@ 类如下:

$result = $database->FetchObject($queryString);

我收到以下错误:

致命错误:在 C:\Program Files (x86)\EasyPHP-5.3.4.0\www\PC Estimating\classes\user.class.php 中的非对象上调用成员函数 NumRows()在第 122 行

有人可以帮忙吗?

【问题讨论】:

标签: php mysql singleton oop


【解决方案1】:

如果您尝试在类的方法中使用 $database 对象,则必须使用 global 关键字,以便从方法中可以看到 $database 变量:

class User {
    function myMethod() {
        global $database;

        // Work with $database

    }
}


有关更多信息,请查看手册的Variable scope 部分。


考虑到您使用的是单例,另一个 (更好) 解决方案是从单例中获取该对象:

class User {
    function myMethod() {
        $database = Database::Singleton();

        // Work with $database

    }
}

【讨论】:

  • @Rinuwise & Gordon:我在你发布你的 cmets 时编辑了我的答案(起初没有注意到单身);无论如何谢谢:-)
  • 感谢您的回答@PascalMARTIN。我的代码采用了您的第二个示例。如果允许,我会接受这个作为答案!
【解决方案2】:

您的代码的其余部分是什么?特别是在user.class.phpsettings.class.php。如果你想在你的一个类方法中使用 $database ,你需要在方法的顶部包含global $database; (这很糟糕,不要这样做),或者依赖单例行为并使用$database = Database::Singleton(); 再次。如果单例设置正确,这应该引用与您最初创建的相同的实例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-26
    • 2016-05-09
    • 2019-11-20
    • 2012-08-24
    相关资源
    最近更新 更多