Ask Professor Puzzler
Do you have a question you would like to ask Professor Puzzler? Click here to ask your question!
"Is it possible to do function overloading in PHP?" ~J
The answer to that question is no. And yes. Let's take a look first at what function overloading is. Let's suppose I want to write a function that creates a random password in PHP. My function might look something like this:
public function password() { $password=''; $length=rand(8,12); //length is random for ($i=0;$i<$length;$i++) { $password.=chr(65 + rand(0,26)); } return $password; }
But wait! What if I want to specify the length of the password. Then I'd want a function that looks like this:
public function password($length) { $password=''; for ($i=0;$i<$length;$i++) { $password.=chr(65 + rand(0,26)); } return $password; }
This function works just like the first one, except that I pass a length parameter to the function, instead of selecting the length randomly. In some languages, this is legal to do; I have two functions with the same name, and the call is performed based on whether or not I pass a parameter to it. Unfortunately, this is not currently a feature in PHP. But we can work around it like this:
public function password($length = 'random') { $password=''; if ($length==='random') { $length=rand(8,12); } for ($i=0;$i<$length;$i++) { $password.=chr(65 + rand(0,26)); } return $password; }
How is this function different? It provides a "default" value for the length. If I don't pass a parameter, it ends up being the text 'random.' If no parameter is passed, the function runs the code that selects a random length.
But maybe I want to specify a minimum and maximum password length as parameters. Then I can do this:
public function password($length = 'random',$maxLength=0) { $password=''; if ($length==='random') { $length=rand(8,12); } else { if ($maxLength!==0) { $length=rand($length,$maxLength); } } for ($i=0;$i<$length;$i++) { $password.=chr(65 + rand(0,26)); } return $password; }
Now, if $maxLength isn't zero, the function knows that I intended to specify a range for the lengths.
If that still isn't good enough, maybe I want to be able to pass the range as an array [minLength,maxLength]. Then I'd change the function to look like this:
public function password($length = 'random',$maxLength=0) { $password=''; if ($length==='random') { $length=rand(8,12); } else { if (is_array($length)) { $length=rand($length[0],$length[1]); } else { if ($maxLength!==0) { $length=rand($length,$maxLength); } } } for ($i=0;$i<$length;$i++) { $password.=chr(65 + rand(0,26)); } return $password; }
We use the fact that PHP can tell us whether the parameter is an array to help us fork the function into a different direction. The function gets more cumbersome each time we add a variation, and at some point it becomes unwieldy, and you're better off just writing different functions. But in this case, we've set up the following overloaded function:
password() creates a random length password
password(n) creates a password of length n
password(n,k) or password([n,k]) creates a password of length somewhere between n and k.
Please note that in this example I didn't do any error checking (for example, making sure that if $length isn't the text "random" it is an actual positive integer, or verifying that in the (n,k) and ([n,k]) variations, that both n and k are positive integers with n < k. All these things should be checked.