sj-i/php-cast

显式类型转换,具有隐式弱模式转换的行为

v1.0.0 2020-08-17 00:29 UTC

This package is auto-updated.

Last update: 2024-09-17 09:44:34 UTC


README

Minimum PHP version: 7.0.0 Packagist Github Actions Coverage Status Psalm coverage

关于

  • 您可以在弱模式下转换任何值,即使在严格模式下(strict_types=1)也可以。

安装

composer require sj-i/php-cast

支持的版本

  • PHP 7.0+

用法

use PhpCast\Cast;
use PhpCast\NullableCast;

// int(1)
$int_value = Cast::toInt('1');
// string(1) "1"
$string_value = Cast::toString(1);
// float(1)
$float_value = Cast::toFloat(1);
// bool(true)
$bool_value = Cast::toBool(1);

// TypeError
$int_value = Cast::toInt('a');
// TypeError
$int_value = Cast::toInt(null);


// int(1)
$int_value = NullableCast::toInt('1');
// string(1) "1"
$string_value = NullableCast::toString(1);
// float(1)
$float_value = NullableCast::toFloat(1);
// bool(true)
$bool_value = NullableCast::toBool(1);

// TypeError
$null_value = NullableCast::toInt('');
// null
$null_value = NullableCast::toInt(null);

工作原理

  • 弱模式文件中的返回类型声明完成这项工作。
  • PhpCast\Cast 定义在声明为 strict_types=0 的文件中
    • 虽然 strict_types=0 是 PHP 的当前默认值,但它被显式声明以断言意图。
  • 参数的类型检查在调用者模式中完成,但返回值的类型检查始终在被调用者模式中完成。

"为什么使用弱模式?我想在所有地方都使用严格模式!"

  • 要使用 strict_types=1 而不包含任何 strict_types=0 代码,必须对来自外部源(如 DB 或 HTTP 请求)的无类型数据进行显式转换。
  • 但在 PHP 中,像 (int)$foo 这样的显式转换除了一些异常外永远不会失败。
    • (int)'abc' 静默地结果为 0 而不会发出警告。
  • 因此,在使用转换之前进行一些验证是必要的。
  • 如果懒惰的程序员在没有适当验证的情况下使用显式转换,类型声明的作用就被完全破坏了。
    • 这可能是严格类型检查在引入 PHP 的标量类型提示讨论时没有得到热烈欢迎的原因之一。
  • 定义适当的验证和类型转换规则有时是过度行为。
    • 尽管定义它们总是“正确”的事情要做,但在人类生活中,有时你不需要如此正确。
  • 让我们以弱模式的方式转换无类型值,使用 PHP 世界中的“官方”验证和类型转换规则!
    • 不需要每天每夜在所有地方发明和学习新规则。
    • 如果“官方”规则不适合您的需求,则可以在此处定义并选择性地使用自己的规则。
  • 如果您曾阅读过 STH 的接受 RFC,您会注意到像这个库这样的弱模式已经被提及 在这里

    此建议不是折衷方案。它是一个允许严格类型在 PHP 中工作的尝试。一个将无类型 PHP 代码与严格类型 PHP 代码连接起来的机制(否则需要显式(类型)转换),一个“弱”的桥梁。此建议将严格和弱类型统一到一个紧密结合且行为一致的单一系统中。

许可证

MIT