Zoeken…


Syntaxis

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

Gebruik van basisfuncties

Een basisfunctie wordt als volgt gedefinieerd en uitgevoerd:

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

hello("Alice");

Optionele parameters

Functies kunnen optionele parameters hebben, bijvoorbeeld:

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

Argumenten doorgeven via referentie

Functieargumenten kunnen "op referentie" worden doorgegeven, zodat de functie de variabele kan wijzigen die buiten de functie wordt gebruikt:

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

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

print $word;
  // Bannanas

Objectargumenten worden altijd doorgegeven als referentie:

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

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

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

Om te voorkomen dat een object impliciet wordt doorgegeven, moet u het object clone .

Passing by reference kan ook worden gebruikt als een alternatieve manier om parameters te retourneren. Bijvoorbeeld de functie socket_getpeername :

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

Deze methode is eigenlijk bedoeld om het adres en de poort van de peer te retourneren, maar omdat er twee waarden zijn om te retourneren, kiest het ervoor om in plaats daarvan referentieparameters te gebruiken. Het kan zo worden genoemd:

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

De variabelen $address en $port hoeven niet eerder te worden gedefinieerd. Ze zullen:

  1. eerst worden gedefinieerd als null ,
  2. vervolgens doorgegeven aan de functie met de vooraf gedefinieerde null
  3. vervolgens gewijzigd in de functie
  4. uiteindelijk gedefinieerd als het adres en de poort in de aanroepende context.

Variabele lengte argumentlijsten

5.6

PHP 5.6 introduceerde variabele-lengte argumentlijsten (ook bekend als varargs, variadische argumenten), met behulp van het ... token voor de argumentnaam om aan te geven dat de parameter variadisch is, dat wil zeggen het is een array met alle geleverde parameters vanaf dat moment.

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

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

Typenamen kunnen worden toegevoegd vóór de ... :

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

De operator & reference kan worden toegevoegd vóór ... , maar na de typenaam (indien aanwezig). Beschouw dit voorbeeld:

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);

Output:

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

Aan de andere kant kan een array (of Traversable ) van argumenten worden uitgepakt om te worden doorgegeven aan een functie in de vorm van een lijst met argumenten:

var_dump(...hash_algos());

Output:

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

Vergelijk met dit fragment zonder gebruik van ... :

var_dump(hash_algos());

Output:

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

Daarom kunnen omleidingsfuncties voor variadische functies nu eenvoudig worden gemaakt, bijvoorbeeld:

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

Afgezien van arrays, kunnen Traversable s, zoals Iterator (vooral veel van de subklassen van SPL) ook worden gebruikt. Bijvoorbeeld:

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

Als de iterator oneindig itereert, bijvoorbeeld:

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

Verschillende versies van PHP gedragen zich anders:

  • Van PHP 7.0.0 tot PHP 7.1.0 (beta 1):
    • Er treedt een segmentatiefout op
    • Het PHP-proces wordt afgesloten met code 139
  • In PHP 5.6:
    • Een fatale fout van geheugenuitputting ("Toegestane geheugengrootte van% d bytes uitgeput") wordt weergegeven.
    • Het PHP-proces wordt afgesloten met code 255

Opmerking: HHVM (v3.10 - v3.12) biedt geen ondersteuning voor het uitpakken van Traversable s. Een waarschuwing "Alleen containers mogen worden uitgepakt" zal bij deze poging worden getoond.

Functiebereik

Variabelen binnen functies bevinden zich binnen een lokaal bereik zoals dit

$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
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow