PHP Unconference Europe 2015

Funkcje definiowane przez użytkownika

Funkcja może być definiowana przy użyciu następującej składni:

Przykład #1 Pseudokod demonstrujący użycie funkcji

<?php
function foo($arg_1$arg_2/* ..., */ $arg_n)
{
    echo 
"Przykładowa funkcja.\n";
    return 
$retval;
}
?>

Każdy poprawny kod może być użyty wewnątrz funkcji, łącznie z definicjami innych funkcji i klas.

Nazwy funkcji obowiązują identyczne zasady, jak w przypadku wszystkich innych etykiet w PHP. Poprawna nazwa funkcji zaczyna się od litery lub podkreślnika, po których następuje dowolna ilość liter, cyfr i podkreślników. Jako wyrażenie regularne, określone zostałoby to następująco: [a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*.

Wskazówka

Zobacz także Userland Naming Guide.

Funkcje nie muszą być zdefiniowane przed odniesieniem się do nich, oprócz sytuacji, w których funkcja jest zdefiniowana warunkowo jak w dwóch poniższych przykładach.

Kiedy funkcja jest zdefiniowana warunkowo, jak w dwóch poniższych przykładach, jej definicja musi być przetworzona przed jej wywołaniem.

Przykład #2 Funkcje zdefiniowane warunkowo

<?php

$makefoo 
true;

/* Nie możemy tu wywołać foo() 
   ponieważ jeszcze nie istnieje,
   ale możemy wywołać bar() */

bar();

if (
$makefoo) {
  function 
foo()
  {
    echo 
"Nie istnieję, dopóki nie zostanę wykonana.\n";
  }
}

/* Teraz możemy bezpiecznie wywołać foo()
   ponieważ $makefoo ma wartość logiczną 1 */

if ($makefoofoo();

function 
bar() 
{
  echo 
"Istnieję od początku działania skryptu.\n";
}

?>

Przykład #3 Funkcje wewnątrz funkcji

<?php
function foo() 
{
  function 
bar() 
  {
    echo 
"Nie istnieję, dopóki foo() nie jest wywołana.\n";
  }
}

/* Nie możemy tu wywołać bar() 
   ponieważ jeszcze nie istnieje. */

foo();

/* Teraz możemy wywołać bar(),
   wykonanie foo() spodowało
   że jest to już możliwe. */

bar();

?>

Wszystkie funkcje i klasy w PHP mają globalny zasięg - mogą być wykonane poza funkcją, nawet jeśli były zdefiniowane wewnątrz niej, i odwrotnie.

PHP nie umożliwia przeładowywania funkcji, nie jest też możliwe usunięcie jej definicji lub redefiniowanie poprzednio określonych funkcji.

Informacja: Nazwy funkcji nie rozróżniają wielkości liter, ale dobrym zwyczajem jest wywoływanie ich w formie, w której zostały zdefiniowane.

Zarówno przyjmowanie różnej ilości argumentów jak i wartości domyślne argumentów są obsługiwane w funkcjach. Zobacz także opisy funkcji func_num_args(), func_get_arg(), i func_get_args() aby uzyskać więcej informacji.

W PHP jest możliwe wykonywanie rekurencyjnych funkcji. Unikaj jednak wywoływania rekurencyjnych funkcji/metod które osiągają poziom rekurencji większy niż 100-200, ponieważ może to spowodować przepełnienie stosu i zakończenie wykonywania skryptu.

Przykład #4 Funkcje rekurencyjne

<?php
function recursion($a)
{
    if (
$a 20) {
        echo 
"$a\n";
        
recursion($a 1);
    }
}
?>

add a note add a note

User Contributed Notes 6 notes

up
3
php at xenhideout dot nl
1 month ago
Please be advised that the code block defining the function, within the function_exists() call, has to be executed for the function to get defined, whereas this is not the case for regular, unenclosed functions.

Meaning, if you write code like this:

<?php

do_function
();

if (!
function_exists('my_undefined')) {
    function
my_undefined() {
    }
}

function
do_function() {
   
my_undefined();
}
?>

..Then my_undefined will not be defined before the code in do_function calls it. Some people put their function sections below the regular executing code of the script. Making any of it 'pluggable' can then cause problems.
up
11
aydinantmen [at] hotmail [dot] com
6 months ago
I want to use multidimentional arrays in a callback function what accepts second parameter.

Solution:

<?php

$arr1
= array("a" => "b", "c", "d's", "e" => array("f's", "g" => array("h's", "i" => "j's")));
$arr2 = mdarr_parameter($arr1);
$arr3 = mdarr_parameter($arr2, true);

function
mdarr_parameter($needle, $job=false) {
    if (
is_array($needle)) {
        foreach(
$needle as $name => $value) {
           
$needle[$name] = mdarr_parameter($value, $job);
        }
    } else {
       
// Now you do anything you want...
       
if ($job === true) {
           
$needle = stripslashes($needle);
        } else {
           
$needle = addslashes($needle);
        }
    }
    return
$needle;
}

print_r($arr2);
print_r($arr3);

/**
Outputs:

Array
(
    [a] => b
    [0] => c
    [1] => d\'s
    [e] => Array
        (
            [0] => f\'s
            [g] => Array
                (
                    [0] => h\'s
                    [i] => j\'s
                )

        )

)
Array
(
    [a] => b
    [0] => c
    [1] => d's
    [e] => Array
        (
            [0] => f's
            [g] => Array
                (
                    [0] => h's
                    [i] => j's
                )

        )

)
**/

?>
up
0
webmaster at heathdale dot vic dot edu dot au
6 months ago
<?php

// first run (function doesn't exist)
$myfunc_exists;
if (!
$myfunc_exists) {
    function
myfunc() {
        echo (
'myfunc ran definition #1<br>');
    }
   
$myfunc_exists = true;
}

myfunc();   // echoes 'myfunc ran definition #1<br>'

// second run (function already exists, so won't be redefined and won't cause error)
// e.g. if the file containing the function got #included twice (it does happen)
$myfunc_exists;
if (!
$myfunc_exists) {
    function
myfunc() {
        echo (
'myfunc ran definition #2<br>');
    }
   
$myfunc_exists = true;
}

myfunc();  // still echoes 'myfunc ran definition #1<br>' (not #2)

?>
up
-10
Alexandre
5 months ago
In  PHP version less than 5 a function named "retorna_so_numeros" was OK.

Now in current PHP version I had to rename this function to "retorna_numeros" or the script won't work.
up
-41
lubaev
9 months ago
<?php

function overload()
{
 
$overloadFn = array();
 
 
// key = count arguments, value = callback function.
 
$overloadFn[0] = function() {
    return print
nl2br("Zero argument. \n");
  };
 
$overloadFn[1] = function($a) {
    return print
nl2br("One argument. Result: $a \n");
  };
 
$overloadFn[2] = function($a,$b) {
    return print
nl2br("Two argument. Result: $a, $b \n");
  };
 
$overloadFn[4] = function($a,$b,$c,$d) {
    return print
nl2br("Four argument. Result: $a, $b, $c, $d \n");
  };
 
 
$countArgs = func_num_args();
 
$valueArgs = func_get_args();
 
  if( isset(
$overloadFn[ $countArgs ]) )
  {
    return
call_user_func_array( $overloadFn[ $countArgs ], $valueArgs );
  }
 
trigger_error("Wrong number of arguments!", E_USER_WARNING);
 
}

// OVERLOAD
overload(); // Zero argument.
overload(1); // One argument. Result: 1
overload(1,2); // Two argument. Result: 1, 2
overload(1,2,3); // Warning: Wrong number of arguments!
overload(1,2,3,4); // Four argument. Result: 1, 2, 3, 4
overload(1,2,3,4,5); // Warning: Wrong number of arguments!

?>
up
-56
Ben Tiessen
9 months ago
Functions can also be executed from variables:

function myFunc(){
  echo "Hello World";
}

$myFunc = myFunc();

$myFunc();

// Will output Hello World
To Top