PHP静态分析:根据参数值定义对象模板返回的方法

PHP static analysis: define method return from object template based on parameter value

提问人:cautionbug 提问时间:10/28/2023 最后编辑:cautionbug 更新时间:11/12/2023 访问量:26

问:

这可能很难描述,这就是为什么我正在努力寻找匹配的答案。

<?php
declare(strict_types=1);

/**
 * @template T of object{'a': string, 'b': int, 'c': DateTime}
 */
class Foo {
    /**
     * @var object<T>
     */
    private object $foo;

    // Assume __construct populates the $foo property

    /**
     * @param key-of<T> doesn't seem to apply here - only applies
     *                  to catching keys that aren't in T
     *
     * @return ??? indicate $key is a property of T, so return is that property's type
     */
    public function get(string $key)
    {
        return $this->foo->{$key};
    }
}

function string_only(string $a): string { return $a; }
function integer_only(int $b): int { return $b; }

// How do I know what was returned?
$a = (new Foo)->get('a');
// $a should be treated as string by code analysis
string_only($a);  // OK
integer_only($a); // Inspection type warning

$b = (new Foo)->get('b');
// $b should be treated as int by code analysis
string_only($b);  // Inspection type warning
integer_only($b); // OK

$c = (new Foo)->get('c');
// Code completion should know I can do this
$c->format('Ymd');

各种尝试的 PhpStorm 检查结果:

// @return T<$key>
// @return T{$key}
string_only($a); // "Return value must be of type 'string', 'object' returned"

// @return T->$key
string_only($a); // "Return value must be of type 'string', 'T-' returned"

其他各种尝试不被识别为任何东西或与上述类似。

这可以使用任何当前的 PHP SA 工具完成吗?


我在注释中尝试了各种模式,但检查要么根本没有识别它们,要么指示函数返回对象而不是对象键的类型。@return

我希望静态分析工具能够理解 的值表示对象的属性。$keyT

PHP 泛型 静态分析 模板 专业化

评论


答: 暂无答案