Sök…


Syntax

  • funktion func_name ($ parameterName1, $ parameterName2) {code_to_run (); }
  • funktion func_name ($ optionalParameter = default_value) {code_to_run (); }
  • funktion func_name (typ_name $ parameternamn) {code_to_run (); }
  • funktion & return_by_reference () {code_to_run (); }
  • funktion func_name (& $ referenceParameter) {code_to_run (); }
  • funktion func_name (... $ variadicParameters) {code_to_run (); } // PHP 5.6+
  • funktion func_name (typ_name & ... $ varRefParams) {code_to_run (); } // PHP 5.6+
  • funktion func_name (): return_type {code_To_run (); } // PHP 7.0+

Grundläggande funktionsanvändning

En grundläggande funktion definieras och körs så här:

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

hello("Alice");

Valfria parametrar

Funktioner kan ha valfria parametrar, till exempel:

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

Vidarebefordra argument genom referens

Funktionsargument kan skickas "Med referens", vilket gör att funktionen kan ändra variabeln som används utanför funktionen:

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

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

print $word;
  // Bannanas

Objektargument skickas alltid som referens:

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

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

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

För att undvika implicit överföring av ett objekt genom referens bör du clone objektet.

Vidarebefordran av referens kan också användas som ett alternativt sätt att returnera parametrar. Till exempel funktionen socket_getpeername :

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

Denna metod syftar faktiskt till att returnera peerens adress och port, men eftersom det finns två värden att returnera väljer den att använda referensparametrar istället. Det kan kallas så här:

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

Variablerna $address och $port behöver inte definieras tidigare. De kommer:

  1. definieras som null först,
  2. överfördes sedan till funktionen med det fördefinierade null
  3. ändras sedan i funktionen
  4. i slutändan definieras som adress och port i samtalssammanhang.

Argumentlistor med variabel längd

5,6

PHP 5.6 införde argumenteringslistor med variabel längd (aka varargs, variadic argument), med hjälp av ... token före argumentnamnet för att indikera att parametern är variadisk, dvs.

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

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

Typnamn kan läggas till framför ... :

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

& Referensoperatören kan läggas till före ... , men efter typnamnet (i förekommande fall). Tänk på detta exempel:

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

Produktion:

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

Å andra sidan kan en matris (eller Traversable ) av argument packas upp för att skickas till en funktion i form av en argumentlista:

var_dump(...hash_algos());

Produktion:

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

Jämför med detta utdrag utan att använda ... :

var_dump(hash_algos());

Produktion:

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

Därför kan omdirigeringsfunktioner för variadiska funktioner nu enkelt göras, till exempel:

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

Förutom matriser kan också Traversable s, som Iterator (särskilt många av dess underklasser från SPL) användas. Till exempel:

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

Om iteratorn upprepas oändligt, till exempel:

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

Olika versioner av PHP beter sig annorlunda:

  • Från PHP 7.0.0 upp till PHP 7.1.0 (beta 1):
    • Ett segmenteringsfel kommer att inträffa
    • PHP-processen avslutas med kod 139
  • I PHP 5.6:
    • Ett dödligt fel med utmattning av minnet ("Tillåtet minnesstorlek på% d byte uttömt") kommer att visas.
    • PHP-processen kommer att avsluta med kod 255

Obs: HHVM (v3.10 - v3.12) stöder inte packning av Traversable s. I detta försök visas ett varningsmeddelande "Endast behållare får packas upp".

Funktionsområde

Variabler inuti funktioner finns inom ett lokalt omfång som detta

$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
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow