PhpStorm的#[Pure]属性检查逻辑是什么?为何Laravel FormRequest的rules方法需添加该属性
PhpStorm 为FormRequest方法提示添加Pure属性的差异原因
两个方法判定结果的核心差异来自内部调用的函数的「纯函数属性」不同。
你给出的FormRequest类代码如下:
<?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(), ]; } }
对应Trait代码如下:
<?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"]; } }
PhpStorm判定是否需要推荐添加JetBrains\PhpStorm\Pure属性的核心逻辑,是判断方法是否符合纯函数的两个核心要求:
- 方法执行过程中不会产生任何副作用:不会修改类属性、全局变量、外部资源,也不会触发其他有副作用的逻辑
- 方法的返回值仅由入参决定(无入参时则返回固定值),不依赖任何可变的外部状态
对应到你的代码中:
rules()方法符合纯函数要求:
内部调用的getPhoneNumberRules()返回的是固定数组,没有任何外部依赖,本身就是纯函数;整个rules()方法的返回值固定,没有任何副作用,因此IDE会提示添加#[Pure]属性。messages()方法不符合纯函数要求:
内部调用的getPhoneNumberMessage()用到了Laravel的翻译函数__(),该函数的返回值依赖全局的locale语言配置,属于依赖可变外部状态的非纯函数;因此整个messages()方法的返回值会随环境变化,不符合纯函数要求,自然不会提示添加#[Pure]属性。
补充说明:你对
#[Pure]属性的理解是正确的,添加该属性后,如果IDE检测到该方法的返回值没有被使用,就会标记该调用为冗余代码,提示可以安全删除。
内容的提问来源于stack exchange,提问作者miken32
相关产品推荐
相关产品推荐

