2011-08-16 53 views
10
Class User{ 

public $id; 
public $username; 
public $password; 
public $email; 
public $steam; 
public $donator; 
public $active; 

public function __construct($username, $email, $password, $id, $active, $donator, $steam){ 
    $this->id = $id; 
    $this->username = $username; 
    $this->password = $password; 
    $this->email = $email; 
    $this->steam = $steam; 
    $this->donator = $donator; 
    $this->active = $active; 
}} 

是我的課(簡體)

下面是我的代碼:

$_SESSION['loggedIn'] = $user; 

$用戶是用戶的一個類的實例

現在這是什麼的print_r($ _ SESSION [」登錄'])顯示了我:

__PHP_Incomplete_Class Object 
(
    [__PHP_Incomplete_Class_Name] => User 
    [id] => 22 
    [username] => xxxx 
    [password] => xxxx 
    [email] => xxxx 
    [steam] => 1234567 
    [donator] => 0 
    [active] => 1 
) 

其中xxxx是正確的值。

但是當我嘗試從我的會話檢索數據。像這樣:「$ _SESSION ['loggedIn'] - > username」它返回一個空值給我。

+0

[「在會話變量中存儲PHP對象」(http://stackoverflow.com/questions/2042271/storing-a-php-object-in-a-session-variable),[「 PHP會話與一個不完整的對象「](http://stackoverflow.com/questions/1055728/php-session-with-an-incomplete-object),[」PHP會話對象的問題「](http:// stackoverflow。 COM /問題/ 5348457 /問題與-PHP會話對象)。 – outis

+1

參見[「PHP:存儲‘對象’的$ _SESSION內部」(http://stackoverflow.com/questions/132194/php-storing-objects-inside-the-session),[「我能保存的對象,在會議?「](http://www.phpriot.com/articles/intro-php-sessions/8)。 – outis

+0

我不會那樣做。例如,如果用戶使用另一臺計算機在另一臺計算機上登錄時更改其電子郵件,則最終可能會收到舊數據。或者,如果您從數據庫中刪除用戶,您的應用程序仍然會認爲用戶存在。相反,我只會在會話中存儲用戶標識,並在處理來自用戶的請求時從數據庫中檢索其餘信息。 – shesek

回答

12

必須先序列化對象爲字符串:

$_SESSION['user'] = serialize($user);

和:

$user = unserialize($_SESSION['user']);

只要確保類是反序列化對象之前首先定義。

+10

PHP將[連載](http://svn.php.net/viewvc/php/php-src/trunk/ext/session/session.c?revision=314376&view=markup#l187)和[unserialize](http://svn.php.net/viewvc/php/php-src/trunk/ext/session/session.c?revision=314376&view=markup#l205)會話變量自動。這個答案有效的原因是關於確保類在反序列化之前被定義的說明。 – outis

+0

@outis你能提供一個參考嗎?您發佈的兩個鏈接已經死了,但我正在尋找一個參考,確認序列化確實是自動完成的。 –

+0

@Bram:鏈接是源代碼;具體來說,是ext/session/session.c。這是我知道的唯一參考(有一些PHP的行爲沒有記錄)。 – outis

-1

$_SESSION變量似乎只能存儲數組,數字和字符串。

在您切換到新頁面後,它們無法存儲類對象。

+0

好的,所以我可以做的是在會話中創建一個數組?並用do-login.php檢索到的某些值填充它? – sn0ep

+0

@託比,是的,你可以做到這一點。 – Neal

+0

你有這方面的來源,或者這是一個錯誤的答案(從其他答案)。 –

2

雖然在同一頁上,session變量就像是另一個可以使用的東西,所以你可以用它來處理你想要的東西。這就是爲什麼您可以在該頁面上存儲對象的原因。

稍後檢索它實際上會顯示它是否適合session,這不適用於您的情況。

如果您確實需要保存該對象,則可以嘗試將其另存爲序列化對象,並在檢索後將其反序列化。這應該有效,但我不知道這是否是最好的溶劑/設計。像這樣傳遞物體可能會被認爲有點...反模式

7

您可以將對象存儲在$_SESSION中。 PHP會爲你序列化它們。只需確保在調用session_start之前定義了該類別,或者該類型可以是autoloaded。存儲在會話中的值具有類型「__PHP_Incomplete_Class_Name」的原因在於會話加載過程中對象被反序列化時,未定義User類(如在PHP手冊頁object serialization中所述)。

資源無法序列化。如果您存儲使用資源的對象,請執行__sleep and __wakeup以自定義序列化。 PHP的序列化應該能夠處理所有其他類型,即使它們包含循環引用。

相關問題