2011-07-18 91 views
1

我目前在我的PHP類中使用構造函數來檢查用戶是否已登錄。構造函數調用一個函數來檢查它們是否有會話ID等 - 如果它們沒有將它們重定向到登錄頁面。下面是我使用的是什麼的一個想法:覆蓋PHP __construct

function __construct() { 
    parent::__construct(); 
    $this->check(); 
    $this->mid = $this->session->userdata('member_id'); 
} 

function check() { 
    if($this->mid == ''){ 
     $this->login(); 
    } 
} 

function signup() { 
    // registration code 
} 

此構造,當然,在每類其他職能之前運行。不過,我有一個註冊功能,需要用戶在訪問時不要登錄。是否有任何方法可以制定例外或覆蓋__construct函數,以便未登錄的用戶可以訪問註冊功能?

回答

6

您需要重新設計您的代碼。首先你定義一個總是做某事的類(對用戶進行驗證),然後你想爲那些沒有那些東西的用戶使用那個類(沒有驗證的用戶)。爲了避免徹底的黑客攻擊,你應該重構你的代碼,而不是尋找一個補丁,它可以讓你解決你對課堂的限制。

+0

你說得對。我做了一個新的註冊類,它處理沒有帳號權限的用戶,並且保留原註冊用戶的用戶。謝謝! – hohner

+0

@Jamie:很高興幫助! –

1

__construct在創建對象時自動調用,因此無法對其進行更改。但是,如果擴展有問題的類併爲該派生類編寫__construct函數,那麼將首先調用它,並且您可以在其中執行任何操作,然後通過parent::__construct();調用父構造函數,如示例中所示。儘管對沒有構造函數被調用的對象做東西通常不是最好的想法,所以我建議重構代碼,以便儘可能地在構造函數之外獲取邏輯。那麼重寫的東西也會更容易。

2

我有一個簡單的指引設計類時:在構造函數中沒有的功能(僅初始化一些東西)

如果這是絕對需要在這種情況下,把一個如果,如果用戶已登錄,就像一個一個檢查像if(User::logged_in()) { .. }