作为一名Emacs用户,我唯一羡慕像PDT这样的“现代”编辑器是PDT理解类型,甚至是PHPDoc“类型提示”,例如
/**
* @param DateTime $date
* @param string $name
* @return DOMDocument
*/
目前我使用类型提示尽可能使PHP解释器在我得到参数类型错误时提醒我,但这只有在参数是对象时才有效。更重要的是,没有办法确保函数的返回值是特定类型。
这可能是一个长镜头,但有没有任何插件或其他方式使PHP解释器以与PDT相同的方式识别PHPDoc注释?理想情况下,如果我返回错误类型的值,或者如果我传递一个字符串,我已经将参数声明为int,那么我想得到致命的错误。
答案 0 :(得分:2)
您应该查看SplTypes扩展名(警告:它是实验性的)。这允许对“原语”进行类型提示(最后我听说它们在各种可想象的方式上都比原语更好)。
你不能以任何其他方式使解释器强制原语,尽管有一些令人难以想象的讨厌的解决方法,我将留给读者作为练习。
答案 1 :(得分:1)
没有。 PHP不支持显式类型声明或类型提示,type juggling的使用明确是PHP解释器的一部分。根据{{3}}类型提示,仅支持对象和数组类型提示。
也就是说,如果你有一个具有严格类型要求的函数,那么在函数开始时验证这些参数就变得至关重要。如果您非常依赖于PHP中类型的概念,您可以a)切换到键入的语言(heh),或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;
}
我的判决是:不值得。
您可以在此处阅读有关自动装箱的更多信息:documents 另外,请注意这个用于自动装箱的RFC:http://php.webtutor.pl/en/2011/04/13/strong-data-typing-in-php-part-ii-autoboxing-and-indestructable-objects-english-version/它已经存在了一段时间,所以我不会坚持它。
答案 2 :(得分:0)
如何为标量类型进行类型提示是一个很大的讨论:
但据我所知,开发人员解决方案是不使用标量类型提示
PHP manual说:
类型提示只能是对象和数组(自PHP 5.1以来)类型。不支持使用int和string的传统类型提示。