__PHP_Incomplete_Class オブジェクトとシリアル化のシリアル化解除
ショッピング カート クラスを扱っていたとき、$_SESSION で特別な処理を行ったので、$_SESSION にオブジェクトを直接処理するのに失敗したため、それを Serialized に追加しました。 。
処理には問題ありませんが、デシリアライズされたメンバー関数__PHP_Incomplete_Classオブジェクトの呼び出し時にエラーが発生します。
問題は実際には非常に単純です。つまり、デシリアライズされたインスタンスにクラス定義が見つからず、処理方法も非常に単純です。関連するクラスの定義を session_start() の前に置くだけです。 ;。
補足として処理のアイデアを残します。
オブジェクトがシリアル化されておらず、そのクラス定義が存在しない場合、
それは "__PHP_Incomplete_Class" のインスタンスになります。
問題ありません...しかし、私を悩ませているのは、それをバニラ風味の "stdClass" オブジェクトのように扱うことはできず、
get_object_vars() を使用してそのメンバー変数を設定することはできません。
私の例を試してください:
// __PHP_Incomplete_Class オブジェクトを強制します
$sleepstring = 'O:12:"missingclass": 1 :{s:5:"myvar";s:11:"hello world";}';
$Obj = unserialize($sleepstring);
// 壊れているかどうかをテストします。 $isbroken = is_a($Obj, '__PHP_Incomplete_Class');
var_dump($isbroken) // bool(true)
// プロパティをテストします
var_dump( $Obj->myvar ); ; // NULL となり、E_NOTICE が発生します
$vars = get_object_vars($Obj);
var_dump( $vars['myvar'] ); // string(11) "こんにちは"
?>
オブジェクトに値を設定するためのハック/回避策を知っている人はいますか?
* 1 つのアイデア*
stdClass インスタンスを作成し、プロパティをコピーします。
オブジェクトが再度シリアル化されるときに結果の文字列をハックします。
: str_replace('O:8:"missingclass"', 'O:12:"missingclass"', $ sleepstring) )
?>
ただし、これはセッション スリープでは機能しません!
原文: http://www.flymote.com/archiver/a-3078.html