Главная > Программирование > РНР: настольная книга программиста
<< Предыдущий параграф
Следующий параграф >>
<< Предыдущий параграф Следующий параграф >>
Макеты страниц

Глава 14. Базовые концепции функций в PHP

Программисты всегда стремились к простоте и понятности кода. Умение осуществлять разнообразные операции с функциями, а в частности понимать принципы и способы взаимодействия функций с переменными, позволит не только создавать лаконичные PHP-скрипты, но и получить максимально возможную производительность вашего скрипта. Это же в свою очередь приведет к быстрой обработке данных и выведению требуемого результата в окне браузера. Более подробно о функциях РНР вы узнаете из этой главы. Если вы уже знакомы с ними, то просто пропустите ее. В главе рассматриваются следующие вопросы:

• определяемые пользователем функции;

• переменныефункции;

• возвращение результатов;

• аргументы функции;

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

• значения переменных по умолчанию;

• оператор old_function;

• списки аргументов переменной длины.

14.1. Определяемые пользователем функции

Функция может быть объявлена так:

function foo ($arg_1, $arg_2, ..., $arg_n) {

    echo "Пример функции.\n" ;

    return $retval;

}

Соответственно, внутри функции может быть любой верный код РНР, возможно объявление другой функции или класса.

14.2. Переменные функции в PHP

РНР поддерживает так называемые переменные функции. Этот термин означает, что если вы добавите к своей функции имя переменной в скобках, то РНР будет искать функцию с именем, равным значению этой переменной, и предпримет попытку ее выполнить. Это можно использовать для реализации обратных вызовов, таблиц функций и т. д.

Пример 14.1. Переменная функция

<?php

function foo() {

    echo "In foo()<br>\n";

}

function bar( $arg = '' ) {

    echo "In bar(); argument was '$arg'.<br>\n";

}

$func = 'foo';

$func ();

$func = 'bar';

$func( 'test' );

?>

Результат выполнения программы представлен на рис. 14.1.

Рис. 14.1. Результат выполнения скрипта

14.3. Возвращение результатов функциями

Результаты возвращаются через необязательный оператор return. Возвращаемый результат может быть любого типа, включая списки и объекты. Например:

function my_sqrt ($num) {

    return $num * $num;

}

echo my_sqrt (4); // outputs '16'.

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

function foo () {

    return array (0, 1,2);

}

list ($zero, $one, $two) = foo();

Чтобы функция возвращала ссылку, следует использовать оператор ссылки & в объявлении функции и при присвоении возвращаемого значения переменной, например:

function {

    return $someref;

}

$newref = &returns__reference();

14.4. Аргументы функции

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

В ГОР можно передавать аргументы по ссылке, передача по значению осуществляется по умолчанию. Списки аргументов переменной длины поддерживаются только в РНР 4 и выше. Аналогичного эффекта можно достичь в РНР 3, передавая в функцию массив аргументов, например:

function {

    echo "$input[0] + $input[1] = ", $input[0]+$input[1];

}

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

По умолчанию все аргументы функции передаются только по значению, но если вам понадобилось модифицировать аргументы в функции, то вы можете передать их по ссылке.

Если же вы хотите сделать так, чтобы аргумент всегда передавался по ссылке, то следует поставить знак & перед именем аргумента в объявлении функции. Например:

function foo ( &$bar ) {

    $bar . = 'and something extra.';

}

$str = 'This is a string.';

foo ($str);

echo $str; // выведет: 'This is a string, and something extra.'

Если вы хотите передать аргумент по ссылке в случае, когда по умолчанию такого не делается, то добавьте & перед именем аргумента в вызове функции, например:

function foo($bar) {

    $bar , = ' and something extra. ';

};

$str = 'This is a string. ';

foo($str);

echo $str; // выведет 'This is a string, '

foo(&$str);

echo $str; // выведет 'This is a string, and something extra.'

14.6. Значения переменных по умолчанию

Функции могут определять значения по умолчанию для скалярных аргументов, как и в языке программирования C++. Например:

function makecoffee($type = "cappucino") {

    echo "Making a cup of $type.\n";

}

echo makecoffee();

echo makecoffee("espresso");

В результате будет выведено:

Making a cup of cappucino.

Making a cup of espresso.

Значение по умолчанию должно быть константой, а не переменной или, к примеру, членом класса.


ВНИМАНИЕ

Аргументы, объявленные по умолчанию, обязательно должны быть расположены справа от всех аргументов, объявленных другим методом, в противном случае это не будет работать так, как задумано.


Рассмотрим пример:

function makeyogurt($type = "acidophilus", $f!avour) {

    return "Making a bowl of $type $flavour.\n";

}

echo makeyogurt ("raspberry") ; // не будет работать, как ожидалось

Этот пример выведет следующее:

Warning: Missing argument 2 in call to makeyogurt() in /usr/local/etc/httpd/htdocs/php3test/functest.html on line 41

Making a bowl of raspberry.

А теперь сравните с этим:

function makeyogurt ($flavour, $type = "acidophilus") {

    return "Making a bowl of $type $flavour.\n";

}

echo makeyogurt ("raspberry") ; // а вот это работает

Результат программы:

Making a bowl of acidophilus raspberry.

14.7. Оператор old_function

Оператор old_function позволяет вам определять функцию, используя синтаксис PHP/FI2 (за исключением того, что вы должны заменить function на old_function).

Это свойство используется только для совместимости и лишь конверторами PHP/FI2 -> РНР 3.

Описанные таким образом функции никак не могут быть вызваны из служебного кода РНР. Это значит, что вы не можете использовать их в функциях типа usort(), array_walk() и register_shutdown_function(). Но вы можете обойти это путем введения специальной функции в терминах РНР 3, которая будет вызывать old_function.

14.8. Списки аргументов переменной длины

В PHP 4 имеется поддержка списков аргументов переменной длины в пользовательских функциях. С помощью функций func_num_args(), func_get_arg() и func_get_args() этого очень легко достичь. Не требуется никакого специального синтаксиса, списки аргументов могут по-прежнему явно задаваться в определении функции и будут нормально работать.

Заключение

Рассмотренная нами глава 14 «Базовые концепции функции» включает способы задания функций, а также принципы работы. Для систематизации материала выделим следующие концепции.

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

• Переменные функции. Они, как и в первом случае, создаютсяпользователем, но несут другой смысл. Это значит, что если вы к фукнции добавите имя переменной в скобках, то РНР будет искать функцию с именем, равным значению этой переменной, и предпримет попытку ее выполнить.

• Возвращение результата. В зависимостиоттого, как вы производите задание функции и непосредственно операций, выполняемых в этой функции, вы будете получать необходимый вам результат. Будьте предельно внимательны, так как при работе с функциями, как и с классами, очень часто возникают ошибки по причине не донца осмысленного представления работы функции при возврате результата.

<< Предыдущий параграф Следующий параграф >>
Оглавление