- Using External Files
- Creating and Calling Your Own Functions
- Variable Scope
- Handling HTML Forms with PHP Redux
- Sending Email
- HTTP Headers
- Making Sticky Forms
- Date and Time Functions
Creating and Calling Your Own Functions
As you've already seen, PHP has a lot of built-in functions for almost every need. More importantly, though, it has the capability for you to define and use your own functions for whatever specific purpose. The syntax for making your own function is
function function_name () { // Function code. }
The name of your function can be any combination of letters, numbers, and the underscore, but it must begin with either a letter or the underscore. In PHP, as I mentioned in the first chapter, function names are case-insensitive (unlike variable names) so you could call that function using function_name() or FUNCTION_NAME() or function_Name(), etc.
The code within the function can do nearly anything, from generating HTML to performing calculations. In this chapter, I'll demonstrate both.
To create your own function:
- Create a new PHP document in your text editor (Script 3.5).
<?php # Script 3.5 - dateform.php $page_title = 'Calendar Form'; include ('./header.inc');
This page will use the same HTML template as the previous one (index.php; refer to Script 3.4). - Begin defining a new function.
function make_calendar_pulldown() {
The function I'll write here will generate the form pull-down menus for months, days, and years as in calendar.php (refer to Script 2.14). The name I give the function clearly states its purpose. - Generate the pull-down menus.
$months = array (1 => 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'); echo '<select name="month">'; foreach ($months as $key => $value) { echo "<option value=\"$key\">$value</option>\n"; } echo '</select> <select name="day">'; for ($day = 1; $day <= 31; $day++) { echo "<option value=\"$day\">$day</option>\n"; } echo '</select> <select name="year">'; $year = 2003; while ($year <= 2010) { echo "<option value=\"$year\">$year</option>\n"; $year++; } echo '</select>';
This code is exactly as it was in the original script only it's now stored within a function. - Close the function definition.
} // End of the make_calendar_pulldown() function.
In complicated code, it's a useful tool to place a comment at the end of the function definition so you know where a definition begins and ends. - Create the form and call the function.
echo '<form action="dateform.php" method="post">'; make_calendar_pulldown(); echo '</form>';
This code will create the tags for the form and then call the make_calendar_pulldown() function, which will have the end result of creating the code for the three pull-down menus. - Complete the PHP script by including the HTML footer.
include ('./footer.inc'); ?>
- Save the file as dateform.php, upload to your Web server (in the same folder as header.inc, footer.inc, and index.php), and test in your Web browser (
Figure 3.6
).
Figure 3.6 The pull-down menus are generated by a function within an HTML template.
Creating a function that takes arguments
Just like PHP's built-in functions, those you write can take arguments (also called parameters). For example, the print() function takes what you want sent to the browser as an argument and strlen() takes a string whose character length will be determined.
A function can take any number of arguments that you choose, but the order in which you put them is critical. For your arguments, use variable names:
function function_name ($arg1, $arg2) { // Function code. }
To call the function, use
function_name ('value', 'more values'); function_name ('value', $var);
As with any function in PHP, failure to send the right number of arguments results in an error ( Figure 3.7 ). Also, the variable names you use for your arguments are irrelevant to the rest of the script (as you'll discover in the Variable Scope section of this chapter), so be certain to use valid, meaningful names.
Figure 3.7 Failure to send a function the proper number or type of arguments is a common error.
To demonstrate this, I'll rewrite the calculator example from Chapter 2, "Programming with PHP," as a function (refer to Scripts 2.6 and 2.8).
To write functions that take arguments:
- Create a new PHP document in your text editor (Script 3.6).
<?php # Script 3.6 - calculator.php $page_title = 'Calculator'; include ('./header.inc');
- Exit out of the PHP and create the HTML form.
?> <form action="handle_calculator.php" method="post"> <select name="quantity"> <option value="">Select a quantity:</option> <option value="2">2</option> <option value="3">3</option> <option value="4">4</option> <option value="5">5</option> <option value="6">6</option> </select> <div align="left"><input type="submit" name="submit" value="Total!" /></div> <input type="hidden" name="price" value="19.95" /> <input type="hidden" name="taxrate" value=".05" /> </form>
This simple HTML form allows the user to select a quantity upon which the order total will be calculated. - Complete the page using the HTML footer.
<?php include ('./footer.inc'); ?>
- Save the file as calculator.php.
- Create another new PHP script in your text editor (Script 3.7).
<?php # Script 3.7 - handle_calculator.php $page_title = 'Calculator'; include ('./header.inc');
- Define the calculate_total() function.
function calculate_total ($quantity, $price, $taxrate) { $total = ($quantity * $price) * ($taxrate + 1); $total = number_format ($total, 2); echo "<p>You are purchasing <b>$quantity</b> widget(s) at a cost of <b>\$$price</b> each. With tax, the total comes to <b>\$$total</b>.</p>\n"; }
This function performs the same calculations as the example in Chapter 2 and prints out the result. It takes three arguments: the quantity being ordered, the price, and the tax rate. - Create the page's main conditional.
if (is_numeric($_POST['quantity'])) { calculate_total ($_POST['quantity'], $_POST['price'], $_POST['taxrate']); } else { echo '<p><b>Please enter a valid quantity to purchase!</b></p>'; }
This conditional verifies if it received a valid quantity. If so, the calculate_total() function is called, which will determine and print the total. If not, an error message is sent to the Web browser. - Finish the PHP page.
include ('./footer.inc'); ?>
- Save the file as handle_calculator.php, upload to your Web server along with calculator.php (store them in the same directory as the other files from this chapter), and test in your Web browser (
Figures 3.8
,
3.9
, and
3.10
).
Figure 3.8 The HTML form in the Web template.
Figure 3.9 Calculations are made by the function that prints the result.
Figure 3.10 If no valid quantity was selected, an error message is printed.
Example 3.6. The calculator page is an extension of the one developed in Chapter 2, "Programming with PHP."
1 <?php # Script 3.6 - calculator.php 2 3 // Set the page title and include the HTML header. 4 $page_title = 'Calculator'; 5 include ('./header.inc'); 6 ?> 7 8 <form action="handle_calculator.php" method="post"> 9 10 <select name="quantity"> 11 <option value="">Select a quantity:</option> 12 <option value="1">1</option> 13 <option value="2">2</option> 14 <option value="3">3</option> 15 <option value="4">4</option> 16 <option value="5">5</option> 17 <option value="6">6</option> 18 </select> 19 20 <div align="left"><input type="submit" name="submit" value="Total!" /></div> 21 22 <input type="hidden" name="price" value="19.95" /> 23 <input type="hidden" name="taxrate" value=".05" /> 24 25 </form><!-- End of Form --> 26 27 <?php 28 include ('./footer.inc'); // Include the HTML footer. 29 ?>
Example 3.7. The handle_calculator.php script uses a function to perform its calculations.
1 <?php # Script 3.7 - handle_calculator.php 2 3 // Set the page title and include the HTML header. 4 $page_title = 'Calculator'; 5 include ('./header.inc'); 6 7 # ---------------------- 8 // This function calculates a total based upon quantity, price, and tax and then prints the results. 9 function calculate_total ($quantity, $price, $taxrate) { 10 11 $total = ($quantity * $price) * ($taxrate + 1); 12 $total = number_format ($total, 2); 13 echo "<p>You are purchasing <b>$quantity</b> widget(s) at a cost of <b>\$$price</b> each. With tax, the total comes to <b>\$$total</b>.</p>\n"; 14 15 } // End of calculate_total() function. 16 # ---------------------- 17 18 // Main conditional. 19 if (is_numeric($_POST['quantity'])) { // Is the quantity a number? 20 21 calculate_total ($_POST['quantity'], $_POST['price'], $_POST['taxrate']); 22 23 } else { // Quantity is not a number. 24 echo '<p><b>Please enter a valid quantity to purchase!</b></p>'; 25 } 26 27 include ('./footer.inc'); // Include the HTML footer. 28 ?>
Setting default argument values
Another variant on defining your own functions is to preset an argument's value.
function function_name ($arg1, $arg2 = 'Bob') { // Function code. }
The end result of setting a default argument value is that that particular argument becomes optional when calling the function. If a value is passed to it, the passed value is used; otherwise, the default value is used.
You can set default values for as many of the arguments as you want, as long as those arguments come last in the function definition. In other words, the required arguments should always be first.
With the example function defined above, any of these will work:
function_name ($var1, $var2); function_name ('Roberts'); function_name ('Doe', 'John');
However, function_name() will not work, and there's no way to pass $arg2 a value without passing one to $arg1 as well.
To set default argument values:
- Open handle_calculator.php (refer to Script 3.7) in your text editor.
- Change the function definition line (line 9) so that only the quantity is a required argument (Script 3.8).
function calculate_total ($quantity, $price = 19.95, $taxrate = .05) {
The $price and $taxrate variables—which were being sent as hidden inputs in the form—are now hard-coded in the function. - Change the initial call to calculate_total() so that only the quantity is set.
calculate_total ($_POST['quantity']);
Since the price and tax rate values coming from the form are the same as those set as the default in the function, there's no need to pass these values to the function. - Call the function again, using a different price and tax rate.
calculate_total ($_POST['quantity'], 29.99, .0875);
Even though default values are set, sending new ones will override them (this line is for contrast). - Save the file, upload to your server, and test in your Web browser (
Figure 3.11
).
Figure 3.11 The calculate_total() function is called twice, using different parameters.
Example 3.8. The calculate_total() function now assumes a set price and tax rate unless one is specified when the function is called.
1 <?php # Script 3.8 - handle_calculator.php 2 3 // Set the page title and include the HTML header. 4 $page_title = 'Calculator'; 5 include ('./header.inc'); 6 7 # ---------------------- 8 // This function calculates a total based upon quantity, price, and tax and then prints the results. 9 function calculate_total ($quantity, $price = 19.95, $taxrate = .05) { 10 11 $total = ($quantity * $price) * ($taxrate + 1); 12 $total = number_format ($total, 2); 13 echo "<p>You are purchasing <b>$quantity</b> widget(s) at a cost of <b>\$$price</b> each. With tax, the total comes to <b>\$$total</b>.</p>\n"; 14 15 } // End of calculate_total() function. 16 # ---------------------- 17 18 // Main conditional. 19 if (is_numeric($_POST['quantity'])) { // Is the quantity a number? 20 21 calculate_total ($_POST['quantity']); 22 calculate_total ($_POST['quantity'], 29.99, .0875); 23 24 } else { // Quantity is not a number. 25 echo '<p><b>Please enter a valid quantity to purchase!</b></p>'; 26 } 27 28 include ('./footer.inc'); // Include the HTML footer. 29 ?>
Returning values from a function
The final attribute of a usable function that I should mention is that of returning values. Some, but not all functions, do this. For example, print() will return either a 1 or a 0 indicating its success, whereas echo() will not. The strlen() function returns a number correlating to the number of characters in a string.
To have your function return a value, use the return statement.
function function_name ($arg1, $arg2 = 'Bob') { // Function code. return $somevalue; }
The function can return a value (say a string or a number) or a variable whose value has been created by the function. When calling this function, you should assign the returned value to a variable:
$var = function_name();
To have a function return a value:
- Open handle_calculator.php (refer to Script 3.8) in your text editor.
- Change the function definition to (Script 3.9)
function calculate_total ($quantity, $price = 19.95, $taxrate = .05) { $total = ($quantity * $price) * ($taxrate + 1); return number_format ($total, 2); }
This version of the function will return just the calculated total without any HTML or sending anything to the Web browser. - Change the function call lines to
$total = calculate_total ($_POST['quantity']); echo "<p>You are purchasing <b>{$_POST['quantity']}</b> widget(s) at a cost of <b>\${$_POST['price']}</b> each. With tax, the total comes to <b>\$$total</b>.</p>\n";
Now the $total variable is being returned by the calculate_total() function and therefore the echo() statement has been reverted to its earlier form (using the superglobals). - Save the file, upload to your server, and test in your Web browser (
Figure 3.12
).
Figure 3.12 The script's main purpose can be achieved many different ways without affecting the end result.
Example 3.9. The calculate_total() function now takes up to three arguments and returns the calculated result.
1 <?php # Script 3.9 - handle_calculator.php 2 3 // Set the page title and include the HTML header. 4 $page_title = 'Calculator'; 5 include ('./header.inc'); 6 7 # ---------------------- 8 // This function calculates a total based upon quantity, price, and tax and then returns the results. 9 function calculate_total ($quantity, $price = 19.95, $taxrate = .05) { 10 11 $total = ($quantity * $price) * ($taxrate + 1); 12 return number_format ($total, 2); 13 14 } // End of calculate_total() function. 15 # ---------------------- 16 17 // Main conditional. 18 if (is_numeric($_POST['quantity'])) { // Is the quantity a number? 19 20 $total = calculate_total ($_POST['quantity']); 21 echo "<p>You are purchasing <b>{$_POST['quantity']}</b> widget(s) at a cost of <b>\$$_POST['price']</b> each. With tax, the total comes to <b>\$$total</b>.</p>\n"; 22 23 } else { // Quantity is not a number. 24 echo '<p><b>Please enter a valid quantity to purchase!</b></p>'; 25 } 26 27 include ('./footer.inc'); // Include the HTML footer. 28 ?>