Druzya.org
Возьмемся за руки, Друзья...
 
 
Наши Друзья

Александр Градский
Мемориальный сайт Дольфи. 
				  Светлой памяти детей,
				  погибших  1 июня 2001 года, 
				  а также всем жертвам теракта возле 
				 Тель-Авивского Дельфинариума посвящается...

 
liveinternet.ru: показано количество просмотров и посетителей

Библиотека :: Компьютеры и Программирование :: Котеров Д. В. - Самоучитель PHP 4
<<-[Весь Текст]
Страница: из 287
 <<-
 
function MyChOwn($fname,$attr) 
{ return chown($fname,$attr); 
} 
} 
Это — один из примеров условно определяемых функций. Если мы работаем под 
Windows, функция MyChOwn() ничего не делает и возвращает 1 как индикатор успе- 
ха, в то время как для Unix она просто вызывает оригинальную chown(). Важно то, 

что проверка, какую функцию использовать, производится только один раз (в 
момент 
прохождения точки определения функции), т. е. здесь нет ни малейшей потери 
произ- 
водительности. Теперь в сценарии мы должны всюду отказаться от chown() и ис- 
пользовать MyChOwn() (можно даже провести поиск/замену этого имени в редакто- 
ре) — это обеспечит переносимость. 
Если вам совсем не нравится идея поиска/замены (а мне она не нравится 
категориче- 
ски), то существует гораздо более элегантный способ, но только в том случае, 
если 
chown() еще не была нигде определена — в том числе и среди стандартных функ- 
ций: 
if(!function_exists("chown")) 
{ function chown($fname,$mode) 
{ // не делаем ничего 
return 1; 
} 
} 
Этот способ работает независимо от того, появится ли вдруг в будущих версиях 
PHP 
для Windows "заглушка" для функции chown(), или же нет. (Нужно сказать для 
спра- 
ведливости, что в PHP версии 4 такая заглушка уже существует.) 
Знатоки Си могут заметить в приеме условно определяемых функций разительное 
сходство с директивами условной компиляции этого языка: #ifndef, #else и 
#endif. Действительно, аналогия почти полная, за исключением того факта, что в 
Си 

Часть III. Основы языка PHP 198 
эти директивы обрабатываются во время компиляции, а в PHP — во время выполне- 
ния. Что ж, на то он и интерпретатор, чтобы позволять себе интерпретацию. 
То, что возможно создавать условно определяемые функции, сильно подрыва- 
ет веру в PHP как в истинный транслятор. Как вообще можно устроить транс- 
лятор так, чтобы он правильно обрабатывал подобные вещи? Я не знаю. На- 
деюсь, что разработчики PHP нашли-таки способ, и условно определяемые 
функции транслируются вместе со всей программой, а не на этапе исполнения, 
как это было в PHP версии 3. Однако полной уверенности в этом нет, а доку- 
ментация по этому поводу молчит (пока). 
Передача функций "по ссылке" 
Я отнюдь не случайно заключил последние два слова названия этого раздела в ка- 
вычки — дело в том, что как таковая, передача функции по ссылке в 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(), должна 
иметь два аргумента, которые являются сравниваемыми значениями в массиве. 
В общем случае, фун
 
<<-[Весь Текст]
Страница: из 287
 <<-