2009-05-28 280 views
1

我對OOP編程有點新,所以很可能我犯了一些愚蠢的錯誤。這是我的問題。當運行我的代碼,我得到了以下錯誤:全局變量的問題

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

下面是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)。結果輸出爲「Object」。然後,我在startSession函數中聲明全局$ auth之後立即嘗試放置echo gettype($ auth)。結果輸出爲「NULL」。任何想法可能是我的問題?謝謝。

編輯: $權威性聲明中Authentication.php

回答

2

沒有看到$auth如何在Authentication.php定義,也很難幫助。

此外,由於您是OOP新手,請允許我第一時間告訴您,全局變差。只是不要使用它們。如果你覺得你必須這樣做,很可能是因爲你的設計不好。您應該重新思考,而不是使用全局變量來快速修復您的問題。相反,通過執行類似

$auth = new Authentication; 

實例化Authentication類的新實例,確保Authentication實際上是正確設置爲一類,應有盡有。 PHP的在線文檔有很好的OOP introduction,您可能也想看看。

+0

+1 Globals很糟糕,它們會在6年後消失,反正它的使用方法是不好的做法。 – 2009-05-28 23:42:05

+0

快速問題。在我看來,繼續實例化某些類的新實例(如數據庫類或會話類)會很糟糕。我已經做了一些閱讀,看起來像這樣的解決方案是使用單例模式。你會同意使用Singleton模式還是他們更好的方法?謝謝你的幫助。 – blcArmadillo 2009-05-29 00:43:51

-1

確保$ AUTH宣佈全球在Authentication.php

1

的問題是不是在你實際上顯示的代碼。我確信真正的問題出現在Session的聲明之後,但在你真正創建它的一個實例之前。嘗試插入var_dump($ auth);就在你調用new Session之前,看看它是否真的在那裏設置。然後,您可以向後探測代碼並找到未設置的點。

此外,正如已經提到的:應該避免使用全局變量。更好的解決方案是將$auth作爲參數傳遞給Session的構造函數,並將其作爲該類的成員變量存儲。

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類。