pingyi/json-serializer

混合了两个用于序列化和反序列化PHP变量、对象和闭包的仓库。

v0.1.2 2023-02-01 02:42 UTC

This package is auto-updated.

Last update: 2024-09-04 19:12:59 UTC


README

简介

该仓库通过整合两个仓库(Zumba\JsonSerializerlaravel/serializable-closure)为PHP提供变量、对象和闭包的序列化和反序列化功能。

它仍然保留了原始仓库 Zumba\JsonSerializer 的操作,并解决了由于依赖仓库 SuperClosure\Serializer 已停止维护而导致无法序列化 闭包 的问题。

简单来说,该仓库补充了两个仓库的不足,并为PHP对象/闭包序列化提供了完整的解决方案。

安装

先决条件

  1. PHP 7.4 或 PHP 8^
  2. Composer

Composer 安装

composer require pingyi/json-serializer

如何使用

序列化数据

您仍然可以使用 Zumba\JsonSerializer 来序列化/反序列化您的变量或对象,它将像

class MyCustomClass {
	public $isItAwesome = true;
	protected $nice = 'very!';
}

$instance = new MyCustomClass();

$serializer = new Zumba\JsonSerializer\JsonSerializer();
$json = $serializer->serialize($instance);
// $json will contain the content {"@type":"MyCustomClass","isItAwesome":true,"nice":"very!"}

$restoredInstance = $serializer->unserialize($json);
// $restoredInstance will be an instance of MyCustomClass

(来自 Zumba\JsonSerializer)

有关其他更多操作,请参阅 Zumba\JsonSerializer

序列化闭包

您可能像这样序列化包括闭包在内的数据

use Pingyi\JsonSerializer\ClosureSerializer\ClosureSerializer;
use Zumba\JsonSerializer\JsonSerializer;

$outsideData = "Jack";
$toBeSerialized = [
    "name"      => 'N$ck',
    "arrayData" => [1, 2, 3],
    "closure_1"   => fn (string $s = "Hello") => print_r($s . PHP_EOL),
    "closure_2"   => function (string $s = "Hello") use ($outsideData) {
        print_r("{$s} {$outsideData}." . PHP_EOL);
    }
];

$jsonSerializer = new JsonSerializer(new ClosureSerializer());

$serializedData   = $jsonSerializer->serialize($toBeSerialized);
$unserializedData = $jsonSerializer->unserialize($serializedData);

call_user_func($unserializedData["closure_1"]);
call_user_func($unserializedData["closure_2"]);

或者包含闭包的类,像这样

use Pingyi\JsonSerializer\ClosureSerializer\ClosureSerializer;
use Zumba\JsonSerializer\JsonSerializer;
use stdClass;

$toBeSerializedClass = new stdClass();
$toBeSerializedClass->name      = "Mary";
$toBeSerializedClass->arrayData = [1, 2, 3];
$toBeSerializedClass->closure   = function (string $s = "Hello") {
    print_r("{$s}." . PHP_EOL);
};

$jsonSerializer = new JsonSerializer(new ClosureSerializer());

$serializedData   = $jsonSerializer->serialize($toBeSerializedClass);
$unserializedData = $jsonSerializer->unserialize($serializedData);

call_user_func($unserializedData->closure);

此外,您还可以使用 ClosureSerializer 来序列化简单的闭包

$closure   = function (string $s = "Hello") {
    print_r("{$s}." . PHP_EOL);
};

$closureSerializer = new ClosureSerializer();

$serializedData   = $closureSerializer->serialize($closure);
$unserializedData = $closureSerializer->unserialize($serializedData);

call_user_func($unserializedData);

此外,您可以在构造 ClosureSerializer() 时设置您的密钥

new ClosureSerializer("your secret key");