PHP 7.1.0 Released

Funzioni definite dall'utente

Una funzione può essere definita usando la seguente sintassi:

Example #1 Pseudo codice per dimostrare l'uso delle funzioni

<?php
function foo($arg_1$arg_2/* ..., */ $arg_n)
{
    echo 
"Funzione di esempio.\n";
    return 
$retval;
}
?>

All'interno di una funzione può apparire qualunque codice PHP valido, persino altre funzioni e definizioni di classe.

I nomi di funzione seguono le stesse regole delle altre etichette PHP. Un nome di funzione valido comincia con una lettera o un underscore, seguito da un qualsiasi numero di lettere, numeri o underscore. Come espressione regolare, questo viene rappresentato così: [a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*.

Suggerimento

Si può anche consultare Guida Denominazione Spazio Utente.

Le funzioni devono essere definite prima di essere referenziate tranne quando una funzione è definita condizionalmente come illustrato nei due esempi seguenti.

Quando una funzione è definita in modo condizionale, come illustrato nei seguenti esempi, occorre che ne venga processata prima la definizione poi venga chiamata la funzione stessa.

Example #2 Funzioni condizionali

<?php

$makefoo 
true;

/* Qui non possiamo chiamare foo()
   poiché non esiste ancora,
   ma possiamo chiamare bar() */

bar();

if (
$makefoo) {
  function 
foo()
  {
    echo 
"Io non esisto sino a quando il programma non mi raggiunge.\n";
  }
}

/* Ora possiamo chiamare foo()
   poiché $makefoo vale true */

if ($makefoofoo();

function 
bar()
{
  echo 
"Io esco immediatamente dopo l'avvio del programma.\n";
}

?>

Example #3 Funzioni dentro a funzioni

<?php
function foo() 
{
  function 
bar() 
  {
    echo 
"Io non esiste fino a quando non si esegue foo().\n";
  }
}

/* Non possiamo chiamare bar()
   poiché non esiste ancora. */

foo();

/* Ora si può eseguire bar(),
   l'elaborazione di foo()
   l'ha resa accessibile. */

bar();

?>

Tutte le funzioni e le classi, in PHP, hanno visibilità globale - possono essere chiamate dall'esterno di una funzione anche se sono definite all'interno di questa e vice-versa.

PHP non supporta l'overloading di funzioni, non è possibile indefinire o ridefinire funzioni precedentemente dichiarate.

Nota: I nomi delle funzioni non distinguono tra maiuscolo e minuscolo, ma, solitamente, è buona norma richiamare le funzioni nel modo con cui sono state definite.

Sia un numero variabile di argomenti che gli argomenti di default sono ammessi nelle funzioni. Vedere anche i riferimenti alle funzioni func_num_args(), func_get_arg() e func_get_args() per maggiori informazioni.

In PHP è possibile utilizzare le chiamate a funzioni ricorsive.

Example #4 Funzioni ricorsive

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

Nota: Funzioni/metodi ricorsivi con oltre 100-200 livelli di ricorsione possono riempire lo stack e causare la terminazione dello script corrente. In particolare, la ricorsione infinita è considerata un errore di programmazione.

add a note add a note

User Contributed Notes 10 notes

up
16
ayyappan dot ashok at gmail dot com
8 months ago
Type Checking in PHP 7

case A: //Using return
-------------------------
function welcome($name):string
{
   return $name;
}
echo welcome(100);

Results :  100

case B: //Using echo
-------------------------
function welcome($name):string
{
    echo $name;
}
welcome("100");

Results : Fatal error</b>:  Uncaught TypeError

function welcome(string $name)
{
    echo $name;
}
welcome(100);

Results :  100

case C: // Using strict_types
--------------------------------
declare(strict_types=1);

function welcome($name):string
{
    return $name;
}
echo welcome(90.99);

Results : Fatal error</b>:  Uncaught TypeError

case D: // Using strict_types
--------------------------------
//declare(strict_types=1);   On comment to strict_types

function welcome($name):string
{
    return $name;
}
echo welcome(90.99);

Results :  90.99

Note:
Behaviour of echo and return on welcome function show in different reflection. Representation of function type checking can be in either type as follows

function welcome(string $name){ }
or
function welcome($name):string{ }

Executed on PHP Version : 7.0.3
up
15
Muneeb Aslam
1 year ago
following is a function that can be used to convert numeric date to alphabetic date, e-g from 2015-11-16 to 16 Nov, 2015.

1. Function takes 3 parameters, numeric date, locale and length of month
2. Function currently supports EN and ES month names.
3. Function can be calles as <?php convertDate("2015-11-16","en","full"); ?>

<?php

   
function convertDate($date,$locale,$length){
       
       
$monthNames = array(
               
"en" => array(
                   
"full" => array(1=>'January','February','March','April','May',
                   
'June','July','August','September','October','November','December'),
                   
                   
"short" => array(1=>'Jan','Feb','Mar','Apr','May','Jun',
                   
'Jul','Aug','Sep','Oct','Nov','Dec')
                ),
               
"es" => array(
                   
"full" => array(1=>'Enero','Febrero','Marzo','Abril','Mayo',
                   
'Junio','Julio','Agosto','Septiembre','Octubre','Noviembre','Deciembre'),
                   
                   
"short" => array(1=>'Ene','Feb','Mar','Abr','May','Jun',
                   
'Jul','Ago','Sep','Oct','Nov','Dec')
                ),
            );
           
           
$exploded = explode("-",$date);
           
$year = $exploded[0];
           
$month = $exploded[1];
           
$day = $exploded[2];
           
           
$month = $monthNames[$locale][$length][$month];
           
$date = $day . " " . $month . ", " . $year;
            return
$date;
    }

?>
up
5
aydinantmen [at] hotmail [dot] com
2 years 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
1
ayyappan dot ashok at gmail dot com
8 months ago
As posted by ohcc at 163 dot com

    function wxc ($var) : string
    {
        return $var;
    }

  this function must return a string, if it return something else when 
  called, a "Fatal error: Uncaught TypeError" error will be triggered.

  But when executed by passing various datatypes, it doesn't throw error  
  other than array and object.

  Please look over the code

  function abc($var) :string { return $var;}
  echo abc(true);    // Results 1
 
  function abc($var) :string { return $var;}
  echo abc(88.99);  // Results 88.99

  function abc($var) :string { return $var;}
  echo abc(array());
 
  //Results
  Fatal error : Uncaught TypeError: Return value of abc() must be of the  
  type string

  Note :
  Even though function is forced to return only string, it still considers the  
  other datatype arguments as string.
 
  echo gettype(abc(99.88));  // Returns string.
up
1
ohcc at 163 dot com
1 year ago
As of PHP 7.0, you can restrain type of return value of user defined functions.

Syntax is : function FunctionName ($arg1, $arg2, ...)  : TYPE { ... }

TYPE is a string representing the type of return value, TYPE can be a class name or a php variable type, such as array/string/bool/int/float.

When TYPE is one of the following value, it also stands for a classname

str/boolean/integer/real/double/resource/object/scalar

However,in my opion, boolean/bool, integer/int ... should have the same meaning, but at least in PHP7, they stand for different meanings respectively. This may be fixed in later versions of PHP.

<?php
   
function wxc ($var) : string {
        return
$var;
    }
?>

this function must return a string, if it return something else when called, a "Fatal error: Uncaught TypeError" error will be triggered.

code above is supported only in PHP 7+
up
0
ayyappan dot ashok at gmail dot com
8 months ago
For a good note, we can pass function as argument to function.

Take a look at the code. Passing function as argument can be achieved by Closure class ( A class to represent anonymous function).

function math(Closure $type, $first, $second) {
    // Execute the closure with parameters
    return $type($first, $second);
}

// Create an addition closure.
$addition = function ($first, $second) {
    // Add the values.
    return $first + $second;
};

// Create an subtraction closure.
$subtraction = function ($first, $second) {
    // Subtract the values.
    return $first - $second;
};

// Execute math function.
Note :anonymous  function is passed as an argument to function math.
echo math($addition, 2, 2);
echo PHP_EOL; // New line!
echo math($subtraction, 5, 3);

Courtesy : PHP Panda. Inspired from PHP panda.
up
0
N Atanackovic
1 year ago
You can also call function from itself.  For example, I want to reach the deepest value in multidimensional array and I call function from inside the very same function. In this example function behave as some meta-loop.
   
<?php

$arr1
=array('a'=>array('e'=>array('f'=>array('g'=>'h', 'n' )),'b','c'));
$arr2=array('a'=>array('e'=>array('f'=>array('g'=>array('l'=>array('m'=>'w','q')), 'n' )),'b','c'));

function
Deep($array){
    foreach(
$array as $key){
        if(
is_array($key)){
             return
Deep($key);//calling the function inside the function
}else {
echo
$key;
        }
    }
}

echo
Deep($arr1); //outputs: hn
echo Deep($arr2); //outputs: wq

?>
up
0
php at xenhideout dot nl
2 years 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
-1
ayyappan dot ashok at gmail dot com
8 months ago
//Calling function with in a function or inner function

function add($a,$b){
    return $a+$b;
}

function sub($a,$b){
    return $a-$b;
}

function math($first, $second) {
    $res =  add($first, $second)/sub($first, $second);
    return (int)$res;
}
echo math(200,100);  //Results  3
up
-9
info at namasteui dot com
11 months ago
Functions that are written by the user are User defined functions.

function function name [(argument1, argument 2, ...argument n)]
{any PHP code }

For example,

<?php
function hello()
{
print(
"Hello!");
}
hello();
?>

Using the function hello() anywhere in the PHP code will display the word "Hello".
To Top