全局变量的问题

时间:2009-05-28 23:29:20

标签: global-variables php

我对OOP编程有些新意,所以我很可能犯了一些愚蠢的错误。这是我的问题。运行我的代码时出现以下错误:

  

致命错误: 30 > /application/libraries/Session.php 中的非对象上调用成员函数checkLogin()

下面是Session.php文件(我已经注释第30行,以便于查找):

<?php
require_once(LIBPATH . 'MySQLDB.php');
require_once(LIBPATH . 'Authentication.php');

class Session {
public $url;
public $referrer;
public $redirect;

function Session() {
    $this->startSession();
}
function startSession() {
    global $auth;

    session_start();

    if (isset($_SESSION['url'])) {
        $this->referrer = $_SESSION['url'];
    } else {
        $this->referrer = '/';
    }
    $this->url = $_SESSION['url'] = $_SERVER['PHP_SELF'];
    if (isset($_SESSION['redirect'])) {
        $this->redirect = $_SESSION['redirect'];
    } else {
        $this->redirect = $_SESSION['redirect'] = '/';
    }

    $auth->checkLogin();         // LINE 30
}
function setRedirect($page) {
    $this->redirect = $_SESSION['redirect'] = $page;
}
}

在我尝试解决问题时,我在include和class声明之间放了echo gettype($ auth)。结果输出是“对象”。然后我在startSession函数中声明全局$ auth后立即尝试使用echo gettype($ auth)。结果输出为“NULL”。知道我的问题可能是什么吗?感谢。

编辑: $ auth在Authentication.php中声明

4 个答案:

答案 0 :(得分:1)

如果没有了解$authAuthentication.php的定义方式,就很难提供帮助。

此外,由于你是OOP的新手,让我成为第一个告诉你全局错误的人。只是不要使用它们。如果你认为你必须这样做,那很可能是因为你的设计很糟糕。您应该重新考虑,而不是使用全局变量来快速解决您的问题。相反,通过执行类似

的操作来实例化Authentication类的新实例
$auth = new Authentication;

确保Authentication实际上已正确设置为班级和所有内容。 PHP的在线文档有一个很好的OOP introduction,你可能也想看看。

答案 1 :(得分:1)

问题不在于您实际显示的代码中。我非常有信心真正的问题出现在会话声明之后但实际创建它的实例之前。尝试插入var_dump($ auth);在您调用new Session之前,看看它是否实际设置在那里。然后,您可以向后探测代码并找到未设置的点。

此外,正如已经提到的:应该避免全球化。更好的解决方案是将$auth作为参数传递给Session的构造函数,并将其存储为类的成员变量。

答案 2 :(得分:0)

错误消息:

Fatal error: Call to a member function checkLogin() on a non-object in /application/libraries/Session.php on line 30

表示PHP无法在Authenrication.php中找到checkLogin函数。确保将Authentication.php中找到的类实例化为Session.php,或将实例化的变量传递给Session类。

答案 3 :(得分:-1)

确保在Authentication.php中将$ auth声明为全局