1

我对 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;
}
}

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

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

4

4 回答 4

1

没有看到如何$auth定义Authentication.php,很难提供帮助。

另外,由于您是 OOP 的新手,所以让我第一个告诉您globals 是 bad。只是不要使用它们。如果你觉得必须这样做,很可能是因为你的设计不好。您应该重新考虑这一点,而不是使用全局变量来快速解决您的问题。相反,通过执行类似的操作来实例化您的Authentication类的新实例

$auth = new Authentication;

确保Authentication实际上作为一个类和所有东西都正确设置。PHP 的在线文档有一个很好的OOP 介绍,您可能也想看看。

于 2009-05-28T23:33:40.433 回答
1

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

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

于 2009-05-28T23:38:41.377 回答
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 类。

于 2009-05-29T03:46:46.340 回答
-1

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

于 2009-05-28T23:37:19.677 回答