arnapou / ensure
库 - 一个简单的库,用于为SA工具生成更安全的PHP代码。
v2.6
2024-08-30 12:34 UTC
Requires
- php: ~8.3.0
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.52
- phpstan/extension-installer: ^1.3
- phpstan/phpstan: ^1.10
- phpstan/phpstan-deprecation-rules: ^1.1
- phpstan/phpstan-phpunit: ^1.3
- phpstan/phpstan-strict-rules: ^1.5
- phpunit/php-code-coverage: ^11.0
- phpunit/phpunit: ^11.0
README
这个库是一个简单的工具,用于创建更安全的PHP代码。
出于质量原因以及/或者为静态分析工具(如PHPStan 或 Psalm)进行类型检查,我们希望“确保”或“强制”类型检查。
安装
composer require arnapou/ensure
packagist 👉️ arnapou/ensure
确保
在下面的示例中,我们确保非约束的 int
或 string
被约束到类中。
use Arnapou\Ensure\Ensure;
use Arnapou\Ensure\Expected;
class MyObject
{
/** @var positive-int */
public int $id;
/** @var non-empty-string */
public string $name;
/**
* @throws Expected
*/
public function __construct(int $id, string $name)
{
$this->id = Ensure::positiveInt($id);
$this->name = Ensure::nonEmptyString($name);
}
}
强制
在下面的示例中,它可能来自遗留代码。我们在构造函数中有phpdoc类型提示。但从PHP的角度来看,它不够“硬”,改变 mixed
类型提示可能存在风险。
您可以使用 Enforce
在类内部保证类型提示,同时保持类型检查宽松。当值足够“安全”时,它将转换该值。
- 有效的/自动转换的
int
示例:"1234"
,"1.2e3"
,3.0
,true
- 无效的
int
示例:"foo"
,"1.234e2"
,3.14
,[]
use Arnapou\Ensure\Enforce;
use Arnapou\Ensure\Expected;
class MyObject
{
/** @var positive-int */
public int $id;
/** @var non-empty-string */
public string $name;
/**
* @param int $id
* @param string $name
*
* @throws Expected
*/
public function __construct(mixed $id, mixed $name)
{
$this->id = Enforce::positiveInt($id);
$this->name = Enforce::nonEmptyString($name);
}
}
消息自定义或翻译
您可以通过实现自己的 MessageFactoryInterface 来完成此操作,然后将其设置为 Expected
类的默认值。
class MyMessageFactory implements MessageFactoryInterface
{
public function createExpectedMessage(string $expected, int $code, mixed $value, string $propertyName, mixed ...$parameters): string
{
// Build the message here.
}
}
// Change the default message factory.
\Arnapou\Ensure\Expected::setMessageFactory(new MyMessageFactory());
ℹ️ 默认的 MessageFactory 实现是 final
,您不能扩展它,但是 如果需要,您可以将其与组合一起重用。
class MyMessageFactory implements MessageFactoryInterface
{
private \Arnapou\Ensure\MessageFactory\MessageFactory $internal;
public function __construct(){
$this->internal = new \Arnapou\Ensure\MessageFactory\MessageFactory();
}
public function createExpectedMessage(string $expected, int $code, mixed $value, string $propertyName, mixed ...$parameters): string
{
if (/* any logic you need */) {
// Your customization here
}
// Default on the default message factory
return $this->internal->createExpectedMessage($expected, $code, $value, $propertyName, ...$parameters);
}
}
// Change the default message factory.
\Arnapou\Ensure\Expected::setMessageFactory(new MyMessageFactory());
PHP版本
日期 | 引用 | 8.3 | 8.2 |
---|---|---|---|
25/11/2023 | 2.x,主版本 | × | |
17/05/2024 | 1.4.x | × | × |
23/08/2023 | 1.x | × |