mpyw / unclosure
适用于 Laravel PDO 的闭包解包器
v3.0.0
2021-11-18 12:21 UTC
Requires
- php: ^7.4 || ^8.0
Requires (Dev)
- phpstan/phpstan: >=1.1
- phpunit/phpunit: >=9.5
README
适用于 Laravel PDO 的闭包解包器。
要求
安装
composer require mpyw/unclosure
示例
在建立数据库连接后调用 PDO::setAttribute()
<?php use Mpyw\Unclosure\Value; use PDO; function withEmulation(PDO $pdo, bool $enabled): PDO { $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, $enabled); return $pdo; } $connector = function (string $dsn) { return new PDO($dsn); }; // Eager Evaluation $pdo = Value::withCallback($connector('sqlite::memory:'), 'withEmulation', true); // Lazy Evaluation $pdo = Value::withCallback($connector, 'withEmulation', true); $pdo = $pdo('sqlite::memory:');
暂时更改 PDO
属性
<?php use Mpyw\Unclosure\Value; use PDO; function switchingEmulationTo(bool $enabled, &$pdo, callable $callback, ...$args) { return Value::withEffect( $pdo, function (PDO $pdo) use ($enabled) { $original = $pdo->getAttribute(PDO::ATTR_EMULATE_PREPARES); $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, $enabled); return function (PDO $pdo) use ($original) { $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, $original); }; }, $callback, ...$args ); } $connector = function (string $dsn) { return new PDO($dsn); }; // Eager Evaluation $pdo = $connector('sqlite::memory:'); switchingEmulationTo(true, $pdo, function () use ($pdo) { // Run queries that require prepared statement emulation }); // Lazy Evaluation $pdo = $connector; switchingEmulationTo(true, $pdo, function () use (&$pdo) { $pdo = $pdo('sqlite::memory:'); // Run queries that require prepared statement emulation });
API
Value::withCallback()
static mixed|Closure withCallback(mixed|Closure $value, callable $callback, mixed ...$args)
调用 $callback($value, ...$args)
或将其调用封装到 Closure
中。
- 当你传递
$value
作为Closure
时- 返回封装后的
Closure
,它返回$callback($value(), ...$args)
。
- 返回封装后的
- 当你传递
$value
作为原始值时- 返回
$callback($value, ...$args)
。
- 返回
参数和返回值
(A) $value
$value(mixed ...$initialArgs): mixed
(B) $callback
$callback(mixed $value, ...$args): mixed
(C) 返回值
*(mixed ...$initialArgs): mixed
Value::withEffect()
Value::withEffectForEach()
public static withEffect(mixed|Closure &$value, callable $configurator, callable $callback, mixed ...$args): mixed public static withEffectForEach((mixed|Closure)[] &$values, callable $configurator, callable $callback, mixed ...$args): mixed
调用 $callback(...$args)
,监视 &$value
上的新赋值。 你可以在自己的 $callback
中有条件地解包 $value
。
- 当你传递
$value
作为Closure
时- 如果
$value
已经被解包,则通过$configurator
应用配置。 - 如果
$value
仍然是Closure
,则取消所有配置。
- 如果
- 当你传递
$value
作为原始值时- 通过
$configurator
的配置立即应用。
- 通过
参数和返回值
(A) &$value
*(): mixed
(B) $configurator
$configurator(mixed $value): ?callable
(C) $configurator
返回值
*(mixed $value): void
(D) $callback
$callback(...$args): mixed