Declaring Variable Types in PHP?

PhpVariable Types

Php Problem Overview


I was trying to get my Netbeans to autocomplete with PHP, and I learned that this code is valid in PHP:

function blah(Bur $bur) {}

A couple of questions:

  1. Does this actually impose any limits on what type of variable I can pass to the blah method?
  2. If this is just to help the IDE, that's fine with me. How can I declare the type of a variable in PHP if I'm not in a function?

Php Solutions


Solution 1 - Php

This type-hinting only works for validating function arguments; you can't declare that a PHP variable must always be of a certain type. This means that in your example, $bur must be of type Bur when "blah" is called, but $bur could be reassigned to a non-Bur value inside the function.

Type-hinting only works for class or interface names; you can't declare that an argument must be an integer, for example.

One annoying aspect of PHP's type-hinting, which is different from Java's, is that NULL values aren't allowed. So if you want the option of passing NULL instead of an object, you must remove the type-hint and do something like this at the top of the function:

assert('$bur === NULL || $bur instanceof Bur');

EDIT: This last paragraph doesn't apply since PHP 5.1; you can now use NULL as a default value, even with a type hint.

EDIT: You can also install the SPL Type Handling extension, which gives you wrapper types for strings, ints, floats, booleans, and enums.

EDIT: You can also use "array" since PHP 5.1, and "callable" since PHP 5.4.

EDIT: You can also use "string", "int", "float" and "bool" since PHP 7.0.

Solution 2 - Php

  1. Specifying a data type for a function parameter will cause PHP to throw a catchable fatal error if you pass a value which is not of that type. Please note though, you can only specify types for classes, and not primitives such as strings or integers.
  2. Most IDE's can infer a data type from a PHPDoc style comment if one is provided. e.g.


/**




@var string
*/
public $variable = "Blah";
  • @var string */ public $variable = "Blah";

UPDATE 2021: As of PHP 7 (which is several years old at this point) primitive types can also be declared for function arguments. Nullability can also be indicated with a ? in front of the type from 7.1 onward. You can declare return types now too. So this is valid PHP these days:

public function hasFoo(?int $numFoos) :bool {

phpStorm (my current preferred IDE) is happy to use all of these types for code completion, so I don't need as many phpDoc comments for typing as I used to.

Solution 3 - Php

It's called type hinting, added with PHP 5. It isn't quite what you may be expecting if you are coming from a language like Java. It does cause an error to be thrown if you don't pass in the expected type. You can't type-hint primitives, though (no int $bur).

Solution 4 - Php

#2 : (...) How can I declare the type of a variable in PHP if I'm not in a function?

I recently heard about "settype()" and "gettype()" in PHP4 & 5
You can force the variable type anytime easily


From PHP.net :

bool settype ( mixed &$var , string $type )

Parameters

var : The variable being converted. type : Possibles values of type are:

  • "boolean" (or, since PHP 4.2.0, "bool")
  • "integer" (or, since PHP 4.2.0, "int")
  • "float" (only possible since PHP 4.2.0, for older versions use the deprecated variant "double")
  • "string"
  • "array"
  • "object"
  • "null" (since PHP 4.2.0)

[ :D First visit, first comment...]

Solution 5 - Php

>Does this actually impose any limits on what type of variable I can pass to the blah method?

This is called type hinting. According to the PHP documentation that I just linked to, yes, it does impose limits on the argument type: "Failing to satisfy the type hint results in a catchable fatal error."

>How can I declare the type of a variable in PHP if I'm not in a function?

Read type juggling. You can't explicitly define a variable's type in PHP, its type is decided by the context it is used in.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionDan RosenstarkView Question on Stackoverflow
Solution 1 - PhpJW.View Answer on Stackoverflow
Solution 2 - PhpJim OHalloranView Answer on Stackoverflow
Solution 3 - PhpJ CooperView Answer on Stackoverflow
Solution 4 - PhpShadView Answer on Stackoverflow
Solution 5 - PhpPaige RutenView Answer on Stackoverflow