3

私がそうするならserialize($obj)、私は得る:

「クロージャ」のシリアル化は許可されていません

シリアル化するときにこれらのクロージャを無視できる方法はありますか?とにかく文字列のシリアル化を解除するときは必要ありません(これらのプロパティの値はnullなどにすることができます)。

私のクラスは次のように見えます。

Class Node{

  protected $attrs = array();

}

$attrsは、次のようなクロージャであるいくつかの要素を含むことができる連想配列です。 $attrs['validator'] = function(){...}

4

4 に答える 4

9

それは簡単です:あなたはできません。クロージャはシリアル化できません。「似たようなもの」を作成したい場合__invoke()は、クロージャの代わりに実装するクラスのオブジェクトを使用できます。

クロージャが必要ない場合(または、シリアル化を解除するときに自分でクロージャを再作成できる場合)、シリアル化中Serializableにクロージャを実装し、考慮しないでください。このインターフェース(実装serialize()と)は/unserialize()よりも優先されるべきです。__sleep()__wakeup()

于 2013-01-09T13:05:37.897 に答える
3

シリアル化できる関数を作成しましたException。これは、バックトレースの複素数値をフラット化することによって行われます。

ソース:

https://gist.github.com/Thinkscape/805ba8b91cdce6bcaf7c

使用法:

<?php
try {
    // exception gets thrown here, i.e.
    // throw new Exception(); 
} catch (Exception $exception) {
    flattenExceptionBacktrace($exception);
    $serialized = serialize($exception);

    $unserialized = unserialize($serialized);
    print_r($unserialized->getTraceAsString());
}
于 2015-03-06T17:25:56.493 に答える
2

_sleep ()の独自の実装を提供し_wakeupメソッド

于 2013-01-09T13:01:08.700 に答える
1

クロージャを無視してオブジェクトのプロパティをシリアル化するには:

$properties = array_map(function ($property) {
    try {
        return serialize($property);
    } catch (\Exception $e) {
        return null;
    }
}, get_object_vars($this));
于 2018-10-04T08:19:37.743 に答える