提问人:cautionbug 提问时间:10/28/2023 最后编辑:cautionbug 更新时间:11/12/2023 访问量:26
PHP静态分析:根据参数值定义对象模板返回的方法
PHP static analysis: define method return from object template based on parameter value
问:
这可能很难描述,这就是为什么我正在努力寻找匹配的答案。
<?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
我希望静态分析工具能够理解 的值表示对象的属性。$key
T
答: 暂无答案
评论