2009-03-02 17 views
5

Dojo Ajax xhrGetコールから2通りの方法で呼び出されるPHPスクリプトがあります。 スクリプトがStateListクラスのインスタンスを作成し、状態名のファイルを読み込むようにする "init"引数で初めて呼び出されたとき。PHPクラス・インスタンスを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; 
} 

第二及び更なる時間が、別のxhrGetコールは、「GETSTATE」引数を渡し、次のコードは、セッションアレイからStateListクラスOFRインスタンスを取得しようとします。

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

}

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

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

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

+0

@を使用しないようにしてください。抑止するためのエラーがないようにコードを正しく書いてください。 –

答えて

1

保存する前に、$ stオブジェクト/変数serializeが必要な場合があります。これにより、すべてがセッションに保存されます。これは確かにobject orientedコードに行く方法です。データを再度使用する場合は、unserializeにする必要があります。

+6

セッション変数は自動的にシリアル化され、シリアル化されません。 – outis

14

session_start()を呼び出す前にクラス定義を含める必要があります。そうしないと、オブジェクトは正しくデシリアライズされず、__PHP_Incomplete_Classのインスタンスになります。それ以外の場合はうまくいくはずです。

+1

あなたが提案したように定義を移動すると、セッション配列から返される値はnullです。 –

+0

display_errorsをオンにしていて、E_ALLをerror_reportingしていますか?最初のビットが実際に実行されていることを確認できますか($ comd == "init")? –

0

セッションにオブジェクトを保存する場合は、link textにする必要があります。PHPでオブジェクトをシリアル化する際に問題が多くありますが、セッションに保存することはできません。私はこれをやって、あなたの問題に対して別の解決策を見つけることをお勧めします。あなたがそれをやろうとするならば、セッションで呼び出されたときに再インスタンス化を容易にするために、あなたのクラスで定義すべき '魔法の方法' link textを調べるべきです。

0

session.auto_startが有効になっていますか?手動のセッションページでは、あなたがしなければ、あなたは異なったクラス定義をロードするために持っていることを述べている:

あなたはsession.auto_startをオンにすると、あなたのセッションにオブジェクトを配置する唯一の方法はauto_prepend_fileを使用して、そのクラス定義をロードすることですクラス定義をロードします。それ以外の場合は、オブジェクトをシリアライズし、後でそのオブジェクトを直列化解除する必要があります。

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

そのページが言うように、オブジェクトのシリアライズ/アンシリアライズは、通常はPHPにより自動的に行われますが、session.auto_startが有効になったことは、これを変更します。

+0

いいえ有効になっていません。面白いコード。 –

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に、セッション自体に格納されているシリアル化された文字列値を確認します。あなたは実際にシリアル化されたオブジェクトを格納していますか?あなたのdevの環境では、(または同じことを行うにはini_setメソッドを使用)、/ tmpのようなものにphp.iniのsession.save_pathはiniファイルの値を設定:

session.save_path = "/tmp" 

、その後に作成されたファイルを調べ/ tmp(または何らかのフォルダ)。プロパティに保存された

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

オブジェクトをインスタンス化するクラスの名前もそこに含まれます、だけでなく、値:あなたは、で始まる文字列が表示されます。

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()); 
    } 
+0

私はそれを試みるかもしれないと思う。 – transilvlad

関連する問題