Ricerca…


Sintassi

  • function func_name ($ parameterName1, $ parameterName2) {code_to_run (); }
  • function func_name ($ optionalParameter = default_value) {code_to_run (); }
  • function func_name (type_name $ parameterName) {code_to_run (); }
  • function & returns_by_reference () {code_to_run (); }
  • function func_name (& $ referenceParameter) {code_to_run (); }
  • function func_name (... $ variadicParameters) {code_to_run (); } // PHP 5.6+
  • function func_name (type_name & ... $ varRefParams) {code_to_run (); } // PHP 5.6+
  • function func_name (): return_type {code_To_run (); } // PHP 7.0+

Uso della funzione di base

Una funzione di base è definita ed eseguita in questo modo:

function hello($name)
{
    print "Hello $name";
}

hello("Alice");

Parametri opzionali

Le funzioni possono avere parametri opzionali, ad esempio:

function hello($name, $style = 'Formal')
{
    switch ($style) {
        case 'Formal':
            print "Good Day $name";
            break;
        case 'Informal':
            print "Hi $name";
            break;
        case 'Australian':
            print "G'day $name";
            break;
        default:
            print "Hello $name";
            break;
    }
}

hello('Alice');
    // Good Day Alice

hello('Alice', 'Australian');
    // G'day Alice

Passando argomenti per riferimento

Gli argomenti della funzione possono essere passati "Per riferimento", consentendo alla funzione di modificare la variabile utilizzata al di fuori della funzione:

function pluralize(&$word)
{
    if (substr($word, -1) == 'y') {
        $word = substr($word, 0, -1) . 'ies';
    } else {
      $word .= 's';
    }
}

$word = 'Bannana';
pluralize($word);

print $word;
  // Bannanas

Gli argomenti oggetto vengono sempre passati per riferimento:

function addOneDay($date)
{
    $date->modify('+1 day');
}

$date = new DateTime('2014-02-28');
addOneDay($date);

print $date->format('Y-m-d');
  // 2014-03-01

Per evitare il passaggio implicito di un oggetto per riferimento, è necessario clone l'oggetto.

Passare per riferimento può anche essere usato come un modo alternativo per restituire i parametri. Ad esempio, la funzione socket_getpeername :

bool socket_getpeername ( resource $socket , string &$address [, int &$port ] )

Questo metodo in realtà mira a restituire l'indirizzo e la porta del peer, ma poiché ci sono due valori da restituire, sceglie invece di utilizzare i parametri di riferimento. Può essere chiamato così:

if(!socket_getpeername($socket, $address, $port)) {
    throw new RuntimeException(socket_last_error());
}
echo "Peer: $address:$port\n";

Le variabili $address e $port non hanno bisogno di essere definite prima. Faranno:

  1. essere definito come null prima,
  2. quindi passato alla funzione con il valore null predefinito
  3. quindi modificato nella funzione
  4. fine definito come l'indirizzo e la porta nel contesto di chiamata.

Elenchi di argomenti a lunghezza variabile

5.6

PHP 5.6 ha introdotto liste di argomenti di lunghezza variabile (p.es. varargs, argomenti variadici), usando il ... token prima del nome dell'argomento per indicare che il parametro è variadic, cioè è una matrice che include tutti i parametri forniti da quella in poi.

function variadic_func($nonVariadic, ...$variadic) {
    echo json_encode($variadic);
}

variadic_func(1, 2, 3, 4); // prints [2,3,4]

I nomi dei tipi possono essere aggiunti davanti al ... :

function foo(Bar ...$bars) {}

L'operatore & reference può essere aggiunto prima del ... , ma dopo il nome del tipo (se presente). Considera questo esempio:

class Foo{}
function a(Foo &...$foos){
    $i = 0;
    foreach($a as &$foo){ // note the &
        $foo = $i++;
    }
}
$a = new Foo;
$c = new Foo;
$b =& $c;
a($a, $b);
var_dump($a, $b, $c);

Produzione:

int(0)
int(1)
int(1)

D'altra parte, un array (o Traversable ) di argomenti può essere decompresso per essere passato a una funzione sotto forma di un elenco di argomenti:

var_dump(...hash_algos());

Produzione:

string(3) "md2"
string(3) "md4"
string(3) "md5"
...

Confronta con questo frammento senza usare ... :

var_dump(hash_algos());

Produzione:

array(46) {
  [0]=>
  string(3) "md2"
  [1]=>
  string(3) "md4"
  ...
}

Pertanto, ora è possibile creare facilmente funzioni di reindirizzamento per funzioni variad, ad esempio:

public function formatQuery($query, ...$args){
    return sprintf($query, ...array_map([$mysqli, "real_escape_string"], $args));
}

Oltre agli array, possono essere utilizzati anche i Traversable , come Iterator (specialmente molte delle sue sottoclassi da SPL). Per esempio:

$iterator = new LimitIterator(new ArrayIterator([0, 1, 2, 3, 4, 5, 6]), 2, 3);
echo bin2hex(pack("c*", ...$it)); // Output: 020304

Se l'iteratore itera infinitamente, ad esempio:

$iterator = new InfiniteIterator(new ArrayIterator([0, 1, 2, 3, 4]));
var_dump(...$iterator);

Diverse versioni di PHP si comportano diversamente:

  • Da PHP 7.0.0 a PHP 7.1.0 (beta 1):
    • Si verificherà un errore di segmentazione
    • Il processo PHP uscirà con il codice 139
  • In PHP 5.6:
    • Verrà mostrato un errore fatale dell'esaurimento della memoria ("Dimensione memoria consentita di% d byte esauriti").
    • Il processo PHP uscirà con il codice 255

Nota: HHVM (v3.10 - v3.12) non supporta il disimballaggio di Traversable s. In questo tentativo verrà visualizzato un messaggio di avviso "Solo i contenitori possono essere decompressi".

Ambito della funzione

Le variabili all'interno delle funzioni si trovano all'interno di un ambito locale come questo

$number = 5
function foo(){
    $number = 10
    return $number
}

foo(); //Will print 10 because text defined inside function is a local variable


Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow