php - 您可以从 vanilla PHP 中塞进多少类型推断?

标签 php type-inference

我想为 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/

相关文章:

c# - c#中的通用接口(interface)类型推断怪异

c++ - 由于模板实例化导致的意外类型

Scala:有问题的类型推断?

javascript - 如何在不使用网站服务器的情况下向客户展示原型(prototype)

PHP - 如何序列化数据库中带有特殊字符的数据?

php - 使用 URL 跟踪测验结果,不允许使用数据库!

php - SQL - 条件 WHERE

scala - 错误 : polymorphic expression with default arguments

c++ - 局部变量的引用崩溃

javascript - Date.js 格式化为 dd/mm/yyyy