Re: Using default argument values in the middle of the argument list

From: Date: Sat, 02 Jun 2012 18:30:23 +0000
Subject: Re: Using default argument values in the middle of the argument list
References: 1 2  Groups: php.general 
Request: Send a blank email to php-general+get-318111@lists.php.net to get a copy of this message
On Sat, 02 Jun 2012 17:13:55 +0200, Matijn Woudt <tijnema@gmail.com> wrote:
Hi Oliver, I think the example at [1] demonstrates that it is possible, but it also notes that it is pretty useless. Why are you interested in this? - Matijn [1] http://www.php.net/manual/en/functions.arguments.php#example-153
Hi, Thanx for your response. PHP class type hints are bit more restrictive than in say Java since it does not accept null as a value of a class. This provides great guarantees, however, sometimes it is desirable to allow null as well. This can be done using: function func ( Classname $a = null ) Unfortunately, according to documentation this will work only at the end of parameter list. So this restriction force you to put nullable arguments at the end of argument list or not use type hints at all. In the worst case scenario you have to choose between use of illogical order of arguments, reimplementation of type hinting for arguments that comes after the nullable one or use no type hinting at all for nullable arguments: function func ( Classname $last, Classname $first = null ) { ... } or function func ( Classname $first = null, Classname $last = null ) { if ( $last === null ) throw new InvalidArgumentException; ... } or function func ( $first, Classname $last ) { if ( !( $first instanceof Classname ) ) throw new InvalidArgumentException; ... } This is not ideal especially if the desired solution seems to work: function func ( Classname $first = null, Classname $last ) { ... } This function expects exactly two arguments. The second one is supposed to be an instance of Classname and the first one may be an instance of Classname or null. This might be useless for primitive values since any default value you can define can be provided from the outside as well. But, it is definitely not useless for objects since you can not pass null value as an argument that requires an object of some class. As far as i can tell this can emulate Java style object type handling when you needed it. I would be glad to rely on such a behavior. -- Oliver

« previous php.general (#318111) next »