omegacms/serializable-closure

Omega CMS 可序列化闭包包

1.0.0 2024-09-13 17:51 UTC

This package is auto-updated.

Last update: 2024-09-13 17:51:32 UTC


README

可序列化闭包包提供了一种方便且安全的方式来序列化PHP中的闭包。它允许您序列化和反序列化闭包,即使在不同PHP进程之间也能保留其状态和功能。这在需要存储和检索闭包的场景中特别有用,例如在缓存机制或队列系统中。

工作原理

该包引入了两个主要类:SerializableClosureUnsignedSerializableClosure

  • SerializableClosure:此类旨在为需要额外安全措施的闭包设计。它支持签名序列化,这意味着闭包与一个密钥相关联以增加安全性。签名者可以通过setSecretKey方法配置。

  • UnsignedSerializableClosure:此类适用于不需要签名密钥的闭包。它提供了一种简单的方式来序列化闭包,而不需要额外的安全措施。

⚠️ 实验性功能:匿名函数的序列化

注意:此功能为实验性! 我们已添加了对匿名函数序列化的支持,但请注意。此功能被视为实验性,我们建议仅在完全理解其影响的情况下使用。

匿名函数序列化涉及复杂性和潜在风险,其使用应谨慎对待。如果您不确定后果或不需要此功能,建议坚持使用命名函数或闭包进行序列化。

在将此功能纳入代码之前,请确保您了解其影响,并且能够处理可能出现的任何潜在问题。请谨慎操作!

要求

  • PHP 8.2 或更高版本

通过Composer安装

要安装包,请将以下内容添加到您的 composer.json 文件中

{
    "require": {
        "omegacms/serializable-closure": "^1.0.0"
    }
}

然后运行

composer install

入门指南

示例1:使用SerializableClosure签名

use Omega\SerializableClosure\SerializableClosure;

// Create a closure.
$closure = fn() => 'YOUR_STRING_HERE';

// Set a secret key for signing.
SerializableClosure::setSecretKey( 'secret' );

// Serialize the closure
$serialized = serialize( new SerializableClosure( $closure ) );

// Unserialize and get the closure.
$closure    = unserialize( $serialized )->getClosure();

// Print result.
echo $closure(); // Output: YOUR_STRING_HERE

示例2:使用UnsignedSerializableClosure

use Omega\SerializableClosure\UnsignedSerializableClosure;

// Create a closure
$closure = fn( $value ) => strtoupper( $value );

// Serialize the closure
$serialized = serialize( new UnsignedSerializableClosure( $closure ) );

// Unserialize and get the closure
$unserialized = unserialize( $serialized )->getClosure();

// Invoke the closure
echo $unserialized( 'hello' ); // Output: HELLO

示例3:使用SerializableClosure签名以及匿名函数

use Omega\SerializableClosure\SerializableClosure;

// Create a closure.
$closure = function() {
    $anonymousClass = new class {
        public function getMessage() : string {
            return "Helloo from anonymous class!";
        }
    };
    
    return $anonymousClass->getMessage();
};

// Serialize
$serialized = serialize( new SerializableClosure( $closure ) );

// Unserialize
$unserializedClosure = unserialize( $serialized );

//Invoke the closure
$result = $unserializedClosure();

echo $result; // Output: Hello from anonymous class!

示例4:使用UnsignedSerializableClosure匿名函数

use Omega\SerializableClosure\UnsignedSerializableClosure;

// Create a closure
$anonymousFunction = function( $name ) {
    return "Hello, $name!";
};

// Create UnsignedSerializableClosure
$unsignedClosure = new UnsignedSerializableClosure( $anonymousFunction );

 // Serialize
 $serialized = serialize( $unsignedClosure );
 
 // Deserialize
 $unserialized = unserialize( $serialized );
 
 // Invoke the closure
 $result = $unserialized( "Jhon" );
 
 // Echo the closure
 echo $result; // Output: Hello, Jhon!

贡献

如果您想为OmegaCMS可序列化闭包包做出贡献,请遵循我们的贡献指南

许可证

本项目是开源软件,根据GNU通用公共许可证v3.0授权。