可以让PHP解释器知道PHPDoc类型的提示吗?

And*_*son 6 php phpdoc

作为一个Emacs用户,我唯一羡慕像PDT这样的"现代"编辑器是PDT理解类型,甚至是PHPDoc"类型提示",例如

  /**
   * @param DateTime $date
   * @param string $name
   * @return DOMDocument
   */
Run Code Online (Sandbox Code Playgroud)

目前我使用类型提示尽可能使PHP解释器在我获取参数类型错误时提醒我,但这仅在参数是对象时才有效.更重要的是,没有办法确保函数的返回值是特定类型.

这可能是一个很长的镜头,但有没有任何插件或其他方式使PHP解释器以与PDT相同的方式识别PHPDoc注释?理想情况下,如果我返回错误类型的值,或者如果我传递一个我已将参数声明为int的字符串,我希望得到致命错误.

Chr*_*ker 1

不。PHP 不支持显式类型声明或类型提示,类型杂耍的使用是 PHP 解释器显式的一部分。根据有关类型提示的文档,仅支持对象和数组类型提示。

也就是说,如果您的函数具有严格的类型要求,则必须在函数开始时验证这些参数。如果您非常喜欢 PHP 中的类型概念,您可以 a) 切换到类型化语言(呵呵),或者 b) 使用自动装箱/对象包装模式。is_string这会带来显着的性能损失,但您可以创建包装类并使用类型提示,而不是使用类型的原始检查(即):

class StringWrapper {
  public $value = null;
  function __construct($val) {
    $this->value = $val;
  }

}

function requires_a_string(StringWrapper $string_value) {
 echo $string_value->value;
}

$string = new StringWrapper('Hello world!');
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,这是一座相当大的山,需要攀爬(为每种类型创建一个包装器),只是为了避免:

function requires_a_string($string_value='') {
 if (!is_string($string_value))
  return false;
 echo $string_value;
}
Run Code Online (Sandbox Code Playgroud)

我的结论是:不值得。

您可以在此处阅读有关自动装箱的更多信息:http://php.webtutor.pl/en/2011/04/13/strong-data-typing-in-php-part-ii-autoboxing-and-indestructable-objects-english -version/ 另外,请注意这个用于自动装箱的 RFC:https://wiki.php.net/rfc/autoboxing不过,它已经存在了一段时间,所以我不会坚持下去。