2009-03-02 76 views
5

Tôi có một tập lệnh PHP được gọi theo 2 cách từ cuộc gọi Dojo Ajax xhrGet. Lần đầu tiên nó được gọi với một đối số "init" gây ra kịch bản để tạo ra một thể hiện của lớp StateList và đọc trong một tập tin của các tên tiểu bang.Tại sao tôi không thể lưu trữ một cá thể lớp PHP dưới dạng biến SESSION

session_start(); 
@include('StateList.php'); 
require_once('phplog.php'); 

//start executing here 
$comd=$_GET['nexturl']; 
if($comd=="init") { 
$st = new StateList("../data/statestxt.txt"); 
$_SESSION['statefile'] = $st; 
} 

Lần thứ hai và lần tiếp theo, một cuộc gọi xhrGet khác vượt qua đối số "getstate" và mã sau đây cố gắng lấy dụ của lớp StateList từ mảng SESSION.

if($comd =="getstate") { 
$st= $_SESSION['statefile']; 
phplog("size=".$st->getSize()); 

}

Tuy nhiên, phương pháp getSize() không bao giờ được thực hiện, cũng không phải tôi có thể gọi bất kỳ phương pháp nào khác trên dụ lớp StateList tái.

Lưu ý rằng đây là một tập lệnh PHP KHÔNG bao gồm định nghĩa lớp ở đầu trang và do đó các phương thức lớp học nên được biết và có sẵn.

Tôi thiếu gì ở đây?

+0

Cố gắng tránh sử dụng @; chỉ cần viết mã của bạn đúng cách để không có bất kỳ lỗi nào để ngăn chặn. –

Trả lời

1

Bạn có thể cần phải serialize đối tượng/biến $ st trước khi lưu. Điều này sẽ đảm bảo rằng mọi thứ được lưu vào phiên. Đây chắc chắn là cách để đi cho mã số object oriented. Khi bạn muốn sử dụng lại dữ liệu, bạn phải unserialize nó.

+6

Các biến phiên được tự động tuần tự hóa và unserialized. – outis

14

Bạn cần phải bao gồm định nghĩa lớp trước khi gọi session_start(), nếu không đối tượng sẽ không được deserialized chính xác và sẽ là một ví dụ của __PHP_Incomplete_Class. Nếu không những gì bạn có nên làm việc tốt.

+1

Nếu tôi di chuyển định nghĩa như bạn đề xuất, giá trị được trả về từ mảng phiên là null. –

+0

bạn có display_errors và error_reporting E_ALL không? Bạn có thể chắc chắn rằng bit đầu tiên thực sự đang chạy ($ comd == "init") không? –

0

Nếu bạn định lưu trữ một đối tượng trong phiên, nó phải là link text. Có rất nhiều vấn đề với việc sắp xếp các đối tượng trong PHP, hãy để một mình lưu trữ chúng trong phiên. Tôi khuyên bạn nên làm điều này hoàn toàn, và tìm một giải pháp khác cho vấn đề của bạn. Nếu bạn sẽ làm điều đó mặc dù, bạn nên nhìn vào 'phương pháp ma thuật' link text mà bạn nên xác định trong lớp học của bạn để tạo thuận lợi cho nó reinstantiation khi nó được gọi là từ phiên.

0

Bạn đã bật session.auto_start chưa? Trang phiên của hướng dẫn sử dụng nói rằng nếu bạn làm như vậy, bạn phải tải định nghĩa lớp khác nhau:

Nếu bạn bật phiên làm việc.auto_start thì cách duy nhất để đưa đối tượng vào phiên của bạn là tải định nghĩa lớp bằng cách sử dụng auto_prepend_file trong đó bạn tải định nghĩa lớp khác, bạn sẽ phải sắp xếp lại đối tượng của bạn và unserialize nó sau đó.

http://php.net/manual/en/intro.session.php

Như Trang nói rằng, serialization/unserialization của đối tượng thông thường sẽ được thực hiện tự động bởi PHP, nhưng đã session.auto_start kích hoạt sẽ thay đổi điều này.

+0

Không có nó không được kích hoạt. –

1

Đây là một trong những điều khó gỡ lỗi trong sự cô lập. Lưu trữ các đối tượng instantiated trong PHP Sessions luôn luôn là một chút khôn lanh, và không đảm bảo 100% để làm việc. Dưới đây là một số mẹo gỡ lỗi chung có thể giúp bạn tìm ra điều này.

Trước tiên, hãy kiểm tra nhật ký lỗi apache của bạn. Bạn đang nhận được một "phương pháp được gọi là lỗi không đối tượng"?Nếu vậy, điều này có nghĩa là bạn không nhận được một đối tượng trở lại trong phiên. Nếu không, có lỗi nào cho biết cuộc gọi phương thức của bạn không thành công vì một lý do khác không?

Thứ hai, hãy kiểm tra xem bạn đang thực sự ra khỏi phiên của mình.

if($comd =="getstate") { 
    $st= $_SESSION['statefile']; 
    //get the class of st 
    phplog("instance=".get_class($st)); 

    //get a reflection dump of st 
    $ref = new ReflectionClass($st); 
    $string = $ref->__toString();  
    phplog("reflection=".$string); 
} 

Thứ ba, hãy xem giá trị chuỗi được tuần tự hóa được lưu trữ trong phiên đó. Bạn có thực sự lưu trữ một đối tượng được tuần tự hóa không? Trong môi trường dev của bạn, thiết lập giá trị session.save_path ini trong php.ini để một cái gì đó giống như/tmp, (hoặc sử dụng các phương pháp ini_set để làm điều tương tự):

session.save_path = "/tmp" 

và sau đó kiểm tra các tập tin được tạo ra trong/tmp (hoặc bất kỳ thư mục nào). Bạn sẽ thấy một chuỗi bắt đầu bằng:

statefile:O:.......... 

Tên của lớp đã khởi tạo đối tượng cũng sẽ được bao gồm trong đó, cũng như giá trị được lưu vào thuộc tính.

0

Hãy thử điều này:

include('StateList.php'); 
    require_once('phplog.php'); 
    // start your session after including your class file 
    session_start(); 

    //start executing here 
    $comd=$_GET['nexturl']; 
    if($comd=="init") { 
    $st = new StateList("../data/statestxt.txt"); 
    $_SESSION['statefile'] = $st; 
    } 

    if($comd =="getstate") { 
    // the ampersand creates a reference, preserving any further changes to your session data 
    $st = &$_SESSION['statefile']; 
    phplog("size=".$st->getSize()); 
    } 
+0

mã thú vị. tôi nghĩ tôi có thể thử. – transilvlad

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