Groups of Logic: Passing Arguments to Functions in PHP

While some functions (such as page_header() in the previous section) always do the same thing, other functions operate on input that can change. The input values sup­plied to a function are called arguments. Arguments add to the power of functions because they make functions more flexible. You can modify page_header() to take an argument that holds the page color. The modified function declaration is shown in Example 5-4.

Example 5-4. Declaring a function with an argument

function page_header2($color) {

print ‘<html><head><title>Welcome to my site</title></head>’;

print ‘<body bgcolor=”#’ . $color . ‘”>’;

}

In the function declaration, you add $color between the parentheses after the func­tion name. This lets the code inside the function use a variable called $color, which holds the value passed to the function when it is called. For example, you can call the function like this:

page_header2(‘cc00cc’);

This sets $color to cc00cc inside page_header2(), so it prints:

<html><head><title>Welcome to my site</title></head><body bgcolor=”#cc00cc”>

When you define a function that takes an argument as in Example 5-4, you must pass an argument to the function when you call it. If you call the function without a value for the argument, the PHP engine complains with a warning. For example, if you call page_header2() like this:

page_header2();

the engine prints a message that looks like this:

PHP Warning: Missing argument 1 for page_header2()

To avoid this warning, define a function to take an optional argument by specifying a default in the function declaration. If a value is supplied when the function is called, then the function uses the supplied value. If a value is not supplied when the function is called, then the function uses the default value. To specify a default value, put it after the argument name. Example 5-5 sets the default value for $color to cc3399.

Example 5-5. Specifying a default value

function page_header3($color = ‘cc3399’) {

print ‘<html><head><title>Welcome to my site</title></head>’;

print ‘<body bgcolor=”#’ . $color . ‘”>’;

}

Calling page_header3(‘336699’) produces the same results as calling page_header2(‘336699’). When the body of each function executes, $color has the value 336699, which is the color printed for the bgcolor attribute of the <body> tag. But while page_header2() without an argument produces a warning, you can run page_header3() without an argument, with $color set to cc3399.

Default values for arguments must be literals, such as 12, cc3399, or Shredded Swiss Chard. They can’t be variables. The following is not OK and will cause the PHP engine to stop running your program:

$my_color = ‘#000000’;

// This is incorrect: the default value can’t be a variable

function page_header_bad($color = $my_color) {

print ‘<html><head><title>Welcome to my site</title></head>’;

print ‘<body bgcolor=”#’ . $color . ‘”>’;

}

To define a function that accepts multiple arguments, separate each argument with a comma in the function declaration. In Example 5-6, page_header4() takes two argu­ments: $color and $title.

Example 5-6. Defining a two-argument function

function page_header4($color, $title) {

print ‘<html><head><title>Welcome to ‘ . $title . ‘</title></head>’;

print ‘<body bgcolor=”#’ . $color . ‘”>’;

}

To pass a function multiple arguments when you call it, separate the argument values by commas in the function call. Example 5-7 calls page_header4() with values for $color and $title.

Example 5-7. Calling a two-argument function

page_header4(’66cc66′,’my homepage’);

Example 5-7 prints:

<html><head><title>Welcome to my homepage</title></head><body bgcolor=”#66cc66″>

In Example 5-6, both arguments are mandatory. You can use the same syntax in func­tions that take multiple arguments to denote default argument values as you do in functions that take one argument. However, all of the optional arguments must come after any mandatory arguments. Example 5-8 shows the correct ways to define a three-argument function that has one, two, or three optional arguments.

Example 5-8. Multiple optional arguments

// One optional argument: it must be last

function page_header5($color, $title, $header = ‘Welcome’) {

print ‘<html><head><title>Welcome to ‘ . $title . ‘</title></head>’;

print ‘<body bgcolor=”#’ . $color . ‘”>’;

print “<h1>$header</h1>”;

}

// Acceptable ways to call this function:

page_header5(’66cc99′,’my wonderful page’); // uses default $header

page_header5(’66cc99′,’my wonderful page’,’This page is great!’); // no defaults

// Two optional arguments: must be last two arguments

function page_header6($color, $title = ‘the page’, $header = ‘Welcome’) {

print ‘<html><head><title>Welcome to ‘ . $title . ‘</title></head>’;

print ‘<body bgcolor=”#’ . $color . ‘”>’;

print “<h1>$header</h1>”;

}

// Acceptable ways to call this function:

page_header6(’66cc99′); // uses default $title and $header

page_header6(’66cc99′,’my wonderful page’); // uses default $header

page_header6(’66cc99′,’my wonderful page’,’This page is great!’); // no defaults

// All optional arguments

function page_header7($color = ‘336699’, $title = ‘the page’, $header = ‘Welcome’) {

print ‘<html><head><title>Welcome to ‘ . $title . ‘</title></head>’;

print ‘<body bgcolor=”#’ . $color . ‘”>’;

print “<h1>$header</h1>”;

}

// Acceptable ways to call this function:

page_header7(); // uses all defaults

page_header7(’66cc99′); // uses default $title and $header

page_header7(’66cc99′,’my wonderful page’); // uses default $header

page_header7(’66cc99′,’my wonderful page’,’This page is great!’); // no defaults

All of the optional arguments must be at the end of the argument list to avoid ambi­guity. If page_header7() could be defined with a mandatory first argument of $color, an optional second argument of $title, and a mandatory third argument of $header, then what would page_header7(‘ 33cc66′,’ Good Morning’) mean? The ‘Good Morning’ argument could be a value for either $title or $header. Putting all optional arguments after any mandatory arguments avoids this confusion.

Any changes you make to a variable passed as an argument to a function don’t affect the variable outside the function. In Example 5-9, the value of $counter outside the function doesn’t change.

Example 5-9. Changing argument values

function countdown($top) {

while ($top > 0) {

print “$top..”;

$top–;

}

print “boom!\n”;

}

$counter = 5;

countdown($counter);

print “Now, counter is $counter”;

Example 5-9 prints:

5..4..3..2..1..boom!

Now, counter is 5

Passing $counter as the argument to countdown() tells the PHP engine to copy the value of $counter into $top at the start of the function, because $top is the name of the argument. Whatever happens to $top inside the function doesn’t affect $counter.

Once the value of $counter is copied into $top, $counter is out of the picture for the duration of the function.

Modifying arguments doesn’t affect variables outside the function even if the argu­ment has the same name as a variable outside the function. If countdown() in Example 5-9 is changed so that its argument is called $counter instead of $top, the value of $counter outside the function doesn’t change. The argument and the vari­able outside the function just happen to have the same name. They remain com­pletely unconnected.

Source: Sklar David (2016), Learning PHP: A Gentle Introduction to the Web’s Most Popular Language, O’Reilly Media; 1st edition.

Leave a Reply

Your email address will not be published. Required fields are marked *