ホームページ >バックエンド開発 >PHPチュートリアル >PHPでのアンシリアライズとオートロード

PHPでのアンシリアライズとオートロード

WBOY
WBOYオリジナル
2016-07-25 09:03:38986ブラウズ
  1. $string = 'O:6:"Foobar":2:{s:3:"foo";s:1:"1";s:3: "bar";s:1:"2";}';

  2. $result = unserialize($string);
  3. var_dump($result);

  4. /*

  5. object(__PHP_Incomplete_Class)[ 1]
  6. public '__PHP_Incomplete_Class_Name' => 文字列 'Foobar' (長さ=6)
  7. public 'foo' => 文字列 '1' (長さ=1)
  8. public 'bar' => =1)
  9. */
  10. ?>
コードをコピー

オブジェクトを逆シリアル化するときに、オブジェクトのクラス定義が存在しない場合、PHP は未完成のクラス Concept を導入します。つまり、次のようになります。 __PHP_Incomplete_Class。現時点ではデシリアライズは成功していますが、まだオブジェクト内のデータにアクセスできません。アクセスできない場合は、次のエラー メッセージが表示されます。 スクリプトがメソッドを実行しようとしたか、不完全なオブジェクトのプロパティにアクセスしようとしました。操作しようとしているオブジェクトのクラス定義が unserialize() が呼び出される前にロードされていることを確認するか、クラスをロードする __autoload() 関数を提供してください。定義

これは難しいことではありません。強制的な型変換を実行して配列に変換するだけです。

  1. $string = 'O:6:"Foobar":2:{s:3:"foo";s:1:"1";s:3 :"bar";s:1:"2";}';
  2. $result = (array)unserialize($string);
  3. var_dump($result);

  4. /*

  5. array
  6. '__PHP_Incomplete_Class_Name' => 文字列 'Foobar' (長さ=6)
  7. 'foo' => 文字列 '1' (長さ=1)
  8. 'バー' => 文字列 '2' (長さ=1)
  9. * /
  10. ?>

コードをコピー

しかし、システムで自動ロードが有効になっている場合、状況はさらに複雑になります。ちなみに、PHP には unserialize_callback_func という設定オプションが用意されていますが、その意味は autoload と似ていますので、ここでは紹介しません。例は次のとおりです。

  1. spl_autoload_register(function($name) {
  2. var_dump($name);
  3. });
  4. $string = 'O:6:"Foobar":2:{s:3: "foo"; s: 1: "1"; s: 1: "2";
  5. $result = ($string); ;
  6. ?>
コードをコピー
上記のコードを実行すると、spl_autoload_register がトリガーされることがわかります。ほとんどの場合、これは理にかなっていますが、不適切に定義された spl_autoload_register が発生した場合は、次のような悲劇が起こります。次のコードのようになります。

  1. spl_autoload_register(function($name) {
  2. include "/path/to/{$name}.php";
  3. });
  4. $string = 'O:6:"Foobar ": 2: {s: 3: "foo"; s: 1: "1"; s: 3: "bar"; s: 1: "2"; }';
  5. $result = (array)unserialize($ string);
  6. var_dump($result);
  7. ?>
コードをコピー
間違いなく、クラス定義ファイルが見つからないため、エラーが報告されます。 spl_autoload_register を変更することは確かに可能ですが、サードパーティのコードが関係している場合は、現時点では、自動ロードをバイパスするための決定を行うことができません。最も簡単な方法は、FAKE out が必要なクラスを追加することです。

  1. spl_autoload_register(function($name) {
  2. include “/path/to/{$name}.php”;
  3. });
  4. class Foobar {} // ああ、クソ!
  5. $string = 'O:6:"Foobar":2:{s:3:"foo";s:1:"1";s:3:"bar";s:1:"2";}' ;
  6. $result = (array)unserialize($string);
  7. var_dump($result);
  8. ?>
コードをコピー
上記のコードは本当にゴミだと言わざるを得ません。一人の人物を紹介するために、私は次のように書きました。

  1. spl_autoload_register(function($name) {
  2. include “/path/to/{$name}.php”;
  3. });

  4. $string = 'O:6:"Foobar":2:{s:3:"foo";s:1:"1";s:3:"bar";s:1:"2" ;}';

  5. $functions = spl_autoload_functions();
  6. foreach ($functions としての $function) {
  7. spl_autoload_unregister($function);
  8. }

  9. $result = (array)unserialize($ string);

  10. foreach ($functions としての $function) {

  11. spl_autoload_register($function);
  12. }
  13. var_dump($result);
  14. ?>
コードをコピー

コードが少し増えていますが、少なくとも FAKE クラスがないため、より快適に見えます。



声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。