2011-08-16 35 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; 
}} 

là lớp học của tôi (giản thể)

sau đây là mã của tôi:

$_SESSION['loggedIn'] = $user; 

$ user là một ví dụ lớp tài

bây giờ điều này là những gì print_r ($ _ SESSION [' loggedIn ']) hiển thị cho tôi:

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

trong đó xxxx là giá trị đúng.

nhưng khi tôi cố truy xuất dữ liệu từ phiên của mình. như vậy: "$ _SESSION ['loggedIn'] -> username" nó trả về một giá trị null cho tôi.

+0

bản sao có thể có của ["Lưu trữ đối tượng PHP trong biến số phiên"] (http://stackoverflow.com/questions/2042271/storing-a-php-object-in-a-session-variable), [" Phiên PHP với một đối tượng không đầy đủ "] (http://stackoverflow.com/questions/1055728/php-session-with-an-incomplete-object), [" Vấn đề với đối tượng phiên PHP "] (http: // stackoverflow. com/questions/5348457/problem-with-php-session-object). – outis

+1

Xem thêm ["PHP: Lưu trữ 'đối tượng' bên trong $ _SESSION"] (http://stackoverflow.com/questions/132194/php-storing-objects-inside-the-session), ["Tôi có thể lưu trữ một đối tượng Trong một phiên? "] (Http://www.phpriot.com/articles/intro-php-sessions/8). – outis

+0

tôi sẽ không làm điều đó. Bạn có thể kết thúc với dữ liệu cũ, nếu, ví dụ, người dùng sử dụng một máy tính khác để thay đổi email của mình khi đăng nhập trên một máy tính khác. Hoặc nếu bạn xóa người dùng khỏi cơ sở dữ liệu, ứng dụng của bạn sẽ vẫn nghĩ rằng người dùng đó tồn tại. Thay vào đó, tôi sẽ chỉ lưu trữ id người dùng trong phiên và truy xuất phần còn lại của thông tin từ cơ sở dữ liệu khi xử lý các yêu cầu từ người dùng. – shesek

Trả lời

12

Trước tiên, bạn phải sắp đặt từng đối tượng trong một chuỗi:

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

và:

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

Chỉ cần chắc chắn rằng lớp đầu tiên được xác định trước khi unserializing đối tượng.

+10

PHP sẽ [serialize] (http://svn.php.net/viewvc/php/php-src/trunk/ext/session/session.c?revision=314376&view=markup#l187) và [unserialize] (http://svn.php.net/viewvc/php/php-src/trunk/ext/session/session.c?revision=314376&view=markup#l205) biến phiên tự động. Lý do câu trả lời này hoạt động là lưu ý về việc đảm bảo lớp được xác định trước khi unserializing. – outis

+0

@outis Bạn có thể cung cấp một tham chiếu không? Hai liên kết bạn đăng đã chết, nhưng tôi đang tìm một tham chiếu xác nhận rằng việc tuần tự thực sự được thực hiện tự động. –

+0

@Bram: các liên kết đến mã nguồn; cụ thể, ext/session/session.c. Đó là tài liệu tham khảo duy nhất tôi biết (có một chút công bằng về hành vi của PHP không được ghi lại). – outis

-1

$_SESSION biến dường như chỉ có thể lưu trữ mảng, số và chuỗi.

Chúng không thể lưu trữ đối tượng lớp sau khi bạn chuyển sang trang mới.

+0

ok, vậy điều tôi có thể làm là tạo một mảng trong phiên? và điền vào đó với các giá trị nhất định được lấy từ do-login.php? – sn0ep

+0

@Toby, có bạn có thể làm điều đó. – Neal

+0

Bạn có một nguồn cho điều này, hay đây là một câu trả lời sai (đi từ các câu trả lời khác). –

2

Trong khi trên cùng một trang, biến số session hoạt động giống như một biến thể khác, do đó bạn có thể thực hiện với những gì bạn muốn. Đó là lý do tại sao bạn có thể lưu trữ các đối tượng trong khi vẫn còn trên trang đó.

Truy xuất sau này sẽ thực sự hiển thị nếu nó phù hợp với session, không phải trong trường hợp của bạn.

Nếu bạn thực sự cần phải lưu đối tượng đó, bạn có thể thử và lưu nó dưới dạng đối tượng được tuần tự hóa, và unserialize nó sau khi truy xuất. Điều đó sẽ hoạt động, mặc dù tôi không biết đây có phải là thiết kế/sollution tốt nhất hay không. Việc truyền các vật thể xung quanh như thế này có thể được coi là một chút ... chống mẫu

7

Bạn có thể lưu trữ các đối tượng trong $_SESSION. PHP sẽ tuần tự hóa chúng cho bạn. Chỉ cần đảm bảo rằng lớp học được xác định trước khi gọi session_start hoặc có thể là autoloaded. Lý do giá trị được lưu trữ trong phiên có loại "__PHP_Incomplete_Class_Name" là lớp Người dùng không được xác định khi đối tượng được unserialized trong khi tải phiên (như được giải thích trong trang hướng dẫn sử dụng PHP trên object serialization).

Không thể tuần tự hóa tài nguyên. Nếu bạn đã từng lưu trữ một đối tượng sử dụng tài nguyên, hãy thực hiện __sleep and __wakeup để tùy chỉnh tuần tự hóa. Việc tuần tự hóa PHP sẽ có thể xử lý tất cả các loại khác, ngay cả khi chúng chứa tham chiếu vòng tròn.

Các vấn đề liên quan