-
-
$string = 'O:6:"Foobar":2:{s:3:"foo";s:1:"1";s:3: "bar";s:1:"2";}'; - $result = unserialize($string);
- var_dump($result);
/*
- object(__PHP_Incomplete_Class)[ 1]
- public '__PHP_Incomplete_Class_Name' => 文字列 'Foobar' (長さ=6)
- public 'foo' => 文字列 '1' (長さ=1)
- public 'bar' => =1)
- */
- ?>
-
-
コードをコピー
オブジェクトを逆シリアル化するときに、オブジェクトのクラス定義が存在しない場合、PHP は未完成のクラス Concept を導入します。つまり、次のようになります。 __PHP_Incomplete_Class。現時点ではデシリアライズは成功していますが、まだオブジェクト内のデータにアクセスできません。アクセスできない場合は、次のエラー メッセージが表示されます。
スクリプトがメソッドを実行しようとしたか、不完全なオブジェクトのプロパティにアクセスしようとしました。操作しようとしているオブジェクトのクラス定義が unserialize() が呼び出される前にロードされていることを確認するか、クラスをロードする __autoload() 関数を提供してください。定義
これは難しいことではありません。強制的な型変換を実行して配列に変換するだけです。
-
-
- $string = 'O:6:"Foobar":2:{s:3:"foo";s:1:"1";s:3 :"bar";s:1:"2";}';
- $result = (array)unserialize($string);
- var_dump($result);
/*
- array
- '__PHP_Incomplete_Class_Name' => 文字列 'Foobar' (長さ=6)
- 'foo' => 文字列 '1' (長さ=1)
- 'バー' => 文字列 '2' (長さ=1)
- * /
- ?>
-
コードをコピー
しかし、システムで自動ロードが有効になっている場合、状況はさらに複雑になります。ちなみに、PHP には unserialize_callback_func という設定オプションが用意されていますが、その意味は autoload と似ていますので、ここでは紹介しません。例は次のとおりです。
-
- spl_autoload_register(function($name) {
- var_dump($name);
- });
- $string = 'O:6:"Foobar":2:{s:3: "foo"; s: 1: "1"; s: 1: "2";
- $result = ($string); ;
- ?>
-
-
コードをコピー
上記のコードを実行すると、spl_autoload_register がトリガーされることがわかります。ほとんどの場合、これは理にかなっていますが、不適切に定義された spl_autoload_register が発生した場合は、次のような悲劇が起こります。次のコードのようになります。
- spl_autoload_register(function($name) {
- include "/path/to/{$name}.php";
- });
- $string = 'O:6:"Foobar ": 2: {s: 3: "foo"; s: 1: "1"; s: 3: "bar"; s: 1: "2"; }';
- $result = (array)unserialize($ string);
- var_dump($result);
- ?>
-
コードをコピー
間違いなく、クラス定義ファイルが見つからないため、エラーが報告されます。 spl_autoload_register を変更することは確かに可能ですが、サードパーティのコードが関係している場合は、現時点では、自動ロードをバイパスするための決定を行うことができません。最も簡単な方法は、FAKE out が必要なクラスを追加することです。
- spl_autoload_register(function($name) {
- include “/path/to/{$name}.php”;
- });
- class Foobar {} // ああ、クソ!
- $string = 'O:6:"Foobar":2:{s:3:"foo";s:1:"1";s:3:"bar";s:1:"2";}' ;
- $result = (array)unserialize($string);
- var_dump($result);
- ?>
-
-
コードをコピー
上記のコードは本当にゴミだと言わざるを得ません。一人の人物を紹介するために、私は次のように書きました。
-
- spl_autoload_register(function($name) {
- include “/path/to/{$name}.php”;
- });
-
$string = 'O:6:"Foobar":2:{s:3:"foo";s:1:"1";s:3:"bar";s:1:"2" ;}';
- $functions = spl_autoload_functions();
- foreach ($functions としての $function) {
- spl_autoload_unregister($function);
- }
$result = (array)unserialize($ string);
foreach ($functions としての $function) {
- spl_autoload_register($function);
- }
- var_dump($result);
- ?>
-
-
-
コードをコピー コードが少し増えていますが、少なくとも FAKE クラスがないため、より快適に見えます。
|