您可能从香草PHP中填充多少类型推断?

我想为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'));

相关文章

统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
前言 之前做了微信登录,所以总结一下微信授权登录并获取用户...
FastAdmin是我第一个接触的后台管理系统框架。FastAdmin是一...
之前公司需要一个内部的通讯软件,就叫我做一个。通讯软件嘛...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...