5

DojoAjaxxhrGet呼び出しから2つの方法で呼び出されるPHPスクリプトがあります。初めて「init」引数を指定して呼び出されると、スクリプトはStateListクラスのインスタンスを作成し、状態名のファイルを読み込みます。

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;
}

2回目以降は、別のxhrGet呼び出しが「getstate」引数を渡し、次のコードはSESSION配列からStateListクラスのインスタンスを取得しようとします。

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

}

ただし、getSize()メソッドが実行されることはなく、再構成されたStateListクラスインスタンスで他のメソッドを呼び出すこともできません。

これは、上部にクラス定義が含まれているPHPスクリプトの1つであるため、クラスメソッドは既知であり、使用可能である必要があることに注意してください。

ここで何が欠けていますか?

4

6 に答える 6

13

を呼び出す前にクラス定義を含める必要がありますsession_start()。そうしないと、オブジェクトが正しく逆シリアル化されず、 のインスタンスになります__PHP_Incomplete_Class。そうでなければ、あなたが持っているものはうまくいくはずです。

于 2009-03-02T18:54:30.870 に答える
1

保存する前に $st オブジェクト/変数をシリアル化する必要がある場合があります。これにより、すべてがセッションに保存されます。これは間違いなく、オブジェクト指向コードの方法です。データを再度使用する場合は、シリアル化を解除する必要があります。

于 2009-03-02T18:52:47.380 に答える
1

これは、単独でデバッグするのが難しいものの 1 つです。インスタンス化されたオブジェクトを PHP セッションに格納するのは常に少しトリッキーで、100% 動作する保証はありません。これを理解するのに役立つ一般的なデバッグのヒントを次に示します。

まず、Apache エラー ログを確認します。「オブジェクト以外のエラーで呼び出されたメソッド」が表示されていますか? もしそうなら、これはあなたがセッションからオブジェクトを取り戻していないことを意味します。そうでない場合、別の理由でメソッド呼び出しが失敗していることを示すエラーはありますか?

次に、セッションから実際に何が得られているかを確認します。

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);
}   

3 番目に、セッション自体に格納されているシリアル化された文字列値を確認します。実際にシリアル化されたオブジェクトを保存していますか? 開発環境で、php.ini の session.save_path ini 値を /tmp などに設定します (または ini_set メソッドを使用して同じことを行います)。

session.save_path = "/tmp"

次に、/tmp (または任意のフォルダー) に作成されたファイルを調べます。次で始まる文字列が表示されます。

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

オブジェクトをインスタンス化したクラスの名前と、プロパティに保存された値もそこに含まれます。

于 2009-03-02T20:24:56.083 に答える
0

これを試して:

    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());
    }
于 2012-03-29T16:13:28.470 に答える
0

オブジェクトをセッションに保存する場合は、リンク テキストにする必要があります。オブジェクトをセッションに保存することは言うまでもなく、PHP でオブジェクトをシリアライズすることには多くの問題があります。これを完全に行うことはお勧めしません。問題の別の解決策を見つけることをお勧めします。ただし、それを行う場合は、セッションから呼び出されたときに再インスタンス化を容易にするために、クラスで定義する必要がある「マジック メソッド」リンク テキストを調べる必要があります。

于 2009-03-02T18:55:34.330 に答える
0

有効にしていsession.auto_startますか?マニュアルのセッションページには、そうする場合、クラス定義を別の方法でロードする必要があると記載されています。

session.auto_start をオンにした場合、セッションにオブジェクトを配置する唯一の方法は、クラス定義をロードする auto_prepend_file を使用してそのクラス定義をロードすることです。

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

そのページにあるように、オブジェクトのシリアル化/非シリアル化は通常 PHP によって自動的に行われますが、session.auto_start有効にするとこれが変わります。

于 2009-03-02T18:56:40.693 に答える