How to declare the type for local variables using PHPDoc notation?
Asked Answered
R

3

38

I use Zend Studio to develop in PHP with CakePHP, and one of the problems with CakePHP is that the views all reference undeclared local variables.

So for example, in the controller you would

$this->set('job',new MyJobObject());

Then in the view you could

echo $job->getName();

My problem is that Zend Studio can't perform autocomplete on $job, because it's type is unknown. Now there are PHPDoc tags that allow you to declare the type so that IDE's can perform autocomplete. The @var tag for example can be used in a class to define a property's type.

class MyJobObject
{
    /**
     * @var MyStatusObject
     */
    public $status;
}

Is there a way to do something like this for local variables?

Roobbie answered 22/1, 2013 at 15:44 Comment(0)
R
48

You have to use the one-line form: /** @var $job MyJobObject */

Note that some editors prefer the syntax the other way around: /** @var MyJobObject $job */

Racketeer answered 22/1, 2013 at 15:49 Comment(2)
You can put this anywhere in an executable block and it will be effective until the end of the function (or any re-definition).Ecklund
NetBeans seems to recognize /* @var $varName varType */ syntax ( note there's just one * at the begining of comment)Axe
V
44

Both answers are wrong*, strictly speaking:

/** @var MyJobObject $job */

Is correct - the type is always the first argument, then you put a description or specify the variable itselfs.

Resources:

https://scrutinizer-ci.com/docs/tools/php/php-analyzer/guides/annotating_code https://docs.phpdoc.org/latest/references/phpdoc/types.html

Otherweise, every modern PHP IDE is able to recognize almost any kind of comment syntax:

// @var
/* @var */
/** @var */
/* @var
*/
# @var

The most common, most readable and most widely accepted form is

/** @var <type> [variable [comment]] */


/** 
 * @var <type> [variable [comment]] 
 */

PSR-5 (Proposed) https://github.com/php-fig/fig-standards/blob/master/proposed/phpdoc.md

PSR-19 (Draft) https://github.com/php-fig/fig-standards/blob/master/proposed/phpdoc-tags.md

*) In 2013 the syntax might have been different.

Vent answered 22/1, 2020 at 16:31 Comment(4)
This should be the accepted answer and also the only one supported by PHP CS fixer.Yurev
Agreed, immediately after entering in /** in PHPStorm above a variable it automatically goes to this syntax as wellMummery
@Yurev but isn't the syntax for a class variable and not a local one?Deracinate
@Deracinate it is supposed to work for all VARiables. Their documentation might assume we don't use local variables in OOP programing.Vent
P
2

You shoud do on top of your view / template file.

<?PHP
/* @var $job MyJobObject */
?>
Propertius answered 22/1, 2013 at 15:50 Comment(1)
This is no longer the correct syntax. You now need an additional astrik in the comments punctuation as shown here /** @var */Xeniaxeno

© 2022 - 2024 — McMap. All rights reserved.