PHP解释器能感知PHPDoc类型提示吗?



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

  /**
   * @param DateTime $date
   * @param string $name
   * @return DOMDocument
   */

目前我使用类型提示,只要我可以让PHP解释器提醒我,如果我得到错误的参数类型,但这只工作,如果参数是一个对象。更重要的是,没有办法确保函数的返回值是特定类型的。

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

您应该查看SplTypes扩展(注意:它是实验性的)。这允许"原语"的类型提示(上次我听说它们在任何方面都比原语好)。

您不能以任何其他方式让解释器强制执行原语,尽管有一些令人难以想象的恼人的解决方法,我将把它们留给读者作为练习。

No。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!');

正如您所看到的,仅仅为了避免:

,这是一个相当大的困难(需要为每种类型创建一个包装器):
function requires_a_string($string_value='') {
 if (!is_string($string_value))
  return false;
 echo $string_value;
}

我的结论是:不值得。

您可以在这里阅读更多关于自动装箱: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它已经存在一段时间了,所以我不会等待它。

如何为标量类型提供类型提示是一场大讨论:

  • 强检查类型
  • 尝试切换它总是
  • 试着把它转换成int(123),而不是'123aaa'转换成int(123)

但是据我所知,现在开发人员解决方案根本不使用标量类型提示

PHP手册说:
类型提示只能是对象和数组类型(从PHP 5.1开始)。不支持使用int和string的传统类型提示

最新更新