我想为 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
}
如果没有 OCaml 中的 和
用于相互递归,则必须按使用顺序定义事物。解决它的方法是制作一个两阶段类型检查器,其中第一阶段检查接口(interface),但类型推断需要通过函数体。
解决这个问题的一种方法是强制执行 phpdoc 文档 block :
function a() {
b(10); // Type error: b() expects a string
}
/**
* @param string $c
*/
function b($c) {
print($c . " hallo");
}
在类型检查中强制使用文档 block 感觉……是错误的。有没有办法解决?当然,使用 declare(strict_types=1)
的标量类型提示 v5 将允许在函数签名中使用标量类型提示,但这离 future 太远了。
编辑:我很笨,b()
当然可以从它在a()
中的用法推断出来,所以我们会有:
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'));
关于php - 您可以从 vanilla PHP 中塞进多少类型推断?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31327472/