whateverthing/captain-cold

一个可以被冻结(变为只读)的数组

v1.0.0 2023-09-30 21:49 UTC

This package is auto-updated.

Last update: 2024-08-30 01:48:44 UTC


README

PHP 有数组。PHP 有只读属性。PHP 没有能力将非只读数组转换为只读。

这个库旨在解决这个问题非常罕见的边缘情况。

灵感

我看到一个 Mastodon 帖子,有人声称 Lua 表达式在所有可能的方式上优于 JSON。但当我深入研究时,我觉得 Lua 表达式和 PHP 表并不那么不同。它们似乎都混合了数组、字典等概念。

但是,Lua 表有 .freeze() 选项。PHP 没有。

所以我决定创建一个愚蠢的用户空间实现来看看它是否可能提供一些价值。

虽然我最初的直觉是想以 Mr. Freeze 命名,第二个想法是想以 Nora Fries(又称 Mrs. Freeze)命名,但我决定以 Captain Cold 命名。又一个冰主题的 DC 恶棍。

如果它对某人有所帮助,我可能会将项目重命名为 Whateverthing\Freezable

安装

composer require whateverthing/captain-cold

使用方法

将数组传递到 FreezableArray 构造函数中,将创建一个可冻结的对象。

FreezableArray

示例

$array = ['one', 'two', 'three'];
$freezableArray = new \Whateverthing\CaptainCold\FreezableArray($array);

然后您可以通过调用 ->freeze() 来锁定数组

$freezableArray->freeze();
$freezableArray[] = 'four'; // Fatal error: Cannot modify readonly property

FrozenArray

FrozenArray 对象在构造时以及始终是不可变的。

$array = ['one', 'two', 'three'];
$freezableArray = new \Whateverthing\CaptainCold\FrozenArray($array);

$freezableArray[] = 'four'; // Fatal error: Cannot modify readonly property

ThawableArray

ThawableArray 类以与其他不可变对象相同的方式处理不可变性:通过获取一个新的对象。

$array = ['one', 'two', 'three'];
$thawableArray = new \Whateverthing\CaptainCold\ThawableArray($array);
$thawableArray->freeze();

$thawableArray[] = 'four'; // Fatal error: Cannot modify readonly property

$thawedArray = $thawableArray->thaw();

$thawedArray[] = 'four'; // Works!

// However, if you freeze it again, it becomes immutable.
$thawedArray->freeze();
$thawedArray[] = 'five'; // Fatal error: Cannot modify readonly property

ThawableArray 的一个特点是,如果原始数组尚未被冻结,调用 ->thaw() 将返回 $this。这可能导致一些奇怪的行为。

$array = ['one', 'two', 'three'];
$thawableArray = new \Whateverthing\CaptainCold\ThawableArray($array);
$thawedArray = $thawableArray->thaw();

$thawedArray[] = 'four'; // Works!

// However, if you freeze it again, it becomes immutable.
$thawedArray->freeze();
$thawedArray[] = 'five'; // Fatal error: Cannot modify readonly property

// But look, the original array has also become frozen!
$thawableArray[] = 'five';  // Fatal error: Cannot modify readonly property

目前,这种行为是故意的。然而,我越想,就越觉得它太令人困惑/危险了。

贡献

欢迎贡献,但请注意,我并不是世界上反应最快的人。如果某件事看起来进展缓慢,那可能意味着我需要再次被 ping,以便发现或重新发现它。

如果您有任何改进的想法,请让我们在 issues 或 Mastodon 上讨论,我的联系方式是

https://phpc.social/@kboyd (@kboyd@phpc.social).

我特别有兴趣了解这个想法是否曾经帮助过任何人。