PHP
funzioni
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:
- essere definito come
null
prima, - quindi passato alla funzione con il valore
null
predefinito - quindi modificato nella funzione
- fine definito come l'indirizzo e la porta nel contesto di chiamata.
Elenchi di argomenti a lunghezza variabile
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