0

オブジェクトをセッションに保存するときに少し問題があります。私が理解していると思うことによると、クラスがシリアライズ可能で、呼び出す前にそれを含めるとsession_start()、php はオブジェクトを自動的にシリアライズ/アンシリアライズします。

次の例 ( qcodo 0.4.22 フレームワークを使用) では、オブジェクトの値を復元できません:

require(dirname(__FILE__) . '/../includes/prepend.inc.php');
QApplication::QcodoInfo();

if (!isset($_SESSION["person"])) {
    $person = Person::LoadById(1);
    $_SESSION["person"]=$person;
}
else {
    echo "Hello ".$_SESSION["person"]->FirstName;
}

だから、働くために私はやることを余儀なくされています:

require(dirname(__FILE__) . '/../includes/prepend.inc.php');
QApplication::QcodoInfo();

if (!isset($_SESSION["person"])) {
    $person = Person::LoadById(1);
    $_SESSION["person"]=serialize($person);
}
else {
    echo "Hello ".unserialize($_SESSION["person"])->FirstName;
}

qcodo を使用しないクラスでは、シリアライゼーションを使用する必要はありません。シリアル化を回避することはできますか?

4

2 に答える 2

1

フォーラムへのリンクを提供していただきありがとうございます。そこに非常に重要な情報を入れます:

オブジェクトがセッションにあるときに、「スクリプトがメソッドを実行しようとしたか、不完全なオブジェクトのプロパティにアクセスしようとしました。」</p>

つまり、セッションのシリアル化を解除する時点では、クラス定義はまだロードされていません。アンシリアル化は で行われsession_startます。そのため、最初にすべてのクラス定義をロードしてから、セッションを開始してください。そのコンテキストで役立つのは次のとおりです。

  • クラスドキュメントの自動読み込み
  • 定義unserialize_callback_funcします (PHP 設定、unserializeドキュメントを参照)。未定義のクラスをインスタンス化する必要があるたびに呼び出されるため、自動ロードのようにコールバックを介してクラスをロードできます (自動ロードが最初に行われますが、これをデバッグに使用できます)。
  • 関連:(質問のタイトルは誤解を招くものです。興味深い部分は答えです:)

そのため、セッションがどのように開始されるかを調べてみてください。後で開始する必要があるだけかもしれません。PHPマニュアルには、セッションに関する一般的な情報と、開始時の設定方法が記載されています。セッションを自動開始するオプションがあります。おそらくあなたはそれに遭遇していますが、それは単なる仮定です、さらに設定する必要があり、Qcodo がクラスをロードする方法に精通していません。

于 2011-09-15T12:19:25.007 に答える
0

ありがとう!。私はあなたのコメントで解決に近づいています。

qcodoコアを見ると、セッションが初期化されている場所がわかります.....そして、クラスを含める前に行われます。

問題は、クラスを呼び出した瞬間にクラスが含まれていることです (どうすればそれが可能になるのでしょうか?)。クラスファイルにエコー文を書いてあるのですが、クラスを使った瞬間にそのエコーが出てきます。このため、問題を解決するために session_start() を呼び出すタイミングがわかりません。

編集: PHP の「自動ロード」機能を発見しました。そのためですか?私の質問は、オートロードを維持して適切なタイミングでセッションを開始できるかどうかです

EDIT2:私は最終的に解決策を見つけました。qcodo フォーラムでは、いくつかのオプションが提案されました。最後に、qcodo が session_start 関数を呼び出す前に、データ クラスを含める必要がありました。みんなにthx

于 2011-09-15T12:47:39.553 に答える