我想为PHP的子集制作一个类型推断的linter,但是不确定在不强制执行PHPdoc注释或类似注释的情况下可以从中获取多少类型信息.考虑以下示例:
function a() {
b(10); // This is wrong, but we don't kNow the type of b()
}
function b($c) {
print($c . " hallo"); // Only allow concatenations with strings
}
如果不存在in OCaml,并且无法相互递归,则必须按使用顺序定义事物.解决该问题的方法是创建一个两阶段的类型检查器,其中第一阶段检查接口,但是类型推断需要遍历函数的主体.
解决此问题的一种方法是强制使用PHPdoc docblock:
function a() {
b(10); // Type error: b() expects a string
}
/**
* @param string $c
*/
function b($c) {
print($c . " hallo");
}
强制在类型检查中使用docblock是错误的.有没有办法解决?当然,使用clarify(strict_types = 1)的标量类型提示v5将允许在函数签名中进行标量类型提示,但这距离将来太远了.
编辑:我很愚蠢,当然可以从a()的使用中推断出b(),所以我们将有:
function a() {
b(10); // b() inferred to int -> void
}
function b($c) {
print($c . " hallo"); // Wrong, $c used as a string
}
解决方法:
您可以创建代表您要键入提示的标量值的类.
class String {
protected $string;
public function __construct($value) {
if (!is_string($value)) {
throw new Exception('Not a string');
}
$this->string = $value;
}
public function __toString() {
return $this->string;
}
}
然后在您的函数声明中:
function b(String $c) {
...
}
b(new String('Some String'));
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。