![]() |
Function Parameters
ok let's assume I have a function with four parameters for instance:
:
function someFunction($var1, $var2, $var3, $var4){:
string substr ( string string, int start [, int length] )My question is the following: How do I specify a parameter as optional? Or will PHP simply accept the function with one parameter passed to it and it's up to me to code the situation accordingly? For instance: :
function someFunction($var1, $var2, $var3, $var4){ |
|
Thanks DaWei yeah I meant a variable length argument list. Here's the function that I wrote with it:[PHP]function fluctuate(){
$args = func_get_args(); switch(func_num_args()){ case 1: if(!is_string($args[0])) return !trigger_error("bool <strong>fluctuate</strong> ( string filename [, string mode [, string string [, int mode]]]) → <em>filename</em> is not a string", E_USER_ERROR); if(!file_exists($args[0])) return !trigger_error("bool <strong>fluctuate</strong> ( string filename [, string mode [, string string [, int mode]]]) → Nonexistent file cannot be deleted", E_USER_NOTICE); if(unlink($args[0])){ return true; }else{ return !trigger_error("bool <strong>fluctuate</strong> ( string filename [, string mode [, string string [, int mode]]]) → Unable to delete file", E_USER_WARNING); } case 4: if(!is_string($args[0])) return !trigger_error("bool <strong>fluctuate</strong> ( string filename [, string mode [, string string [, int mode]]]) → <em>filename</em> is not a string", E_USER_ERROR); if(!is_string($args[1]) || strlen($args[1]) !== 1) return !trigger_error("bool <strong>fluctuate</strong> ( string filename [, string mode [, string string [, int mode]]]) → <em>mode</em> is not a character", E_USER_ERROR); if(!is_int($args[3])) return !trigger_error("bool <strong>fluctuate</strong> ( string filename [, string mode [, string string [, int mode]]]) → <em>mode</em> is not an int", E_USER_ERROR); $args[1] = strtolower($args[1]); $ffd = null; switch($args[1]){ case 'a': if(!file_exists($args[0])) return !trigger_error("bool <strong>fluctuate</strong> ( string filename [, string mode [, string string [, int mode]]]) → Cannot append to nonexistent file", E_USER_WARNING); if(!is_writeable($args[0])) return !trigger_error("bool <strong>fluctuate</strong> ( string filename [, string mode [, string string [, int mode]]]) → File is not writeable", E_USER_WARNING); if(false === ($ffd = fopen($args[0], "a"))) return !trigger_error("bool <strong>fluctuate</strong> ( string filename [, string mode [, string string [, int mode]]]) → Unable to open file", E_USER_WARNING); break; case 'w': if(false === ($ffd = fopen($args[0], "w"))) return !trigger_error("bool <strong>fluctuate</strong> ( string filename [, string mode [, string string [, int mode]]]) → Unable to open file", E_USER_WARNING); if(!file_exists($args[0])) return !trigger_error("bool <strong>fluctuate</strong> ( string filename [, string mode [, string string [, int mode]]]) → Cannot write to nonexistent file", E_USER_WARNING); if(!is_writeable($args[0])) return !trigger_error("bool <strong>fluctuate</strong> ( string filename [, string mode [, string string [, int mode]]]) → File is not writeable", E_USER_WARNING); break; default: return !trigger_error("bool <strong>fluctuate</strong> ( string filename [, string mode [, string string [, int mode]]]) → Illegal mode specified", E_USER_ERROR); } if(stream_set_write_buffer($ffd, 0) !== 0) return !trigger_error("bool <strong>fluctuate</strong> ( string filename [, string mode [, string string [, int mode]]]) → Unable to buffer stream", E_USER_WARNING); if(fwrite($ffd, $args[2]) === false) return !trigger_error("bool <strong>fluctuate</strong> ( string filename [, string mode [, string string [, int mode]]]) → Unable to write to file", E_USER_WARNING); if(!fclose($ffd)) return !trigger_error("bool <strong>fluctuate</strong> ( string filename [, string mode [, string string [, int mode]]]) → Unable to close file", E_USER_WARNING); if(!chmod($args[0], $args[3])) return !trigger_error("bool <strong>fluctuate</strong> ( string filename [, string mode [, string string [, int mode]]]) → Unable to change file permissions", E_USER_WARNING); return true; default: return !trigger_error("bool <strong>fluctuate</strong> ( string filename [, string mode [, string string [, int mode]]]) → Incorrect number of arguments passed", E_USER_ERROR); } }[/PHP]Who knew file operations could produce so many errors *_* lol |
you could just set it to null in the function
so for instance function something($var1,$var2,$var3,$var4=NULL){ } so say you have to declare 1 2 and 3 and then 4 is set to null unless otherwise assigned |
That's a default. You can actually set it to any default value you like. He said he meant a variable length list, though, which isn't the same thing.
|
Quote:
|
I know it seems to. I expressed as much in post #2, and was told differently in post #3. If we're quoting,
Quote:
|
Quote:
|
PHP is pretty flexible. In defining a function you can declare as few or as many variables as you wish.
The following will all do the exact same thing: 1) function eat($subject, $object, $verb, $adjective){ if (! isset($verb)){$verb = "eats";} if (isset($adjective)){ return $subject." ".$verb." ".$adjective." ".$object."."; }else{ return $subject." ".$verb." ".$object."."; } eat("man", "chicken"); will return "man eats chicken" and the verb and the adjective weren't nescessarily. It'll work but you will get warning in your error log that it was "expecting" four parameters and only got two. on the other hand eat("man", "chicken", "savors", "juicy", "pickle", "my", "bottom"); will return "man savors juicy chicken" and leave no warning message what so ever. Giving too many arguments does nothing at all. 2) function eat($subject, $object, $verb="eats"){ $adjective = func_get_arg(3); if ($adjective){ return } eat("man", "chicken"); will return "man eats chicken." and gave no warnings. Why? function only expects three arguments but the $verb has a default setting to "eats" so that when it isn't supplied explicitly, "eats" is supplied by default. eat("man", "chicken", "savors", "juicy", "pickle", "my", "bottom"); will return "man savors juicy chicken." Why? The function was "expecting" three parameters ($subject, $object, and $verb) and got them. The line: $adjective = func_get_arg(3); means that if there is a fourth parameter (3 is the index of the 4th parameter), set $adjective to it. If there isn't a fourth parameter $adjective is set to FALSE. 3) function eat(){ $args = func_get_args(); $num = func_num_args(); if ($num < 2){ die ("Need to give two arguments at least"); } else { $subject = $args[0]; $object = $args[1]; } if ($nums == 2){ $verb = "eats"; }else{ $verb = $args[2]; } if ($nums >= 4){ $adjective = $args[3]; return $subject." ".$verb." ".$adjective." ".$object."."; }else{ return $subject." ".$verb." ".$object."."; } eat("man", "chicken"); returns "man eats chicken." Why? eat() doesn't "expect" any parameters. $args = func_get_args(); sets $args to the array ("man", "chicken"). $num = func_num_args(); set $num equal to 2. $num == 2 so $verb is set to "eats". $num is not >= 4 so "man eats chicken." is returned. eat("man", "chicken", "savors", "juicy", "pickle", "my", "bottom"); yeilds "man savors juicy chicken". Which is pretty clear as $args ==("man", "chicken", "savors", "juicy", "pickle", "my", "bottom") and $num == 7. --- As a rule of thumb define the parameters you need provided, set defaults for parameters you need but expect to be optional, and don't define the optional ones. example: function member($name, $id, $hobby){ if (! isset($id)) $id = set_id(); $hobbies = array_splice(func_get_args(),2); } Then member("woozy",,"php","cooking", "skiing","being obtuse", "calling in sick"); will set $hobbies equal to the array ("php", "cooking", "skiing", etc.) and you can send as many arguments as you darn well please. } |
Please read the forum's rules/faq. In the absence of code tags I can't tell if your code is really ugly, or just seems that way.
|
| All times are GMT -5. The time now is 2:58 PM. |
Powered by vBulletin® Version 3.7.0, Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
Copyright ©2007 DaniWeb® LLC