PHP
Les fonctions
Recherche…
Syntaxe
- function func_name ($ parameterName1, $ parameterName2) {code_to_run (); }
- function func_name ($ optionalParameter = default_value) {code_to_run (); }
- function func_name (nom_type $ 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 (nom_type & ... $ varRefParams) {code_to_run (); } // PHP 5.6+
- function func_name (): return_type {code_To_run (); } // PHP 7.0+
Fonction de base
Une fonction de base est définie et exécutée comme suit:
function hello($name)
{
print "Hello $name";
}
hello("Alice");
Paramètres facultatifs
Les fonctions peuvent avoir des paramètres facultatifs, par exemple:
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
Passage d'arguments par référence
Les arguments de fonction peuvent être transmis "By Reference", permettant à la fonction de modifier la variable utilisée en dehors de la fonction:
function pluralize(&$word)
{
if (substr($word, -1) == 'y') {
$word = substr($word, 0, -1) . 'ies';
} else {
$word .= 's';
}
}
$word = 'Bannana';
pluralize($word);
print $word;
// Bannanas
Les arguments d'objet sont toujours passés par référence:
function addOneDay($date)
{
$date->modify('+1 day');
}
$date = new DateTime('2014-02-28');
addOneDay($date);
print $date->format('Y-m-d');
// 2014-03-01
Pour éviter la transmission implicite d'un objet par référence, vous devez clone
l'objet.
Le passage par référence peut également être utilisé comme un autre moyen de renvoyer des paramètres. Par exemple, la fonction socket_getpeername
:
bool socket_getpeername ( resource $socket , string &$address [, int &$port ] )
Cette méthode vise en fait à renvoyer l'adresse et le port de l'homologue, mais comme il y a deux valeurs à renvoyer, elle choisit plutôt d'utiliser des paramètres de référence. On peut l'appeler comme ceci:
if(!socket_getpeername($socket, $address, $port)) {
throw new RuntimeException(socket_last_error());
}
echo "Peer: $address:$port\n";
Les variables $address
et $port
n'ont pas besoin d'être définies auparavant. Ils vont:
- être défini comme
null
premier, - puis passé à la fonction avec la valeur
null
prédéfinie - puis modifié dans la fonction
- finis défini comme l'adresse et le port dans le contexte d'appel.
Listes d'arguments de longueur variable
PHP 5.6 a introduit des listes d'arguments de longueur variable (aka varargs, arguments variadic), utilisant le jeton ...
avant le nom de l'argument pour indiquer que le paramètre est variadic, c'est-à-dire un tableau incluant tous les paramètres fournis.
function variadic_func($nonVariadic, ...$variadic) {
echo json_encode($variadic);
}
variadic_func(1, 2, 3, 4); // prints [2,3,4]
Les noms de types peuvent être ajoutés devant le ...
:
function foo(Bar ...$bars) {}
L'opérateur &
reference peut être ajouté avant le ...
, mais après le nom du type (le cas échéant). Considérez cet exemple:
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);
Sortie:
int(0)
int(1)
int(1)
En revanche, un tableau (ou Traversable
) d’arguments peut être décompressé pour être passé à une fonction sous la forme d’une liste d’arguments:
var_dump(...hash_algos());
Sortie:
string(3) "md2"
string(3) "md4"
string(3) "md5"
...
Comparez avec cet extrait sans utiliser ...
:
var_dump(hash_algos());
Sortie:
array(46) {
[0]=>
string(3) "md2"
[1]=>
string(3) "md4"
...
}
Par conséquent, les fonctions de redirection pour les fonctions variadiques peuvent désormais être facilement créées, par exemple:
public function formatQuery($query, ...$args){
return sprintf($query, ...array_map([$mysqli, "real_escape_string"], $args));
}
En dehors des tableaux, on peut également utiliser des Traversable
, tels que Iterator
(en particulier de nombreuses sous-classes de SPL). Par exemple:
$iterator = new LimitIterator(new ArrayIterator([0, 1, 2, 3, 4, 5, 6]), 2, 3);
echo bin2hex(pack("c*", ...$it)); // Output: 020304
Si l'itérateur itère à l'infini, par exemple:
$iterator = new InfiniteIterator(new ArrayIterator([0, 1, 2, 3, 4]));
var_dump(...$iterator);
Les différentes versions de PHP se comportent différemment:
- De PHP 7.0.0 à PHP 7.1.0 (beta 1):
- Un défaut de segmentation se produira
- Le processus PHP sortira avec le code 139
- En PHP 5.6:
- Une erreur fatale de l'épuisement de la mémoire ("Taille de la mémoire autorisée de% d octets épuisée") sera affichée.
- Le processus PHP sortira avec le code 255
Note: HHVM (v3.10 - v3.12) ne supporte pas les déballer
Traversable
s. Un message d'avertissement "Seuls les conteneurs peuvent être décompressés" sera affiché dans cette tentative.
Portée de la fonction
Les variables à l'intérieur des fonctions sont dans une portée locale comme celle-ci
$number = 5
function foo(){
$number = 10
return $number
}
foo(); //Will print 10 because text defined inside function is a local variable