PHP : Demystify Type Hinting and Default Parameters

Type Hinting as described in PHP manual

PHP 5 introduces Type Hinting. Functions are now able to force parameters to be objects (by specifying the name of the class in the function prototype) or arrays (since PHP 5.1). However, if NULL is used as the default parameter value, it will be allowed as an argument for any later call.

The above Means that:

Parameters which are Objects or Arrays can only be type hinted.
i.e.
Types (Scalar variables) integer, float, string or boolean & Types(non scalar) resource cannot be used in type hinting.

i.e.
The code in Code1 & Code2 are not allowed.

Code1:
function myfunc ( string $name = "myname") {  ...  }
Code2:
function myfunc ( int $age = 23) {  ...  }

Although the above will not generate any compile time error, It does give out a fatal error during runtime as.

Fatal error: Default value for parameters with a class type hint can only be NULL

This is because PHP would be treating string and int as class names.
To quote a valid example, lets say we have a class called myclass.
Then the code in code3 is allowed and right:

Code3:
function myfunc ( myclass $myobj){ ... }

The argument passed to function in code 3 must be an instance of ‘myclass’.

The final sentence which is:

if NULL is used as the default parameter value, it will be allowed as an argument for any later call.

if default parameters are to be used use with type hinting, it can only have NULL as the default value.

Code4:
function myfunc ( myclass $myobj = NULL){ ... }

The argument passed to function in code 4 can be an instance of ‘myclass’ or NULL.

Code5:
function myfunc ( array $myarray = NULL){ ... }

The argument passed to function in code 4 can be an array or NULL.

You cannot instantiate an object in the parameter part of the function declaration!
&
The following function would be wrong!

Code6:
function myfunc ( array $myarray = array('a', 'b', 'c', 'd'){ ... }

A workaround:

Code7:
function myfunc ( array $myarray = NULL){ 
if ($myarray === NULL) $myarray = array('a', 'b', 'c', 'd');
}

*find any mistakes? do feel free to point it out.