Опубликован: 01.03.2005 | Уровень: для всех | Доступ: платный
Лекция 5:

Функции в PHP

< Лекция 4 || Лекция 5: 123456 || Лекция 6 >

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

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

<?
/* создадим две простые функции: 
Add_sign – добавляет подпись к строке и
Show_text – выводит строку текста */

function Add_sign($string, 
   $sign="С уважением, Петр"){
   echo $string ." ".$sign;
}
function Show_text(){
  echo "Отправить сообщение по почте<br>";
}
$func = "Show_text"; 
   // создаем переменную со значением,
   // равным имени функции Show_text
$func(); 
   // это вызовет функцию Show_text
$func = "Add_sign";  
   // создаем переменную со значением,
   // равным имени функции Add_sign
$func("Привет всем <br>"); 
   // это вызовет функцию
   // Add_sign с параметром "Привет всем"
?>
Пример 5.11. Использование переменных функций

В этом примере функция Show_text просто выводит строку текста. Казалось бы, зачем для этого создавать отдельную функцию, если существует специальная функция echo(). Дело в том, что такие функции, как echo(), print(), unset(), include() и т.п. нельзя использовать в качестве переменных функций. То есть если мы напишем:

<?
$func = "echo ";
$func("TEXT");
?>

то интерпретатор выведет ошибку:

Fatal error: Call to undefined function: 
    echo() in
c:\users\nina\tasks\func\var_f.php on line 2

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

Внутренние (встроенные) функции

Говоря о функциях, определяемых пользователем, все же нельзя не сказать пару слов о встроенных функциях. С некоторыми из встроенных функций, такими как echo(), print(), date(), include(), мы уже познакомились. На самом деле все перечисленные функции, кроме date(), являются языковыми конструкциями. Они входят в ядро PHP и не требуют никаких дополнительных настроек и модулей. Функция date() тоже входит в состав ядра PHP и не требует настроек. Но есть и функции, для работы с которыми нужно установить различные библиотеки и подключить соответствующий модуль. Например, для использования функций работы с базой данных MySql следует скомпилировать PHP с поддержкой этого расширения. В последнее время наиболее распространенные расширения и соответственно их функции изначально включают в состав PHP так, чтобы с ними можно работать без каких бы то ни было дополнительных настроек интерпретатора.

Решение задачи

Напомним, в чем состоит задача. Мы хотим написать интерфейс, который позволял бы создавать html-формы. Пользователь выбирает, какие элементы и в каком количестве нужно создать, придумывает им названия, а наша программа сама генерирует требуемую форму.

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

<form action="ask_names.php">
Создать элемент "строка ввода текста": <input
  type=checkbox name=types[] 
  value=string><br>
Количество элементов: <input type=text 
  name=numbers[string]
  size=3><br>
<br>
Создать элемент "текстовая область": <input
  type=checkbox
  name=types[] value=text><br>
Количество элементов: <input type=text 
  name=numbers[text]
  size=3><br>
<input type=submit value="Создать">
</form>
Листинг 5.12. task_form.html

Когда мы пишем в имени элемента формы, например types[], это значит, что его имя – следующий элемент массива types. То есть у нас первый элемент формы ( "строка ввода текста" ) будет иметь имя types[0], а второй (текстовая область) – types[1]. В браузере task_form.html будет выглядеть примерно так:

Форма для выбора создаваемых элементов и их количества

Рис. 5.1. Форма для выбора создаваемых элементов и их количества

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

<?
$file = "task.php"; 
/* файл, который будет обрабатывать
сгенерированную этим скриптом форму */

function Ask_names(){ 
   // функция генерирует форму для
   // ввода названий элементов ввода

global $file; 
   //объявляем, что хотим использовать эту
   // переменную, заданную вне функции
if (isset($_GET["types"])){
  $st = '<form action="'.$file.'">';
  foreach ($_GET["types"] as $k => $type){
/* перебираем все типы элементов, 
   которые нужно создать */
  
  $num = $_GET["numbers"][$type]; 
     // сколько элементов каждого типа нужно
  for ($i=1;$i<=$num;$i++){ 
     // создаем $num строк для ввода
    $st.= "Введите имя $i-го элемента типа $type: ";
    $st.= "<input type=text name=names[$type][]><br>";
  }
  // сохраняем тип и число необходимых 
  // элементов ввода этого типа
  $st.= "<input type=hidden name=types[] value=$type>";
  $st.= "<input type=hidden name=numbers[] value=$num><br>";
}
  $st .= "<input type=submit name=send value=send></form>";
return $st; 
   // в переменной $st содержится код формы
   // для запроса имен
} else echo "Select type";
}
echo Ask_names(); 
   // вызываем функцию и выводим
   // результаты ее работы
?>
Листинг 5.13. ask_names.php

Допустим, нужно создать два элемента типа "текстовая строка" и один элемент типа "текстовая область", как и отмечено в форме выше. Тогда скрипт ask_names.php обработает ее таким образом, что мы получим такую форму:

Форма для ввода названий создаваемых элементов

Рис. 5.2. Форма для ввода названий создаваемых элементов

Введем в эту форму, например, строки "Название", "Автор" и "Краткое содержание". Эти данные будет обрабатывать скрипт task.php.

<?
$show_file = "task_show.php"; 
/* файл, который будет обрабатывать данные
   созданной этим файлом формы */

function Create_element($type,$name){ 
   // функция создает элемент ввода 
   // по типу и названию
  $str="";
  switch($type){
  case "string":
    $str .= "$name: <input type=text name=string[]><br>";
  break;
  case "text":
    $str .= "$name: <textarea name=text[]></textarea><br>";
  break;
  }
return $str;
}
function Create_form(){ 
    // функция создает форму
    // с нужными элементами
global $show_file;
  $str = '<form action="'.$show_file.'">';
  foreach ($_GET["types"] as $k => $type){ 
  // перебираем типы элементов
    $num = $_GET["numbers"][$k]; 
	// число элементов этого типа
    
	for ($i=1;$i<=$num;$i++){
      $arr = $_GET["names"][$type][$i-1]; 
	  // имя создаваемого элемента
      
	  $str .= Create_element($type,$arr); 
	  // вызываем функцию для 
	  // создания элемента
    }
  }
  $str .= "<input type=submit value=send></form>";
echo $str;
}
$crt = "Create_form";
$crt(); // вызываем функцию создания 
        // формы Create_form
?>
Листинг 5.14. task.php

Результатом работы этого скрипта с входными данными, приведенными выше, будет следующая форма:

Пример формы, сгенерированной нашей программой

Рис. 5.3. Пример формы, сгенерированной нашей программой

Заключение

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

< Лекция 4 || Лекция 5: 123456 || Лекция 6 >
Федор Антонов
Федор Антонов

Здравствуйте!

Записался на ваш курс, но не понимаю как произвести оплату.

Надо ли писать заявление и, если да, то куда отправлять?

как я получу диплом о профессиональной переподготовке?

Сергей Крупко
Сергей Крупко

Добрый день.

Я сейчас прохожу курс  повышения квалификации  - "Профессиональное веб-программирование". Мне нужно получить диплом по этому курсу. Я так полагаю нужно его оплатить чтобы получить диплом о повышении квалификации. Как мне оплатить этот курс?

 

Данила Некрасов
Данила Некрасов
Россия, Пермь, ПНИПУ
Сергей Федоров
Сергей Федоров
Россия