САМОУЧИТЕЛЬ PHP 4


Передача функций "по ссылке"


Я отнюдь не случайно заключил последние два слова названия этого раздела в кавычки — дело в том, что как таковая, передача функции по ссылке в PHP не поддерживается. Однако, т. к. это слишком часто может быть полезным, в PHP есть понятие "функциональной переменной". Легче всего его можно рассмотреть на примерах:

function A($i) { echo "a $i\n"; }

function B($i) { echo "b $i\n"; }

function C($i) { echo "c $i\n"; }

$F="A";  // èëè $F="B" èëè $F="C"

$F(10);  // âûçîâ ôóíêöèè, èìÿ êîòîðîé õðàíèòñÿ â $F

Второй пример носит довольно прикладной характер. В PHP есть такая стандартная функция — uasort(), которая сортирует ассоциативный массив, заданный ее первым параметром, причем критерием сравнения для элементов этого массива служит функция, имя которой передано вторым параметром. Мы уже рассматривали эту функцию в предыдущей главе, но я еще раз приведу простой пример:

// Ñðàâíåíèå áåç ó÷åòà ðåãèñòðà ñèìâîëîâ ñòðîê

function FCmp($a,$b)

{ return strcmp(tolower($a),tolower($b))

}

$a=array("b"=>"bbb", "a"=>"Aaa", "d"=>"ddd);

uasort($a,"FCmp"); // Сортировка без учета регистра символов

Здесь функция, имя которой получено со вторым параметром uasort(), должна иметь два аргумента, которые являются сравниваемыми значениями в массиве.

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



Содержание раздела