PHP:\ Serializableインターフェースを実装するようになったphpオブジェクトを逆シリアル化できません

d-ph

ドキュメントによると

クラスがインターフェイスを実装する前にシリアル化されていた、このインターフェイスを現在実装しているクラスの古いインスタンスがシリアル化されていない場合、unserializeメソッドの代わりに__wakeup()が呼び出されます。これは、移行の目的で役立つ場合があります。

それはとても賢くて便利だと思い、チェックしたいと思いました。残念ながら、それは私にとってはうまくいきませんでした。私が間違っていることがあるのか​​、それともバグがあるのか​​疑問に思います。

テストコード:

//class Foo
class Foo implements \Serializable
{
    public $a = 'lorem';

    public function __wakeup()
    {
        fprintf(STDOUT, "in %s\n", __METHOD__);
    }

    public function serialize()
    {
        fprintf(STDOUT, "in %s\n", __METHOD__);

        return serialize([
            $this->a,
        ]);
    }

    public function unserialize($serialized)
    {
        fprintf(STDOUT, "in %s\n", __METHOD__);

        list(
            $this->a,
        ) = unserialize($serialized);
    }
}

//$foo = new Foo();
//var_dump(serialize($foo));
//exit;

$serialised = 'O:3:"Foo":1:{s:1:"a";s:5:"lorem";}';
//$serialised = 'C:3:"Foo":22:{a:1:{i:0;s:5:"lorem";}}';

$foo = unserialize($serialised);
var_dump($foo);

クラッシュします:

Warning: Erroneous data format for unserializing 'Foo' in /in/SHaCP on line 39
Notice: unserialize(): Error at offset 13 of 34 bytes in /in/SHaCP on line 39
bool(false)

本質的に、私$foo\Serializableインターフェイスの有無にかかわらずオブジェクトをシリアル化しました次に、インターフェイスを追加unserialize()し、前の形式でシリアル化されたオブジェクトを試行しました(で始まるシリアル化された文字列にOはインターフェイスがなく、で始まる文字列はインターフェイスがあることに注意してくださいC)。

ここで私が間違っていることはありますか?または多分私はドキュメントを誤解しましたか?

興味深いことに、コードは3v4l.orgのhhvmで正常に実行されます

ダニエル・プロトポポフ

これが、デフォルトのシリアル化とインターフェイスからのシリアル化の主な違いです。デフォルトでは、オブジェクト全体がシリアル化されますが、インターフェイスの実装では、作成済みのオブジェクトの属性をシリアル化する方法を定義します。

そのため、結果の文字列は内部実装のために異なります。ある場合は「O」で始まり、別の場合は「C」で始まります。そのため、もう一度保存する必要があります。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

PHPクラスは、実装しているインターフェイス型のオブジェクトを返すことができますか?

分類Dev

セッションで使用するためにphpでオブジェクトをシリアル化する

分類Dev

PHPの子クラスは、親クラスが実装するのと同じインターフェイスを実装できません

分類Dev

Serializableインターフェイスを実装しましたが、クラスオブジェクトはまだシリアル化できません

分類Dev

PHPで実装されたオブジェクトへのインターフェース参照

分類Dev

コンソールにオブジェクトを表示するJSONオブジェクトですが、phpスクリプトによって返された文字列からの「undefined」も含まれています

分類Dev

PHPでExcelシートをインポートしているときに2つのオブジェクトを区別できません

分類Dev

PHPでは、インクルードファイルから既存のクラスまたはオブジェクトインスタンスに関数をどのように追加しますか?

分類Dev

PHP-ユニットテスト:TYPO3Extbaseオブジェクトインターフェースを実装する方法

分類Dev

Jqueryで配列とオブジェクトをシリアル化し、Ajaxの後にPHPで逆シリアル化しますか?

分類Dev

パラメータの値でPHPのオブジェクト配列をフィルタリングするにはどうすればよいですか?

分類Dev

PHP(Laravel)でインターフェースの複数の実装をどのように使用しますか?

分類Dev

Webサービスに接続するときに、クラスstdclassのオブジェクトをphpで文字列に変換できませんでした

分類Dev

Webサービスに接続するときに、クラスstdclassのオブジェクトをphpで文字列に変換できませんでした

分類Dev

インターフェイスはPHPで実装できませんか?

分類Dev

PHPトレイトがインターフェースを実装できないのはなぜですか?

分類Dev

PHPインターフェースをTypescriptインターフェースにエクスポートしますか、またはその逆ですか?

分類Dev

PHPの「非オブジェクトでメンバー関数Xを呼び出す」ために画像をアップロードできません

分類Dev

PHPリクエスト間で、シリアル化できないプロセス固有のオブジェクトをどのように保存しますか?

分類Dev

PHPが常にオブジェクトを参照によってコピーする場合、メソッドで作成されたオブジェクトがメンバー変数に割り当てられるとどうなりますか?

分類Dev

シリアル化されたPHPオブジェクトがPOSTを介して渡されません。

分類Dev

シリアル化されたPHPオブジェクトがPOSTを介して渡されません。

分類Dev

php mysqlプロジェクトを無料のウェブホスティングサイトにアップロードするときにdbconnファイルのエラーを修正するにはどうすればよいですか?

分類Dev

$ foo-> $ bar ['bippo']が機能しなくなったのはいつですか?したがって、phpの配列である変数を介してオブジェクトフィールドにアクセスします

分類Dev

phpスクリプトrequire()ステートメントは、ブラウザから実行する場合はファイルをフェッチしますが、PleskCRONジョブから実行する場合はフェッチしません

分類Dev

PHPでjQueryデータを逆シリアル化できません

分類Dev

COMを使用してPHPから.Netオブジェクトを逆シリアル化する

分類Dev

このphpエラーを解決する方法(クラスCI_DB_mysql_resultのオブジェクトをintに変換できませんでした)

分類Dev

PHP Slim-異なるルートに複数のアプリオブジェクトを作成するにはどうすればよいですか?

Related 関連記事

  1. 1

    PHPクラスは、実装しているインターフェイス型のオブジェクトを返すことができますか?

  2. 2

    セッションで使用するためにphpでオブジェクトをシリアル化する

  3. 3

    PHPの子クラスは、親クラスが実装するのと同じインターフェイスを実装できません

  4. 4

    Serializableインターフェイスを実装しましたが、クラスオブジェクトはまだシリアル化できません

  5. 5

    PHPで実装されたオブジェクトへのインターフェース参照

  6. 6

    コンソールにオブジェクトを表示するJSONオブジェクトですが、phpスクリプトによって返された文字列からの「undefined」も含まれています

  7. 7

    PHPでExcelシートをインポートしているときに2つのオブジェクトを区別できません

  8. 8

    PHPでは、インクルードファイルから既存のクラスまたはオブジェクトインスタンスに関数をどのように追加しますか?

  9. 9

    PHP-ユニットテスト:TYPO3Extbaseオブジェクトインターフェースを実装する方法

  10. 10

    Jqueryで配列とオブジェクトをシリアル化し、Ajaxの後にPHPで逆シリアル化しますか?

  11. 11

    パラメータの値でPHPのオブジェクト配列をフィルタリングするにはどうすればよいですか?

  12. 12

    PHP(Laravel)でインターフェースの複数の実装をどのように使用しますか?

  13. 13

    Webサービスに接続するときに、クラスstdclassのオブジェクトをphpで文字列に変換できませんでした

  14. 14

    Webサービスに接続するときに、クラスstdclassのオブジェクトをphpで文字列に変換できませんでした

  15. 15

    インターフェイスはPHPで実装できませんか?

  16. 16

    PHPトレイトがインターフェースを実装できないのはなぜですか?

  17. 17

    PHPインターフェースをTypescriptインターフェースにエクスポートしますか、またはその逆ですか?

  18. 18

    PHPの「非オブジェクトでメンバー関数Xを呼び出す」ために画像をアップロードできません

  19. 19

    PHPリクエスト間で、シリアル化できないプロセス固有のオブジェクトをどのように保存しますか?

  20. 20

    PHPが常にオブジェクトを参照によってコピーする場合、メソッドで作成されたオブジェクトがメンバー変数に割り当てられるとどうなりますか?

  21. 21

    シリアル化されたPHPオブジェクトがPOSTを介して渡されません。

  22. 22

    シリアル化されたPHPオブジェクトがPOSTを介して渡されません。

  23. 23

    php mysqlプロジェクトを無料のウェブホスティングサイトにアップロードするときにdbconnファイルのエラーを修正するにはどうすればよいですか?

  24. 24

    $ foo-> $ bar ['bippo']が機能しなくなったのはいつですか?したがって、phpの配列である変数を介してオブジェクトフィールドにアクセスします

  25. 25

    phpスクリプトrequire()ステートメントは、ブラウザから実行する場合はファイルをフェッチしますが、PleskCRONジョブから実行する場合はフェッチしません

  26. 26

    PHPでjQueryデータを逆シリアル化できません

  27. 27

    COMを使用してPHPから.Netオブジェクトを逆シリアル化する

  28. 28

    このphpエラーを解決する方法(クラスCI_DB_mysql_resultのオブジェクトをintに変換できませんでした)

  29. 29

    PHP Slim-異なるルートに複数のアプリオブジェクトを作成するにはどうすればよいですか?

ホットタグ

アーカイブ