2011-10-22 131 views
16

我对PHP相当陌生,并且刚开始使用NetBeans来开发我的PHP代码。为什么要在注释中声明PHP变量类型?

因为我在查询中输入了一个变量,所以弹出一个对话框并要求我完成注释以保存变量类型。我做了一些调查,发现这似乎是NetBeans的一个流行功能,但我找不到任何信息向我解释为什么是这种情况。

为什么有人想在一个评论中放置一个PHP变量的类型?它是用于开发还是实际上有利于代码本身?它是完整的还是可选的?

+0

你能举一个你的意思吗? –

+0

@AurelioDeRosa - 以下是描述该功能的页面的链接:http://blogs.oracle.com/netbeansphp/entry/defining_variable_type_in_a – stefmikhail

+0

哦......现在我明白你的意思了。那么,Jonathan Spooner的答案是正确的。 –

回答

28

添加在方法的注释中一个@var标签类型将允许的NetBeans给你看代码完成。这当然是可选的,但完全记录您的代码总是一个好主意。

编辑: NetBeans提示为您自动生成注释的提示是使用/**扩展。要做到这一点,只需将光标放在您想要文档的属性或方法上并键入/**,然后按ENTER键即可。这将扩展phpDoc样式注释并添加适当的标签。

编辑2: 您可以使用一个属性@var标签,你可以使用@param标签上的方法来实现与传递给方法的参数相同的效果。而使用属性

在财产使用@var标签会给你的代码提示任何地方它是可见:

在使用
/** 
* 
* @var My_Type 
*/ 
private $_myProperty; 

上的方法使用@param标签会给你的代码提示参数里面的方法:

/** 
* 
* @param My_Type $obj 
*/ 
public function myMethod($obj) { 

} 

另一种方式来实现,同时还提供类型安全的一点点相似的效果是使用PHP的type hinting机制:

public function myMethod(My_Type $obj) { 

} 

注意,该方法在方法签名中指定的类型。现在的NetBeans将提供可使用@param标签和PHP会产生E_RECOVERABLE_ERROR如果传递到方法的类型不是指定了同一类型的方法中相同的代码完成。如果您有兴趣了解更多关于上述错误的信息,请参阅PHP's documentation regarding errors以及如何处理它们。

+0

在我的情况下,我有一个名为'$ clause'的变量,并且我通过使用'gettype($ clause)'知道该类型是'string',但NetBeans中的自动补全没有'string'作为选项。它在NetBeans中名称不同吗?你能否给我举个例子来说明我的情况? – stefmikhail

+0

var标签只支持PHP lib中包含的用户定义类型或类的代码完成。请参阅编辑提示 –

+0

谢谢,但我仍然有问题为我的变量选择一个类型。有没有可以描述变量类型的文档? NetBeans中可用的所有选项对我而言都是陌生的,我不确定要选择哪个选项。正如我所说的,我使用'gettype'来查找'$ clause'的变量类型为'string'。然而,没有'string'类型作为选项。我使用错误的方法吗? – stefmikhail

1

由于PHP是一种松散/鸭子类型的语言,当你创建一个大型程序的类型提示可以帮助你或其他人明白是怎么回事,如果一个问题应该出现。例如,期待一个混合类型并发送一个整数。

+0

http://php.net/manual/en/language.oop5.typehinting.php –

9

我猜你在谈论这样的事情:

/** 
* @var SimpleXMLElement $xml 
*/ 
private $xml; 

这就是所谓的phpDoc comment。它允许您生成API文档(like this one for instance)。此外,大多数IDE(包括Eclipse和NetBeans)也支持该语法,并提供动态代码完成等。

2

尽管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 */ 
7

如果你想声明的情况下的变量的类型,其中变量不是类属性,而只是一个变量拥有一些返回的值,使用单星的意见,然后@var其次是你的变量名称,最后是变量的类型。例如:

/* @var $errorMessage NotificationMessage */ 
$errorMessage= $allMessages->rewind()->current(); 

会告知NetBeans或PhpStorm即$的errorMessage是NotificationMessage的一个实例,你应该得到的代码完成该变量。

+1

这也适用于PHPStorm。 – Buffalo