Chapter 5
PHP for Server-Side Programming
Except where otherwise noted, the contents of this presentation are Copyright 2009 Marty Stepp and Jessica Miller.
5.1: Server-Side Basics
-
5.1: Server-Side Basics
-
5.2: PHP Basic Syntax
-
5.3: Embedded PHP
-
5.4: Advanced PHP Syntax
URLs and web servers
http://server/path/file
- usually when you type a URL in your browser:
- your computer looks up the server's IP address using DNS
- your browser connects to that IP address and requests the given file
- the web server software (e.g. Apache) grabs that file from the server's local file system, and sends back its contents to you
Server-Side web programming
- server-side pages are programs written using one of many web programming languages/frameworks
- the web server contains software that allows it to run those programs and send back their output as responses to web requests
- each language/framework has its pros and cons
- we use PHP for server-side programming in this textbook
What is PHP?
(5.1.2)
- PHP stands for "PHP Hypertext Preprocessor"
- a server-side scripting language
- used to make web pages dynamic:
- provide different content depending on context
- interface with other services: database, e-mail, etc
- authenticate users
- process form information
- PHP code can be embedded in XHTML code
Lifecycle of a PHP web request
(5.1.1)
- browser requests a
.html file (static content): server just sends that file
- browser requests a
.php file (dynamic content): server reads it, runs any script code inside it, then sends result across the network
- script produces output that becomes the response sent back
Why PHP?
There are many other options for server-side languages: Ruby on Rails, JSP, ASP.NET, etc. Why choose PHP?
- free and open source: anyone can run a PHP-enabled server free of charge
- compatible: supported by most popular web servers
- simple: lots of built-in functionality; familiar syntax
- available: installed on UW's servers (Dante, Webster) and most commercial web hosts
Hello, World!
The following contents could go into a file hello.php:
<?php
print "Hello, world!";
?>
Hello, world!
- a block or file of PHP code begins with
<?php and ends with ?>
- PHP statements, function declarations, etc. appear between these endpoints
Viewing PHP output
- you can't view your
.php page on your local hard drive; you'll either see nothing or see the PHP source code
- if you upload the file to a PHP-enabled web server, requesting the
.php file will run the program and send you back its output
5.2: PHP Basic Syntax
-
5.1: Server-Side Basics
-
5.2: PHP Basic Syntax
-
5.3: Embedded PHP
-
5.4: Advanced PHP Syntax
Console output: print
(5.2.2)
print "text";
print "Hello, World!\n";
print "Escape \"chars\" are the SAME as in Java!\n";
print "You can have
line breaks in a string.";
print 'A string can use "single-quotes". It\'s cool!';
Hello, World!
Escape "chars" are the SAME as in Java!
You can have
line breaks in a string.
A string can use "single-quotes". It's cool!
- some PHP programmers use the equivalent
echo instead of print
$name = expression;
$user_name = "PinkHeartLuvr78";
$age = 16;
$drinking_age = $age + 5;
$this_class_rocks = TRUE;
- names are case sensitive; separate multiple words with _
- names always begin with
$, on both declaration and usage
- always implicitly declared by assignment (type is not written)
- a loosely typed language (like JavaScript or Python)
-
+ - * / % . ++ --
= += -= *= /= %= .=
== != === !== > < >= <=
&& || !
== just checks value ("5.0" == 5 is TRUE)
=== also checks type ("5" === 5 is FALSE)
- many operators auto-convert types:
5 < "7" is TRUE
int and float types
$a = 7 / 2;
$b = (int) $a;
$c = round($a);
$d = "123";
$e = (int) $d;
int for integers and float for reals
- division between two
int values can produce a float
$a = 3;
$b = 4;
$c = sqrt(pow($a, 2) + pow($b, 2));
math constants
M_PI
|
M_E
|
M_LN2
|
- the syntax for method calls, parameters, returns is the same as Java
Comments
(5.2.7)
- like Java, but
# is also allowed
- a lot of PHP code uses
# comments instead of //
- we recommend
# and will use it in our examples
String type
(5.2.6)
$favorite_food = "Ethiopian";
print $favorite_food[2];
- zero-based indexing using bracket notation
- string concatenation operator is
. (period), not +
5 + "2 turtle doves" === 7
5 . "2 turtle doves" === "52 turtle doves"
- can be specified with
"" or ''
String functions
$name = "Kenneth Kuan";
$length = strlen($name);
$cmp = strcmp($name, "Jeff Prouty");
$index = strpos($name, "e");
$first = substr($name, 8, 4);
$name = strtoupper($name);
Interpreted strings
$age = 16;
print "You are " . $age . " years old.\n";
print "You are $age years old.\n";
for loop
(same as Java)
(5.2.9)
for (initialization; condition; update) {
statements;
}
for ($i = 0; $i < 10; $i++) {
print "$i squared is " . $i * $i . ".\n";
}
bool (Boolean) type
(5.2.8)
$feels_like_summer = FALSE;
$php_is_rad = TRUE;
$student_count = 217;
$nonzero = (bool) $student_count;
- the following values are considered to be
FALSE (all others are TRUE):
-
0 and 0.0 (but NOT 0.00 or 0.000)
-
"", "0", and NULL (includes unset variables)
- arrays with 0 elements
- can cast to boolean using
(bool)
FALSE prints as an empty string (no output); TRUE prints as a 1
TRUE and FALSE keywords are case insensitive
if (condition) {
statements;
} elseif (condition) {
statements;
} else {
statements;
}
- NOTE: although
elseif keyword is much more common, else if is also supported
while loop
(same as Java)
while (condition) {
statements;
}
do {
statements;
} while (condition);
NULL
$name = "Victoria";
$name = NULL;
if (isset($name)) {
print "This line isn't going to be reached.\n";
}
- a variable is
NULL if
- it has not been set to any value (undefined variables)
- it has been assigned the constant
NULL
- it has been deleted using the
unset function
- can test if a variable is
NULL using the isset function
NULL prints as an empty string (no output)
5.3: Embedded PHP
-
5.1: Server-Side Basics
-
5.2: PHP Basic Syntax
-
5.3: Embedded PHP
-
5.4: Advanced PHP Syntax
Embedding code in web pages
- most PHP programs actually produce HTML as their output
- dynamic pages; responses to HTML form submissions; etc.
- an embedded PHP program is a file that contains a mixture of HTML and PHP code
A bad way to produce HTML in PHP
<?php
print "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.1//EN\"\n";
print " \"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd\">\n";
print "<html xmlns=\"http://www.w3.org/1999/xhtml\">\n";
print " <head>\n";
print " <title>My web page</title>\n";
...
?>
- printing HTML code with
print statements is ugly and error-prone:
- must quote the HTML and escape special characters, e.g.
\"
- must insert manual
\n line breaks after each line
- don't
print HTML; it's bad style!
Syntax for embedded PHP
(5.3.1)
HTML content
<?php
PHP code
?>
HTML content
- any contents of a
.php file that are not between <?php and ?> are output as pure HTML
- can switch back and forth between HTML and PHP "modes"
Embedded PHP example
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><title>CSE 190 M: Embedded PHP</title></head>
<body>
<h1>Geneva's Counting Page</h1>
<p>Watch how high I can count:
<?php
for ($i = 1; $i <= 10; $i++) {
print "$i\n";
}
?>
</p>
</body>
</html>
- the above code would be saved into a file such as
count.php
- How many lines of numbers will appear? (View Source!)
Embedded PHP + print = bad
...
<h1>Geneva's Counting Page</h1>
<p>Watch how high I can count:
<?php
for ($i = 1; $i <= 10; $i++) {
print "$i\n";
}
?>
</p>
- best PHP style is to use as few
print/echo statements as possible in embedded PHP code
- but without
print, how do we insert dynamic content into the page?
PHP expression blocks
(5.3.2)
<?= expression ?>
<h2>The answer is <?= 6 * 7 ?></h2>
The answer is 42
- PHP expression block: a small piece of PHP that evaluates and embeds an expression's value into HTML
Expression block example
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><title>CSE 190 M: Embedded PHP</title></head>
<body>
<?php
for ($i = 99; $i >= 1; $i--) {
?>
<p><?= $i ?> bottles of beer on the wall, <br />
<?= $i ?> bottles of beer. <br />
Take one down, pass it around, <br />
<?= $i - 1 ?> bottles of beer on the wall.</p>
<?php
}
?>
</body>
</html>
- this code could go into a file named
beer.php
Common error: unclosed braces
...
<body>
<p>Watch how high I can count:
<?php
for ($i = 1; $i <= 10; $i++) {
?>
<?= $i ?>
</p>
</body>
</html>
- if you open a
{ brace, you must have a matching } brace later
</body> and </html> above are inside the for loop, which is never closed
- if you forget to close your braces, you'll see an error about 'unexpected
$end'
Common error fixed
...
<body>
<p>Watch how high I can count:
<?php
for ($i = 1; $i <= 10; $i++) {
?>
<?= $i ?>
<?php
}
?>
</p>
</body>
</html>
Common error: Missing = sign
...
<body>
<p>Watch how high I can count:
<?php
for ($i = 1; $i <= 10; $i++) {
?>
<? $i ?>
<?php
}
?>
</p>
</body>
</html>
- a block between
<? ... ?> is often interpreted the same as one between <?php ... ?>
- PHP evaluates the code, but
$i does not produce any output
Complex expression blocks
...
<body>
<?php
for ($i = 1; $i <= 3; $i++) {
?>
<h<?= $i ?>>This is a level <?= $i ?> heading.</h<?= $i ?>>
<?php
}
?>
</body>
This is a level 1 heading.
This is a level 2 heading.
This is a level 3 heading.
- expression blocks can even go inside HTML tags and attributes
5.4: Advanced PHP Syntax
-
5.1: Server-Side Basics
-
5.2: PHP Basic Syntax
-
5.3: Embedded PHP
-
5.4: Advanced PHP Syntax
Functions
(5.4.1)
function name(parameterName, ..., parameterName) {
statements;
}
function quadratic($a, $b, $c) {
return -$b + sqrt($b * $b - 4 * $a * $c) / (2 * $a);
}
- parameter types and return types are not written
Calling functions
name(parameterValue, ..., parameterValue);
$x = -2;
$a = 3;
$root = quadratic(1, $x, $a - 2);
- if the wrong number of parameters are passed, it's an error
Default parameter values
function name(parameterName, ..., parameterName) {
statements;
}
function print_separated($str, $separator = ", ") {
if (strlen($str) > 0) {
print $str[0];
for ($i = 1; $i < strlen($str); $i++) {
print $sep . $str[$i];
}
}
}
print_separated("hello");
print_separated("hello", "-");
- if no value is passed, the default will be used (defaults must come last)
Variable scope: global and local vars
$school = "UW";
...
function downgrade() {
global $school;
$suffix = "Tacoma";
$school = "$school $suffix";
print "$school\n";
}
- variables declared in a function are local to that function
- variables not declared in a function are global
- if a function wants to use a global variable, it must have a
global statement
Including files: include()
(5.4.2)
include("filename");
include("header.php");
- inserts the entire contents of the given file into the PHP script's output page
- encourages modularity
- useful for defining reused functions like form-checking
$name = array();
$name = array(value0, value1, ..., valueN);
$name[index]
$name[index] = value;
$name[] = value;
$a = array();
$a[0] = 23;
$a2 = array("some", "strings", "in", "an", "array");
$a2[] = "Ooh!";
- to append, use bracket notation without specifying an index
- element type is not specified; can mix types
Array functions
|
function name(s)
|
description
|
count
|
number of elements in the array
|
print_r
|
print array's contents
|
array_pop,
array_push,
array_shift,
array_unshift
|
using array as a stack/queue
|
in_array,
array_search,
array_reverse,
sort,
rsort,
shuffle
|
searching and reordering
|
array_fill,
array_merge,
array_intersect,
array_diff,
array_slice,
range
|
creating, filling, filtering
|
array_sum,
array_product,
array_unique,
array_filter,
array_reduce
|
processing elements
|
Array function example
$tas = array("MD", "BH", "KK", "HM", "JP");
for ($i = 0; $i < count($tas); $i++) {
$tas[$i] = strtolower($tas[$i]);
}
$morgan = array_shift($tas);
array_pop($tas);
array_push($tas, "ms");
array_reverse($tas);
sort($tas);
$best = array_slice($tas, 1, 2);
-
the array in PHP replaces many other collections in Java
-
list, stack, queue, set, map, ...
The foreach loop
(5.4.4)
foreach ($array as $variableName) {
...
}
$stooges = array("Larry", "Moe", "Curly", "Shemp");
for ($i = 0; $i < count($stooges); $i++) {
print "Moe slaps {$stooges[$i]}\n";
}
foreach ($stooges as $stooge) {
print "Moe slaps $stooge\n";
}
- a convenient way to loop over each element of an array without indexes
Splitting/joining strings
$array = explode(delimiter, string);
$string = implode(delimiter, array);
$s = "CSE 190 M";
$a = explode(" ", $s);
$s2 = implode("...", $a);
explode and implode convert between strings and arrays
- for more complex string splitting, we'll use regular expressions (later)
Unpacking an array: list
list($var1, ..., $varN) = array;
$line = "stepp:17:m:94";
list($username, $age, $gender, $iq) = explode(":", $line);
- the
list function accepts a comma-separated list of variable names as parameters
- assign an array (or the result of a function that returns an array) to store that array's contents into the variables
Non-consecutive arrays
$autobots = array("Optimus", "Bumblebee", "Grimlock");
$autobots[100] = "Hotrod";
- the indexes in an array do not need to be consecutive
- the above array has a
count of 4, with 97 blank elements between "Grimlock" and "Hotrod"
PHP file I/O functions
(5.4.5)
-
reading/writing entire files:
file_get_contents,
file_put_contents
-
asking for information:
file_exists,
filesize,
fileperms,
filemtime,
is_dir,
is_readable,
is_writable,
disk_free_space
-
manipulating files and directories:
copy,
rename,
unlink,
chmod,
chgrp,
chown,
mkdir,
rmdir
-
reading directories:
scandir,
glob
Reading/writing files
$text = file_get_contents("schedule.txt");
$lines = explode("\n", $text);
$lines = array_reverse($lines);
$text = implode("\n", $lines);
file_put_contents("schedule.txt", $text);
file_get_contents returns entire contents of a file as a string
- if the file doesn't exist, you'll get a warning
file_put_contents writes a string into a file, replacing any prior contents
Reading files example
function count_blank_lines($file_name) {
$text = file_get_contents($file_name);
$lines = explode("\n", $text);
$count = 0;
foreach ($lines as $line) {
if (strlen(trim($line)) == 0) {
$count++;
}
}
return $count;
}
...
print count_blank_lines("ch05-php.html");
Reading directories
$folder = "images";
$files = scandir($folder);
foreach ($files as $file) {
if ($file != "." && $file != "..") {
print "I found an image: $folder/$file\n";
}
}
scandir returns an array of all files in a given directory
- annoyingly, the current directory (
".") and parent directory ("..") are included in the array; you probably want to skip them