imliam/php-modifiers

应用可选修饰符到PHP函数

v1.0.0 2019-04-20 00:01 UTC

This package is auto-updated.

Last update: 2024-09-20 12:29:32 UTC


README

Latest Version on Packagist Build Status Code Quality Code Coverage Total Downloads License

添加了在调用类方法时应用一系列可选修饰符(! @ ~ + -)的能力,以增强它们具有独特的语法。

例如,我们可能有一个类,其中以下每个都可以做不同的事情

Slack::say('Hello world'); // 'Hello world'
!Slack::say('Hello world'); // 'HELLO WORLD'
@Slack::say('Hello world'); // 'Someone said "Hello world"'
@!Slack::say('Hello world'); // 'Someone said "HELLO WORLD"'

💾 安装

您可以使用以下命令通过Composer安装此包

composer require imliam/php-modifiers:^1.0.0

📝 使用

此包的功能通过HasModifiers特质暴露,该特质可以应用于类

class Example
{
    use HasModifiers;
}

将特质应用于类后,还必须定义可以使用修饰符的类方法。这可以通过在类上设置静态$modifierAliases属性来完成。

此属性应是一个数组,包含可以使用的类和方法名对。

例如,如果我们想要当前类中的say方法能够使用修饰符

public static $modifierAliases = [
    [self::class, 'say'],
];

在此设置下,我们可以在方法内部调用static::hasModifier()方法来检查是否使用了某些修饰符

public static function say($string)
{
    if (static::hasModifier('!')) {
        echo strtoupper($string);
        return;
    }

    echo $string;
}

所有这些都准备好后,我们现在可以带有或不带有修饰符调用我们的方法以获得所需的行为

Example::say('Hello world'); // 'Hello world'
!Example::say('Hello world'); // 'HELLO WORLD'

全局函数

如果我们想注册一个可以接受修饰符的全局函数,我们可以使用它来调用我们的类方法,并将其作为别名添加到$modifierAliases属性中。

function say($string)
{
    return Example::say($string);
}

Example::$modifierAliases[] = 'say';

该函数现在将按之前的方式工作

say('Hello world'); // 'Hello world'
!say('Hello world'); // 'HELLO WORLD'

修饰符

有五种修饰符可供使用。非常重要的一点是,由于它们在PHP中也是常规运算符,每个修饰符都有其自己的怪癖,可能会改变方法的预期行为和返回值。

使用它们

因此,仅应将这些修饰符用于不期望返回任何有用内容的void函数。

! 叹号

不要与此修饰符一起使用返回值。

叹号是PHP中的逻辑运算符,它将值取反到其相反的布尔值。这意味着返回的任何真值都将变为假,返回的任何假值都将变为真。

+ 加号

不要与此修饰符一起使用返回值。

加号是PHP中的算术运算符。用作修饰符时,它将尝试将返回值转换为整数或浮点数。

- 减号

不要与此修饰符一起使用返回值。

加号是PHP中的负算术运算符。用作修饰符时,它将尝试将返回值转换为整数或浮点数。

~ 波浪号

不要与此修饰符一起使用返回值。

波浪号是PHP中的位运算符。然而,由于运算符本身执行位运算,使用此运算符的方法必须返回整数值,或者可以转换为整数的东西。

@ "at" 符号

您可以使用这个修饰符与返回值一起使用。

在PHP中,"at"符号是一个错误抑制运算符,它可以隐藏并忽略后续语句中发生的任何错误——这意味着可能会在您的函数中意外忽略的错误。

然而,这是唯一一个不会改变函数返回值的运算符。

public static function hasSomething()
{
    if (static::hasModifier('@')) {
        trigger_error("An error should occur here, but it gets ignored…");

        return 'A modified value…';
    }

    return 'A non-modified value…';
}

echo Example::hasSomething(); // 'A non-modified value…'
echo @Example::hasSomething(); // 'A modified value…'

工作原理

✨魔法✨

修饰符的功能是通过在方法被调用时获取堆栈跟踪,找到堆栈跟踪中别名方法被调用的位置来实现的。一旦找到这些别名,就会将文件作为字符串读取,并使用PHP源令牌进行解析,以找到它之前的运算符。

这最初是在Kint软件包中作为快速增强调试时变量显示方式的一种方法。因为它是为这种环境设计的,所以没有将性能作为一个主要考虑因素。跟踪堆栈和解析源代码通常是PHP中的慢操作,所以请谨慎使用,不要在大型生产应用中过度使用。

查看源代码以更深入地了解其工作原理。此软件包是Kint实现的一个简化版本,适合几个小的源文件。

✅ 测试

composer test

🔖 更新日志

请参阅变更日志文件以获取有关最近更改的更多信息。

⬆️ 升级

请参阅升级文件以获取有关从旧版本升级的详细信息。

🎉 贡献

请参阅贡献文件行为准则以获取有关如何为项目做出贡献的详细信息。

🔒 安全性

如果您发现任何与安全相关的问题,请通过电子邮件liam@liamhammett.com联系,而不是使用问题跟踪器。

👷 贡献者

♻️ 许可证

MIT许可证(MIT)。请参阅许可证文件以获取更多信息。