PhpStorm 数组形状 数组中的嵌套数组

PhpStorm Array Shapes nested arrays in array

提问人:LordF 提问时间:11/5/2023 最后编辑:LazyOneLordF 更新时间:11/5/2023 访问量:64

问:

我想在属性的 PhpStorm 标签中将数组形状添加到数组中,但我似乎无法完成它。@var

数组包含验证规则,其中键是属性的名称(字符串),值是数组形式的验证规则,其中每个规则都是一个数组,其中第一个元素是规则(类的对象),第二个元素是规则失败时的消息(字符串)。Ruleable

例如,数组可能如下所示:

$this->rules = [
    'FIELD' => [
        [$ruleable1, 'Field is empty'],
        [$ruleable2, 'Field is incorrect'],
        [$ruleable3, 'Some other error'],
    ],
    'OTHER_FILED' => [
        [$ruleable4, 'Field is empty'],
        [$ruleable5, 'Field is incorrect'],
    ]
];

其中所有变量都是$ruleableXRuleable

我试过:

/**
 * Rules
 *
 * @var array<string, array<int, array{0: Ruleable, 1: string}>>
 */
protected array $rules = [];

但它不起作用。

在这种情况下:

public function validate()
{
    $a = $this->rules['FIELD'][0];
    $b = $a[0];

    foreach ($this->rules as $field => $rules) {
        foreach ($rules as $rule) {
            [$rule, $message] = $rule;

            if (!$this->checkRule($rule, $field)) {
                $this->addMessage($field, $message);
            }
        }
    }
}

$b应该被 IDE 解释为 and it is not (mixed), also ] 应该是:和,但两者都是混合的。Ruleable[$rule, $messageRuleablestring

有什么建议吗?可能吗?

我知道我可以使用,但我想知道是否有可能通过数组形状来做到这一点。/** @var Ruleable $rule */

PHP 数组 phpstorm

评论

0赞 Markus Zeller 11/5/2023
blog.jetbrains.com/phpstorm/2021/07/phpstorm-2021-2-release/......
0赞 LordF 11/5/2023
我已经去过那里了。更重要的是,我甚至在这里:blog.jetbrains.com/phpstorm/2022/02/phpstorm-2022-1-eap-3
0赞 TSCAmerica.com 11/5/2023
您可以使用内联 PHPDoc 来提示循环中的$rule和$message类型。这应该有助于 PhpStorm 了解循环中$ruleable和$message的类型。
0赞 LordF 11/5/2023
@user580950我知道,但这样一来,只有解决循环,当我在其他地方调用$this->规则时,我将需要再次放置它。
0赞 TSCAmerica.com 11/5/2023
您说得对,此解决方案仅帮助 IDE 理解循环范围内的类型。如果需要在代码中的其他位置引用 $this->规则,则 PhpStorm 可能无法仅根据属性的 PHPDoc 正确推断类型。不幸的是,这是 PHPDoc 和 IDE 中类型推断(如 PhpStorm)的限制。PHPDoc 提供了一种记录复杂结构类型(如数组)的方法,但它并不总是保证 IDE 在所有上下文中都能正确推断类型,尤其是在处理嵌套数组或复杂结构时。

答: 暂无答案