我在一个Laravel项目中有一个非常简单的FormRequest类。两个方法,它们都返回一个由方法部分填充的简单数组,但IDE对它们的处理方式不同。
<?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(),
];
}
}最基本的特质方法是:
<?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将将该方法的使用标记为未使用,并建议将其删除。
用于确定何时需要此属性的逻辑是什么?
发布于 2021-10-06 17:41:07
如果一个函数只依赖于其他纯函数,那么它也是纯函数。因为getPhoneNumberRules()只是返回一个固定的数组,所以它是纯的,所以rules()也是纯的。
但是messages()调用getPhoneNumberMessage(),后者调用__()函数,该函数可以在位置状态发生变化时返回不同的本地化消息,因此它不是纯的。
发布于 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知道这一点。
发布于 2022-10-05 21:30:13
暂时忘掉副作用吧。
纯函数是保证总是的函数,如果使用相同的参数调用,则给相同的结果。
如果您的应用程序调用$verifyPhoneNumberRequest->rules(),它将得到一个特定的结果。然后,其他一些代码可以更改应用程序区域设置,下次以完全相同的方式调用$verifyPhoneNumberRequest->rules() (即不带参数)时,它可能返回一个不同的结果,因为__()或trans()函数检查某些全局状态(区域设置)以决定返回哪个字符串。
纯函数只依赖于它们的直接输入参数,而不依赖于在其他地方可能修改或没有修改的外部状态。
纯函数的另一个判据是它们不修改的非局部状态。在getUsername()方法中删除整个数据库是完全可能的(或导致破坏性较小但调试修改不那么痛苦)。但是,如果将该方法标记为纯方法并批准为纯方法,则保证不会发生这种情况。
https://stackoverflow.com/questions/69470268
复制相似问题