PHP
функции
Поиск…
Синтаксис
- 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
не должны быть определены ранее. Они будут:
- сначала определяется как
null
, - затем передается функции с предопределенным
null
значением - затем модифицируется в функции
- в конечном итоге определяется как адрес и порт в вызывающем контексте.
Переменные аргументы переменной длины
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