Подготовка к Zend сертификации : Функции

Рассматриваем особенности объявления и использования функций в PHP 5

Основы функций

  • Функция может содержать в себе любой корректный PHP код, включая другие функции и классы.
  • Функция не обязательно должна быть определена до вызова, за исключением её использования в условных операторах.
  • Объявленную функцию нельзя переопределить.
  • В PHP все функции и классы имеют глобальную область видимости - их допускается вызывать даже за пределами функции в случае, когда они были заданы внутри этой функции и наоборот.
  • имена функций не чувствительны к регистру
  • типы: встроенные, определенные пользователем, сторонние (например из расширений).
  • global $id; или $GLOBALS["id"] используются для доступа к глобальным переменным (по сути global $id это ссылка на $var = & $GLOBALS["id"]).
  • В PHP5 появилась возможность задать значение параметра функции по-умолчанию даже для параметров, передаваемых по ссылке (если параметр не был передан, то создается новая переменная).
  • В PHP5 объекты всегда передаются по ссылке, если только они не были клонированы.
  • допускается рекурсивный вызов функций (то есть function recursion($a) { if($a<10){recursion($a+1);} }), следите за тем, чтобы выполнение функций было ограниченно.
  • чтобы проверить существует ли функции в контексте используйте function_exists($function_name).
  • $arr = get_defined_functions() - даст вам полный список всех функций, $arr['user'] - функции заданные пользователем.
<?php

function printList($string, $count = 5) {
    // значения по умолчанию должны быть расположены справа
}

function printList($count=5, $string) {
} // вот так неправильно

function newTo5(&$number = 2) {
} // в PHP 5, значение по умолчанию может быть передано по ссылке

function fun($x, $x=1, $x=2) { 
    return $x;
}

echo fun(3); // выдаст 2, аргументы вычисляются слева направо

function fun($x) { 
    return $x;
} 

echo fun(3,4,5,6,7,8); // выдаст 3, будет выдано предупреждение только тогда, когда передаётся меньше аргументов, чем определено в заголовке функции

Возвращаемое значение

  • возврат значение происходит при помощи оператора return.
  • если параметр, переданный функции не соответствует ожидаемому типу, например, был передан массив, а функции ожидает строковое значение, то возвращаемое значение функции не определенно.
  • функция может вернуть любое значение, включая массивы и объекты.
  • после оператора return функция прекращает свое выполнение и передает управление строке, следующей за вызовом функции.
  • если оператор return отсутствует, то функция возвращает null.

Ссылки

<?php

function &name() { 
    return $someref; 
}

$newref = & name();
  • позволяет вернуть переменную в качестве самой функции, вместо копирования.
  • применяется для работы с ресурсами и при реализации шаблона Фабрика.
  • вы должны вернуть переменную, а не выражение или строковое значение.
  • function &hello() {return "hello"} - неверно, будет выдан предупреждение об ошибке (Notice).
  • передача по ссылке во время вызова (то есть & добавляется не во время определения функции, а при вызове). Считается устаревшим подходом с PHP 5.3, а в PHP5.4 вызывает фатальную ошибку.

Переменные функции

<?php

$func = 'foo'; $func('test');  // Вызовет foo('test');
$foo = new Foo(); 
$func='variable'; 
$foo->$func(); // Вызовет $foo->variable();
  • если к имени переменной добавить круглые скобки, то PHP будет искать функцию с тем именем, которое заложено в значении этой переменной.
  • применяется для реализации функций обратного вызова.
  • Такие функции не работают с языковыми конструкциями как echo, print, unset(), isset(), empty(), include, require и так далее. Используйте обертку для использования функций в таких конструкциях.

Неверно:

<?php

$x = function fund($a) {
    return $a;
};

print $x(1);

Анонимные функции (Лямбда функции) и замыкания

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

<?php

$greet = function($name) {
    printf("Hello %s\r\n", $name);
}; // завершающая точка с запятой НЕОБХОДИМА

$greet('World');
$greet('PHP');

В анонимных функциях допускается использование func_num_args(), func_get_args() и func_get_arg(). Используйте is_callable($ab), чтобы проверить является ли $ab анонимной функцией.

create_function() применяется для создания анонимных функций в PHP. Эта функция генерирует случайное имя для функции и возвращает его в качестве строки.

<?php
$foo = create_function('$x,$y', 'return $x*$y;'); 
// должны быть одинарные кавычки экранированы в двойные кавычки, в противном случае переменные будут вычисляться

echo $foo(10, 20);

Замыкание в программировании — функция, в теле которой присутствуют ссылки на переменные, объявленные вне тела этой функции в окружающем коде и не являющиеся её параметрами.

В PHP5.3.0 был включен final класс Closure. Он применяется для внутренней реализации анонимных функций. Класс включает в себе конструктор, запрещающий ручное создание объекта (вызывает E_RECOVERABLE_ERROR) и метод __invoke, реализующий магический вызов. Замыкание наследует переменные из родительской области видимости.

<?php

// определяется в классе Cart публичная функция getTotal($tax)
// use ($tax, &$total) - доступ к переменным из родительского контекста
$callback = function ($quantity, $product) use ($tax, &$total) {
    $pricePerItem = constant(__CLASS__ . "::PRICE_" .strtoupper($product));
    $total += ($pricePerItem * $quantity) * ($tax + 1.0);
};

array_walk($this->products, $callback);

Комментарии

0
Войти
Комментариев нет.
Войдите чтобы оставлять комментарии.