Поиск…


Синтаксис

  • 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+

Использование основных функций

Базовая функция определяется и выполняется следующим образом:

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

hello("Alice");

Дополнительные параметры

Функции могут иметь необязательные параметры, например:

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

Передача аргументов по ссылке

Аргументы функции могут передаваться «по ссылке», позволяя функции изменять переменную, используемую вне функции:

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

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

print $word;
  // Bannanas

Аргументы объектов всегда передаются по ссылке:

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

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

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

Чтобы избежать неявного прохождения объекта по ссылке, вы должны clone объект.

Передача по ссылке также может использоваться как альтернативный способ возврата параметров. Например, функция socket_getpeername :

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

Этот метод на самом деле направлен на возвращение адреса и порта однорангового узла, но поскольку есть два значения для возврата, он вместо этого выбирает ссылочные параметры. Его можно назвать так:

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

Переменные $address и $port не должны быть определены ранее. Они будут:

  1. сначала определяется как null ,
  2. затем передается функции с предопределенным null значением
  3. затем модифицируется в функции
  4. в конечном итоге определяется как адрес и порт в вызывающем контексте.

Переменные аргументы переменной длины

5,6

PHP 5.6 введены переменной длины списки аргументов (он же переменной длины, VARIADIC аргументы), используя ... маркер перед именем аргумента , чтобы указать , что параметр VARIADIC, т.е. массив , включая все поставляемые параметры из этого один вперед.

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

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

Имена типов могут быть добавлены перед ... :

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

Оператор & reference может быть добавлен до ... , но после имени типа (если есть). Рассмотрим этот пример:

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

Выход:

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

С другой стороны, массив (или Traversable ) аргументов может быть распакован для передачи в функцию в виде списка аргументов:

var_dump(...hash_algos());

Выход:

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

Сравните с этим фрагментом без использования ... :

var_dump(hash_algos());

Выход:

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

Поэтому функции переадресации для переменных функций теперь можно легко сделать, например:

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

Помимо массивов, также можно использовать Traversable s, такие как Iterator (особенно многие из его подклассов из SPL). Например:

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

Если итератор итерирует бесконечно, например:

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

Различные версии PHP ведут себя по-разному:

  • От PHP 7.0.0 до PHP 7.1.0 (бета 1):
    • Произойдет ошибка сегментации
    • Процесс PHP завершится с кодом 139
  • В PHP 5.6:
    • Будет показана фатальная ошибка исчерпания памяти («Разрешенный объем памяти в% d байт исчерпан»).
    • Процесс PHP завершится с кодом 255

Примечание: HHVM (v3.10 - v3.12) не поддерживает распаковку Traversable s. В этой попытке будет показано предупреждающее сообщение «Только контейнеры могут быть распакованы».

Область функций

Переменные внутри функций находятся внутри локальной области, подобной этой

$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
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow