Home PHP Function Design
Function Structure
If you have a single function that is very long, break it apart into smaller sub-functions. The definition of "very long" is vague, but often a function longer than 20-30 lines is pushing it.
If you try to describe the function's purpose and find yourself using the word "and" a lot, that probably means the function does too many things and should be split into sub-functions.
Very rarely should you have all of your PHP code outside of a function in a PHP
file. It's important to define functions to delegate the significant behaviors of
your PHP program. There is no main
function in PHP, but it is good
practice to write your own "delegator" function to check for things like GET or POST
variables and to delegate behavior with functions as appropriate. For small (< 30
lines) PHP
programs it is usually appropriate to have only one function, but for longer you
should probably have at least two.
Boolean Zen
Don't ever test whether a boolean
value is ==
or
!=
to TRUE
or FALSE
.
if ($x == TRUE) { ... } else if ($x != TRUE) { ... }
if ($x) { ... } else { ... }
If you have an if/else
statement that returns a boolean value based on a test, just directly return the test's result instead.
if ($score1 == $score2) { return TRUE; } else { return FALSE; }
return $score1 == $score2;
If/Else Usage
If/Else Branching Patterns
When using if/else
statements, properly choose between various if
and else
patterns depending on whether the conditions relate to one another. Avoid redundant or unnecessary if
tests.
if ($grade >= 90) { print("You got an A!"); } if ($grade >= 80 && $grade < 90) { print("You got a B!"); } if ($grade >= 70 && $grade < 80) { print("You got a C!"); } ...
if ($grade >= 90) { print("You got an A!"); } else if ($grade >= 80) { print("You got a B!"); } else if ($grade >= 70) { print("You got a C!"); } ...
If/Else Factoring
Move common code out of if/else
statements so that it is not repeated
(ie., minimize redundancy in your code).
if ($x < $y) { foo(); $x++; print("hi"); } else { foo(); $y++; print("hi"); }
foo(); if ($x < $y) { $x++; } else { $y++; } print("hi");
Loop Usage
For Loops vs. While Loops
Use a for
loop when the number of repetitions is known (definite); use a
while
loop when the number of repetitions is unknown (indefinite).
// repeat exactly size/2 times for ($i = 0; i < $size / 2; $i++) { ... } // repeat until $x is <= 0 while ($x > 0) { ... // do something with $x }
Break and Continue
In general, you should avoid break
and continue
statements unless absolutely necessary.
In this class, you should never use these statements (it would be very unlikely you would write code for our assignments
in which using one of these would be proper style).
Error Handling
Using die()
and setting errors with header
When handling errors in PHP, you should set the appropriate error code and output the
error message using die($msg)
. die()
will cause your program
to automatically exit without executing further. If you have several error messages,
you may consider factoring them out with an handle_error
function.
header("HTTP/1.1 400 Invalid Request"); die("Invalid mode: {$mode}. Please pass modes of 'add' or 'remove'.");
Handling Exceptions with try/catch
You may use try/catch
statements to handle exceptions as long as you do so
without deviating from clean and logical program flow. You should also output the appropriate error messages when catching
errors.
function handle_error($msg, $ex) { header("Content-Type: text/plain"); # Set 400 code if 400-type error print("{$msg}\n"); die("Error details: {$ex} \n"); } ... try { # some success code } catch (PDOException $ex) { handle_error("Error adding product into database. Please try again later.", $ex); }