2012-04-19 50 views
1

我剛學會在php中使用雙冒號。我有很多函數內部類:雙冒號正在處理非靜態函數也

class auth { 

/* .... Other Functions ...*/ 

    public function logout() 
    { 
     session_start(); 
     $_SESSION = array(); 
     if (ini_get("session.use_cookies")) { 
      $params = session_get_cookie_params(); 
      setcookie(session_name(), '', time() - 42000, 
       $params["path"], $params["domain"], 
       $params["secure"], $params["httponly"] 
      ); 
     } 
     session_destroy(); 
    } 

} 

現在我包括這auth.class.php在另一個文件logout.php然後叫

auth::logout(); 

我還沒有發現任何錯誤(除非:「header已經發送」)時,將php錯誤轉換爲E_ALL級別。

我聽說範圍解析運算符只能用於靜態函數。所以我在拼圖,請幫助我更好地瞭解它... plz

回答

0

首先,在這裏您正在使用僅適用於靜態函數的範圍解析運算符。要麼你有使用static關鍵字公開後,那麼你可以用它的類名稱做出這個函數的靜態你不會不得不做出這樣的類的對象,也可以使一個物體像這樣

<?php 
    $myobject = new myclass(); 
?> 

還有一大認爲session_start();函數應該是您的網頁 的第一行,因爲它會將標頭信息發送到服務器。和服務器保存它們。 否則這將是重新發送使用PHP函數的頭信息,因爲每一個HTM始終發送HTTP頭信息到服務器 所以在session_start應該是任何頁面

的第一行,如果這是與您有關的問題可以發郵件給我info.gtensoft.in Gtensoftwares的高級開發人員www.gtensoft.in來自新的delji,印度

0

這與你的session_start()更多。
你必須執行此功能之前任何輸出到瀏覽器(可能是模板,回聲或甚至<?php之前的空白)。

無論如何,你可能在每一次頁面加載時都需要它,所以我建議你把它放在配置文件的某個地方,這個配置文件是在開始時加載的。

0

session_start();應該是您的引導/初始化代碼的一部分,而不是auth類的一部分。把它放在你的項目中執行的第一行的某處。如果在調用session_start()之前輸出ANYING,你會得到頭文件已經發送錯誤,結果將是不可預知的。

0

您可以靜態調用您的logout()方法。因此,您需要爲public static function logout()添加static關鍵字。

header already sent錯誤表示您在發送Real報頭之前已將一些數據輸出到瀏覽器。它可能是一些PHP輸出或錯誤。

0

PHP對於靜態方法和非靜態方法都非常寬泛。 如果你打開你的PHP配置嚴格模式,這將是錯誤的。另外:「PHP 4沒有靜態關鍵字(在函數聲明上下文中),但仍允許使用::靜態調用方法,這在PHP 5中爲了向後兼容的目的而繼續存在。」

參見:Calling non static method with "::"

3

可以調用一個非靜態函數以靜態方式(像你這樣做)。相信PHP 5.3有點嚴格,但仍然有可能。在這種情況下,它不會給出任何問題,因爲你的函數沒有引用對象本身的任何變量,所以它實際上不依賴於對象實例。爲此,你不會得到任何錯誤。

但是,我仍然建議不要這樣做。你的代碼會變得混亂,它可能(而且應該)在未來的版本中被打破。

+0

謝謝你,一個謎已經解決了 – 2012-04-19 07:58:07