Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

When should I use NULL in PHPDoc type hints and docblocks?

I am confused about when to use the null as a type when describing variables with PHPDoc. Are type hints supposed to describe hopes and expectations for external callers to anticipate and comply with, or are they supposed to document all possible types of the variable even if the hope is it will be one very specific type in practice?

Example 1: default values. The following function only expects non-null values. But if no value is passed, it defaults to null and checks for that explicitly as a way to determine whether or not anything was passed, and returns a special value for that case. Hopefully no external caller will pass anything except an integer. Should null be used in the @param type as below, or should it only specify int since that's what we want passed if anything is passed?

/**
 * @param int|null $bar
 */
function foo($bar = null) {
  if(is_null($bar)) { 
    return 'ABC';
  }

  return doSomething($bar);
}

Example 2: instance properties. We only want $bar to contain integers. That said, if nothing is set for bar then the default PHP value for this instance property is null. Do I need to account for this every place that uses $bar, with a possible null type as below?

class Foo {
  /**
   * @var int|null
   */
  public $bar;

  /**
   * @param int|null $bar
   */
  public setBar( $bar) {
    $this->bar = $bar;
  }

  /**
   * @return int|null
   */
  public function getBar() {
    return $this->bar;
  }
}

Basically I find myself littering nearly every @param and @var declaration with |null because technically it could be that value. But in practice it shouldn't be. Should I expect nearly all of my types to contain the possibility of null or should that be assumed, and I should avoid specifying it unless I expect to set or receive a value of null explicitly?

like image 799
user1710673 Avatar asked Oct 01 '12 02:10

user1710673


2 Answers

In practice, I would lean towards having param tags only list what you want passed in. However, for return tags, you really do need to list every type that could possibly be returned. Here's why I differ on the two.

Since PHP is not strongly typed, even when you say "only pass in an int", your method does still need to make sure it is not passed something unexpected. Just because the method code tries to handle receiving other types, you don't want your docs to tell your users "sure, you can pass me a NULL, and I'll do something with it for you". You want your docs to say "give me an int, period".

When considering return values, your users really really really need to know every potential return type that could come back from your method, because they really need to cover their bases in their code to handle all the types that your method might return.

like image 189
ashnazg Avatar answered Oct 22 '22 10:10

ashnazg


Yes, by PHPDoc standards, you should include null everywhere (if it applies, of course)

See here: http://manual.phpdoc.org/HTMLSmartyConverter/HandS/phpDocumentor/tutorial_tags.param.pkg.html

The datatype should be a valid PHP type (int, string, bool, etc), a class name for the type of object, or simply "mixed". Further, you can list multiple datatypes for a single parameter by delimiting them with the pipe (e.g. "@param int|string $p1"). You may document parameters listed or any optional paramters that will be parsed by standard PHP functions func_num_args()/get_func_arg(). Recommended name format for parameters listed with func_get_arg() is: $paramname if there is only one parameter $paramname,... if the number of parameters is unlimited

like image 2
Kovo Avatar answered Oct 22 '22 12:10

Kovo