我对PHP相当陌生,我刚刚开始使用NetBeans开发我的PHP代码。
出乎意料地,当我在查询中输入一个变量时,弹出一个对话框,要求我完成一个注释来保存变量类型。我做了一些调查,发现这似乎是NetBeans的一个流行特性,但我找不到任何信息向我解释为什么是这样。
为什么有人想把PHP变量的类型放在注释中?它是用于开发,还是实际上对代码本身有益?它是积分的还是可选的?
在方法注释内的@var
标记中添加类型将允许NetBeans向您显示代码完成。这当然是可选的,但是完整地记录你的代码总是一个好主意。
Edit: NetBeans自动生成注释的提示是使用/**
扩展。为此,只需将光标放在要记录的属性或方法上方,键入/**
,然后按ENTER
键。这将展开一个phpDoc样式的注释,并添加适当的标签。
编辑2:你可以在一个属性上使用@var
标签,你也可以在一个方法上使用@param
标签,通过传递给一个方法的参数来达到同样的效果。
在属性上使用@var
标签会给你代码提示,当你在任何可见的地方使用属性时:
/**
*
* @var My_Type
*/
private $_myProperty;
在方法上使用@param
标记将在方法内部使用参数时给您代码提示:
/**
*
* @param My_Type $obj
*/
public function myMethod($obj) {
}
另一种实现类似效果并提供少量类型安全的方法是使用PHP的类型提示机制:
public function myMethod(My_Type $obj) {
}
注意,该方法具有方法签名中指定的类型。NetBeans现在将在方法内部提供与使用@param
标记可用的相同的代码完成,如果传递给方法的类型与指定的类型不同,PHP将生成E_RECOVERABLE_ERROR
。如果您有兴趣了解更多有关上述错误的信息,请参阅PHP的有关错误和如何处理错误的文档。
我猜你是在说这样的话:
/**
* @var SimpleXMLElement $xml
*/
private $xml;
这就是所谓的phpDoc注释。它允许您生成API文档(例如这个)。此外,包括Eclipse和NetBeans在内的大多数ide也支持该语法,并提供动态代码完成等。
如果你想声明变量的类型,而变量不是一个类属性,而只是一个保存一些返回值的变量,使用单星注释,然后是@var,然后是变量名,最后是该变量的类型。例如:
/* @var $errorMessage NotificationMessage */
$errorMessage= $allMessages->rewind()->current();
将告诉NetBeans或PhpStorm $errorMessage是NotificationMessage的一个实例,你应该得到该变量的代码补全。
尽管netbeans使用它来自动完成,但它通常用于记录您的代码:
在这种情况下,你知道这个方法得到什么和返回什么但是在代码中,你不知道发生了什么
/**
* Returns some stuff
* @param string $someObj
* @return array
*/
public function someMethod($someObj) {
$factoredObj = getObject($someObj); //you are not sure what type it returns
$resultArray = $factoredObj->toArray();
return $resultArray;
}
您可以在代码
中使用/* @var $variable type */
注释它/**
* Returns some stuff
* @param string $someObj
* @return array
*/
public function someMethod($someObj) {
/* @var $factoredObj someType */
$factoredObj = getObject($someObj);
$resultArray = $factoredObj->toArray();
return $resultArray;
}
或
$factoredObj = getObject($someObj); /* @var $factoredObj someType */
因为PHP是一种松散/鸭子类型语言,所以当您创建一个大型程序时,如果出现问题,这些类型提示可以帮助您或其他人了解发生了什么。例如,期望一个混合类型并发送一个整数。