PHP  
downloads | documentation | faq | getting help | mailing lists | reporting bugs | php.net sites | links | my php.net 
search for in the  
<include_onceFunction arguments>
view the version of this page
Last updated: Thu, 21 Aug 2003

Chapter 12. Functions

User-defined functions

A function may be defined using syntax such as the following:

Example 12-1. Psuedo code to demonstrate function uses

<?php
function foo ($arg_1, $arg_2, ..., $arg_n)
{
    echo "Example function.\n";
    return $retval;
}
?>

Any valid PHP code may appear inside a function, even other functions and class definitions.

In PHP 3, functions must be defined before they are referenced. No such requirement exists in PHP 4. Except when a function is conditionally defined such as shown in the two examples below.

When a function is defined in a conditional manner such as the two examples shown. Its definition must be processed prior to being called.

Example 12-2. Conditional functions

<?php

$makefoo = true;

/* We can't call foo() from here 
   since it doesn't exist yet,
   but we can call bar() */

bar();

if ($makefoo) {
  function foo ()
  {
    echo "I don't exist until program execution reaches me.\n";
  }
}

/* Now we can safely call foo()
   since $makefoo evaluated to true */

if ($makefoo) foo();

function bar() 
{
  echo "I exist immediately upon program start.\n";
}

?>

Example 12-3. Functions within functions

<?php
function foo() 
{
  function bar() 
  {
    echo "I don't exist until foo() is called.\n";
  }
}

/* We can't call bar() yet
   since it doesn't exist. */

foo();

/* Now we can call bar(),
   foo()'s processesing has
   made it accessable. */

bar();

?>

PHP does not support function overloading, nor is it possible to undefine or redefine previously-declared functions.

Note: Function names are case-insensitive, though it is usually good form to call functions as they appear in their declaration.

PHP 3 does not support variable numbers of arguments to functions, although default arguments are supported (see Default argument values for more information). PHP 4 supports both: see Variable-length argument lists and the function references for func_num_args(), func_get_arg(), and func_get_args() for more information.



add a note add a note User Contributed Notes
Functions
removeloop at removesuperinfinite dot com
04-Aug-2003 03:56
Method overloading is however permitted.

<?php
class {
        function 
A() { }

        function 
ech() {
               
$a func_get_args();
                for( 
$t=0;$t<count($a); $t++ ) {
                        echo 
$a[$t];
                }
        }
}       

$test = new A();
$test->ech(0,1,2,3,4,5,6,7,8,9);

?>

// output:
// 0123456789
danvk at rice dot edu
10-Jun-2003 01:04
While PHP does allow you to define a function within another function, this feature doesn't work in at all the same way that it does in most other languages. The most common use of an inner subroutine that I've seen is to define a helper function which can't be seen from outside, and still has access to the outer subroutine's local variables. Like this:

function a(){
  function b(){
    print $localVariable;
  }
  $localVariable = 10;
  b();
}

In PHP, this will cause all sorts of problems. Calling a() won't print anything, since $localVariable hasn't been defined within b(), even though it is defined within a(). And calling a() twice will result in an error that you're trying to redefine b().
kop at meme dot com
08-Jun-2003 05:08
You can preface a (builtin php ?) function call with an @ sign, as in:

@foo();

This will supress the injection of error messages into the data stream output to the web client.  You might do this, for example, to supress the display of error messages were foo() a database function and the database server was down.  However, you're probably better off using php configuration directives or error handling functions than using this feature.

See the section on error handling functions.
Storm
10-May-2003 09:55
I think it worthy of noting (for noobies such as myself):
You can define access to a global variable before it is defined when defining a function as long as the variable is defined before the function is called. This had me baffled for a few hours til I tried it out...lol. Here's a quick example:

Perfectly valid:
-------------------------
function hello() {
   global $hi;

   echo $hi;
}

$hi = 'Hi There!'; // Var defined after function is defined

hello();
-------------------------

I know most of the Gurus persay already knew this, but I didn't! :p This helps ;-)
php at simoneast dot net
11-Apr-2003 11:59
If you're frustrated by not having access to global variables from within your functions, instead of declaring each one (particularly if you don't know them all) there are a couple of workarounds...

If your function just needs to read global variables...

function aCoolFunction () {
    extract($GLOBALS);
....

This creates a copy of all the global variables in the function scope.  Notice that because it's a copy of the variables, changing them won't affect the variables outside the function and the copies are lost at the conclusion of the function.

If you need to write to your global variables, I haven't tested it, but you could probably loop through the $GLOBALS array and make a "global" declaration for each one.  Then you could modify the variables.

Please note that this shouldn't be standard practice, but only in the case where a function needs access to all the global variables when they may be different from one call to another.  Use the "global var1, var2..." declaration where possible.

Hope that helps some people.

Simon.
gayard at ig dot com dot br
05-Apr-2003 05:58
In PHP 4.3.0, I have found a bug in declaring functions within functions:

<?

function MyZero($x) {
  function 
GreaterThanZero() { echo "Greater"; }
  function 
LessThanZero()    { echo "LessThan"; }
  function 
EqualToZero()     { echo "Equal"; }
 
  if (
$x 0GreaterThanZero();
  else if (
$x 0LessThanZero();
  else 
EqualToZero();
}

 
MyZero(1);
 
MyZero(0);
 
MyZero(-1);

?>

The output is:
Greater
Fatal error: Cannot redeclare greaterthanzero() (previously declared in /home/php/public_html/teste.php:4) in /home/php/public_html/teste.php on line 4

My advice is: declare functions like you did in C, that is one function at a time. This seems to work fine.
nutbar at innocent dot com
13-Mar-2003 04:06
Regarding the comments about having to declare global variables inside of functions before you can use them...

Lots of you seem to complain about having to declare lots of variables, when really there's one simple solution to this:

global $GLOBALS;

This will define the $GLOBALS variable inside your code, and since that variable is basically like the mother of all variables - *presto*, you now have access to any variable in PHP.
mittag /// add /// marcmittag /// de
23-Jan-2003 08:31
To devciti at yahoo dot com

The section "returning values" of the docu says:

=====
You can't return multiple values from a function, but similar results can be obtained by returning a list.

function small_numbers()
{
    return array (0, 1, 2);
}
list ($zero, $one, $two) = small_numbers();
=====
misc dot anders at feder dot dk
24-Dec-2002 07:28
PHP allows you to address functions in a very dynamic way:

$foo = "bar";
$foo("fubar");

The above will call the bar function with the "fubar" argument.
bitparanoid at yahoo dot com
16-Dec-2002 02:38
Example 13.1 has an extra curly brace which will throw back an error:

function bar() {
{
   echo "I exist immediately....
}

should be:

function bar() {
  echo "I exist immediately...
}
allen at brooker dot gb dot net
22-Nov-2002 12:23
Does anyone have a list of all the characters allowed in function names?

So far I've only used a-z 0-9 _ and -
I assume (), {}, [], ', ", $, % and & are not allowed.

What other characters are legal and what aren't?
albaity at php4web dot com
26-Oct-2002 09:06
To use class from function
you need first to load class OUT the function
and then you can use the class functions from your function
example :
class Cart
{
    var $items;  // Items in our shopping cart
   
    // Add $num articles of $artnr to the cart
 
    function add_item ($artnr, $num)
    {
        $this->items[$artnr] += $num;
    }
   
    // Take $num articles of $artnr out of the cart
 
    function remove_item ($artnr, $num)
    {
        if ($this->items[$artnr] > $num) {
            $this->items[$artnr] -= $num;
            return true;
        } else {
            return false;
        }   
    }
}

------------------------
<?php
$cart 
= new Cart;

function 
additem($var1,$var2){
$cart->add_item($var1$var2);
}
additem(1,10);
?>
07-Sep-2002 03:41
If you need to use "real" global variables, accessible from any function, without the need to declare them explicity, take a look at (join these 2 lines please):
http://www.phpbuilder.com/board/showthread.php?
s=1ac53d13a815427f145d5dedf6a10023&threadid=10209242
matt at smidwap dot com
14-Aug-2002 07:26
[Editor's note: that is the reason why 'function' and others are "reserved words", see: http://www.php.net/manual/en/reserved.php for more details]

Creating a function with the name 'function' won't turn up errors, but when calling that function, nothing will be returned.  Example:

<?php
function();
function function () {
print 
"Hello, world!";
}
// "Hello, world!" will not be printed.
?>

I assume this is because when calling 'function', php thinks you are trying to create a new function.
germanAlonso at keltoi-web dot com
10-Aug-2002 09:17
Although yasuo_ohgaki@hotmail.com has already pointed the recursion support on PHP, here's another example, wich shows clearly the mechanism of recursive algorithms:

function fact($i){
  if($i==1){
    return 1;
  }else{
    return $i*fact($i-1);
  }
}

It returns $i! (supposing $i is a valid positive integer greater than 0).
bishop
01-May-2002 09:54
Consider:

function a() {
    function b() {
        echo 'I am b';
    }
    echo 'I am a';
}

a();
a();

As you might NOT expect, the second call to a() fails with a "Cannot redeclare b()" error.  This behaviour is correct, insofar as PHP doesn't "allow functions to be redefined."

A work around:
function a() {
    if ( ! function_exists('b') ) {
        function b() {
            echo 'I am b';
        }
    }
    echo 'I am a';
}
bishop
01-May-2002 09:49
The documentation statement:

"In PHP 3, functions must be defined before they are referenced. No such requirement exists in PHP 4."

is not entirely accurate (or at least misleading).

Consider:
function a() {
    function b() {
        echo 'I am b';
    }
    echo 'I am a';
}

You MUST call a() before you can even think about using b().  Why? The parser hasn't touched the scope inside function a (for efficiency reasons), so b has yet to be defined or even *declared*.

The documentation (I believe) refers to this behaviour:
a();

function a() {
  echo 'I am a';
}

which is perfectly valid and runs as you probably expect.  However, the following does not work as expected (or documented):

function a() {
    b();

    function b() {
        echo 'I am b';
    }
    echo 'I am a';
}

a();

Rather than getting "I am b" followed by "I am a" you get a parse error ("Call to undefined function b()").

So, the bottom line: Gewaehrleistungsausschluss
fabio at city dot ac dot uk
14-Feb-2002 10:57
As a corollary to other people's contributions in this section, you have to be careful when transforming a piece of code in to a function (say F1). If this piece of code contains calls to another function (say F2), then each variable used in F2 and defined in F1 must be declared as GLOBAL both in F1 and F2. This is tricky.
xpaz at somm dot com
15-Nov-2001 04:47
It is possible to define a function from inside another function.
The result is that the inner function does not exist until the outer function gets executed.

For example, the following code:

function a () {
  function b() {
    echo "I am b.\n";
  }
  echo "I am a.\n";
}
if (function_exists("b")) echo "b is defined.\n"; else echo "b is not defined.\n";
a();
if (function_exists("b")) echo "b is defined.\n"; else echo "b is not defined.\n";

echoes:

b is not defined.
I am a.
b is defined.

Classes too can be defined inside functions, and will not exist until the outer function gets executed.
aboyd at ssti dot com
05-Apr-2001 10:34
[Editor's note: put your includes in the beginning of your script. You can call an included function, after it has been included                --jeroen]

The documentation states: "In PHP 3, functions must be defined before they are referenced. No such requirement exists in PHP 4."

I thought it wise to note here that there is in fact a limitation: you cannot bury your function in an include() or require().  If the function is in an include()'d file, there is NO way to call that function beforehand.  The workaround is to put the function directly in the file that calls the function.
yasuo_ohgaki at hotmail dot com
09-Mar-2001 02:42
PHP supports recursion. I thought it worth to mention.

Simple Quick Sort using recursion works perfectly.

== OUTPUT ==
Recursion TEST

Array
(
    [0] => 12
    [1] => 23
    [2] => 35
    [3] => 45
    [4] => 56
    [5] => 67
)
== END OUTPUT ==

== QUICK SORT CODE ==
<?php

echo('<br>Recursion TEST<br>');

function 
swap(&$v$i$j) {
 
$temp $v[$i];
 
$v[$i] = $v[$j];
 
$v[$j] = $temp;
}

// Quick Sort integer array - $int_array[$left] .. $int_array[$right]
function qsort(&$int_array$left$right) {
 if (
$left >= $right)
  return; 
// Do nothing if there are less than 2 array elements
 
swap ($int_array$leftintval(($left+$right)/2));
 
$last $left;
 for (
$i $left 1$i <= $right$i++)
  if (
$int_array[$i] < $int_array[$left])
   
swap($int_array, ++$last$i);
 
swap($int_array$left$last);
 
qsort($int_array$left$last-1);
 
qsort($int_array$last+1$right);
}

$val = array(56,23,45,67,12,35);

qsort($val0count($val)-1);

echo 
'<pre>';
print_r ($val);
echo 
'</pre>';

?>
== END QUICK SORT ==
22-Dec-2000 02:41
Function names are case-insensitive in PHP 3 and PHP 4.

For example, if you have function foo, you can call it using foo(), FoO(), FOO(), etc..
kop at meme dot com
15-Dec-2000 07:14
See also about controlling the generation of error messages by putting @ in front of the function before you call it, in the section "error control operators".
php-general at list dot php dot net
06-Dec-2000 08:51
If a user-defined function does not explicitly return a value, then it
 will return NULL. For most truth tests, this can be considered as FALSE.

For example:

function print_list ($array)
{
    print implode ("<br />", $array);
}

if (print_list ($HTTP_POST_VARS))
    print "The print_list function returned a value that can be considered true."
else
    print "The print_list function returned a value that can be considered false."
GMCardoe at netherworldrpg dot net
24-Apr-2000 04:02
Stack overflow means your function called itself recursivly too many times and just completely filled up the processes stack. That error is there to stop a recursive call from completely taking up the entire system memory.
cap at capsi dot cx
22-Feb-2000 08:19
When using a function within a function, using global in the inner function will not make variables available that have been first initialized within the outer function.
php at paintbot dot com
05-Feb-2000 11:32
Important Note to All New Users: functions do NOT have default access to GLOBAL variables.  You must specify globals as such in your function using the 'global' type/keyword.  See the section on variables:scope.

This note should also be added to the documentation, as it would help the majority of programmers who use languages where globals are, well, global (that is, available from anywhere).  The scoping rules should also not be buried in subsection 4 of the variables section.  It should be front and center because I think this is probably one of the most non-standard and thus confusing design choices of PHP.

[Ed. note: the variables $_GET, $_POST, $_REQUEST, $_SESSION, and $_FILES are superglobals, which means you don't need the global keyword to use them inside a function]
brooke at wayport dot net
08-Nov-1999 04:21
Many people ask how to call functions that are in other files. See "Require"  and "Include" in the manual. Also the value of $DOCUMENT_ROOT is good for including sub-includes. (It is NOT like C/C++ includes. The dir is ALWAYS relative to the main source file.)

<include_onceFunction arguments>
 Last updated: Thu, 21 Aug 2003
show source | credits | sitemap | mirror sites 
Copyright © 2001-2003 The PHP Group
All rights reserved.
This mirror generously provided by: http://php.mirrors.ilisys.com.au/
Last updated: Sat 01 Nov 2003 04:13:36 EST EST