首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PhpStorm检查中的“添加#[纯]属性”检查是什么?

PhpStorm检查中的“添加#[纯]属性”检查是什么?
EN

Stack Overflow用户
提问于 2021-10-06 17:34:59
回答 3查看 11.1K关注 0票数 18

我在一个Laravel项目中有一个非常简单的FormRequest类。两个方法,它们都返回一个由方法部分填充的简单数组,但IDE对它们的处理方式不同。

代码语言:javascript
复制
<?php

namespace App\Http\Requests;

class VerifyPhoneNumber extends FormRequest {
    use Support\ValidatesPhoneNumbers;

    public function authorize(): bool {
        return true;
    }

    public function rules(): array {
        return [
            "phone_number" => $this->getPhoneNumberRules(),
            "verify_code" => ["required", "numeric", "max:999999"],
        ];
    }

    public function messages(): array {
        return [
            "phone_number.regex" => $this->getPhoneNumberMessage(),
        ];
    }
}

最基本的特质方法是:

代码语言:javascript
复制
<?php

namespace App\Http\Requests\Support;

trait ValidatesPhoneNumbers {
    protected function getPhoneNumberMessage(): string {
        return __("Some localized error message");
    }

    protected function getPhoneNumberRules(): array {
        return ["regex:/^\+?1?[2-9][0-9]{5,14}$/", "max:16"];
    }
}

我感到困惑的是,IDE检查抱怨我应该将JetBrains\PhpStorm\Pure属性添加到rules()方法,而不是messages()方法。

类定义上的评论说:

属性标记对程序状态没有影响的函数或函数执行后使用的传递参数。这意味着,如果以后的代码中没有使用执行结果,则可以安全地删除解析为这样一个函数的函数调用。

这并没有给我任何线索,为什么它对待这两种方法的方式是不同的。如果我正确理解了第二句话,当“纯”方法的结果未使用时,IDE将将该方法的使用标记为未使用,并建议将其删除。

用于确定何时需要此属性的逻辑是什么?

EN

回答 3

Stack Overflow用户

发布于 2021-10-06 17:41:07

如果一个函数只依赖于其他纯函数,那么它也是纯函数。因为getPhoneNumberRules()只是返回一个固定的数组,所以它是纯的,所以rules()也是纯的。

但是messages()调用getPhoneNumberMessage(),后者调用__()函数,该函数可以在位置状态发生变化时返回不同的本地化消息,因此它不是纯的。

票数 6
EN

Stack Overflow用户

发布于 2021-10-06 17:47:16

对于不产生任何副作用的函数,请使用此属性。所有这些PHP内部函数都已在PhpStorm中标记。 #纯函数比较( Foo $a,Foo $b):int {返回$a->a <=> $b->b;}

来源:https://github.com/JetBrains/phpstorm-attributes#pure

由于这个函数只在它自己的内部做一些事情,所以它可以被称为#Pure函数,所以您可以通过PhpStorm知道这一点。

票数 1
EN

Stack Overflow用户

发布于 2022-10-05 21:30:13

暂时忘掉副作用吧。

纯函数是保证总是的函数,如果使用相同的参数调用,则给相同的结果

如果您的应用程序调用$verifyPhoneNumberRequest->rules(),它将得到一个特定的结果。然后,其他一些代码可以更改应用程序区域设置,下次以完全相同的方式调用$verifyPhoneNumberRequest->rules() (即不带参数)时,它可能返回一个不同的结果,因为__()trans()函数检查某些全局状态(区域设置)以决定返回哪个字符串。

纯函数只依赖于它们的直接输入参数,而不依赖于在其他地方可能修改或没有修改的外部状态。

纯函数的另一个判据是它们不修改的非局部状态。在getUsername()方法中删除整个数据库是完全可能的(或导致破坏性较小但调试修改不那么痛苦)。但是,如果将该方法标记为纯方法并批准为纯方法,则保证不会发生这种情况。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69470268

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档