http://sulfurzona.ru/
News
Service
Magazine
Software (Battle City Game, Wallpaper manager, Superpad, VG-NOW, Puzzle Game, Netler Internet Browser, ..)
Wing-Thunder Game (fly simulator)
Dune Game (Dune III, Dune IV, Cheats, Forum, ..)
Games free
Turbo Pascal (Assembler, Docs, Sources, Debbugers, ..)
Books (Docs for developers)
Guest book
Компьютерная диагностика двигателя автомобиля (адаптер К-линии)Компьютерная диагностика двигателя автомобиля (адаптер К-линии)
 
 
Скачать игру Крыло-Гром (Wing-Thunder) бесплатно
 
 

PHP и WEB для новичков (часть 5)

 
Автор: Владислав Демьянишин
 
PHP и WEB для новичков

Оператор варианта. Функции. Конструкция включений include

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

Оператор варианта switch()

 
Ранее мы рассматривали проверку нескольких условий при помощи конструкции if()..elseif()..else.. Оператор варианта switch() - это более наглядный способ выполнить те же действия. Сначала ознакомимся с общей схемой работы switch():
 
switch(переменная){
case значение1: оператор1; break;
case значение2: оператор2: break;
...
default: оператор3;
}
 
Оператор switch проверяет, равна ли переменная каждому из значений, указанных после служебного слова case. Если равна, то выполняется соответствующий оператор.
Если переменная не совпала ни с одним значением, то выполняется оператор, идущий после служебного слова default. Если в default нет необходимости, то его можно опустить. Пример:
 
<?
$fruits = array("яблоко", "маракуйя", "груша", "банан", "апельсин", "папайя");
 
foreach($fruits as $f){
echo "цвет фрукта $f: ";
  switch($f){
   case "яблоко": echo "зеленый"; break;
   case "груша":
   case "банан": echo "желтый"; break;
   case "апельсин": echo "оранжевый"; break;
   default: echo "нет данных о цвете данного фрукта";
  }
  echo "<br />n";
}
?>
 
Пример выдаст следующий результат:
 
цвет фрукта яблоко: зеленый
цвет фрукта маракуйя: нет данных о цвете данного фрукта
цвет фрукта груша: желтый
цвет фрукта банан: желтый
цвет фрукта апельсин: оранжевый
цвет фрукта папайя: нет данных о цвете данного фрукта
 
Тем самым мы определили в операторе switch() цвета всех известных нам фруктов и записали их как операторы после слова case. Обратите внимание, как в скрипте определены фрукты, которые имеют одинаковый цвет - груша и банан.
После case "груша" нет оператора, а следует сразу case "банан". Так можно задавать реакцию switch() на несколько значений, которые должны вызывать одинаковую реакцию. После default мы указываем, что выводить, если переменная $f будет иметь непредусмотренное в операторе варианта значение.
 
Распространенной ошибкой является неуказанный break после оператора. Это не приведет к явной ошибке при выполнении скрипта, но может вызвать непонятные на первый взгляд последствия. Рассмотрим в качестве примера тот же самый скрипт, в котором "забудем" указать один break:
 
<?
$fruits = array("яблоко", "маракуйя", "груша", "банан", "апельсин", "папайя");
 
foreach($fruits as $f){
echo "цвет фрукта $f: ";
  switch($f){
   case "яблоко": echo "зеленый"; break;
   case "груша":
   case "банан": echo "желтый";
   case "апельсин": echo "оранжевый"; break;
   default: echo "нет данных о цвете данного фрукта";
  }
  echo "<br />n";
}
?>
 
и вот какой результат мы получим:
 
цвет фрукта яблоко: зеленый
цвет фрукта маракуйя: нет данных о цвете данного фрукта
цвет фрукта груша: желтыйоранжевый
цвет фрукта банан: желтыйоранжевый
цвет фрукта апельсин: оранжевый
цвет фрукта папайя: нет данных о цвете данного фрукта
 
Что же получается в данном случае? Оператор switch() просматривает значения после case одно за другим. Как только встречается значение, совпадающее со значением переменной, начинают выполняться все операторы до первого попавшегося break, несмотря на следующие case. Это сделано для того, чтобы можно было задавать несколько значений.
 
Замечу, что при такой схеме нет необходимости в составных операторах {}, потому что нет ограничения на количество операторов после case. Важно лишь то, что последним из них будет break.
Тогда как в конструкциях if(), while(), for(), согласно синтаксису, после if(), while(), for() идет один оператор, и чтобы выполнить несколько операторов, необходимо их объединять фигурными скобками.
Тут такой необходимости нет - выполняются все операторы от case и до break. Оператор break выполняет ту же самую функцию, что и в циклах while(), for(), foreach() - прекращение выполнения.
 

Функции. Операторы return и global

Ранее в некоторых примерах мы уже рассматривали кое-какие функции, например, strlen(), substr() и др. Основная цель функций упростить написание сложного кода.
Осуществляется это так: некоторую часть кода выносят в отдельный блок (тело функции), дают ему имя (т.е. объявляют функцию), а потом в случае необходимости вызывают эту функцию по имени. При вызове просто выполняется код тела функции. Пример:
 
<?
// Объявляем собственную функцию
function print_hello() {
   echo "Hello";
}
 
// Вызываем (выполняем) функцию
print_hello();
?>
 
Этот простейший пример иллюстрирует:
function - ключевое слово, с которого начинается описание (объявление) пользовательской функции;
print_hello - имя функции;
( ) - круглые скобки должны содержать список входных параметров (аргументов), перечисленных через запятую, и всегда указываются, даже в тех случаях, когда функция не имеет параметров;
{ } - фигурные скобки отмечают тело функции и указываются всегда, даже если тело функции содержит всего один оператор или вовсе ничего не содержит;
print_hello(); - вызов функции всегда оформляется в виде имени функции и круглых скобок, внутри которых через запятую перечисляются параметры. Скобки указывается всегда, даже, если они пусты. Вызов функции приводит к непосредственному выполнению тела функции, т.е. напечатает строку "Hello".
 
Рассмотрим пример, когда функция имеет входные параметры и возвращает какое-то значение (результат). Если функция должна возвращать в точку вызова результат своей деятельности в виде какого-то значения, то используется оператор return.
 
<?
function increment($num) {
   return $num + 1;
}
 
$a = 10;
$b = increment($a);
echo $b;
?>
 
В этом примере объявлена функция increment(), принимающая один входной параметр, и возвращающая его значение, увеличенное на единицу. Т.е. в результате вызова данной функции к значению переменной $a будет прибавлена единица, и результат 11 будет записан в переменную $b.
 
Оператор return можно использовать не только для передачи результата в точку вызова функции, но и для выхода из тела функции, подобно оператору break в цикле, например:
 
<?
function check_password($login, $password) {
  if($login != "user") return;
  if($password != "pass") return;
  echo "логин и пароль верны.";
}
 
check_password("user", "pass");
?>
 
где функция check_password() проверяет, равняется ли параметр $login строке "user", а параметр $password строке "pass". Если нет, то срабатывает оператор return и выполняется немедленный выход из функции, а управление передается оператору, стоящему после вызова функции.
Если же оба оператора return не сработали, то функция выдаст строку "логин и пароль верны".
 

Видимость переменных в функции

Теперь несколько слов о видимости переменных в теле функции. При вызове функции, все указанные в качестве аргументов внешние переменные передают свои значения внутренним (локальным) переменным этой функции, указанным в ее описании. Такой параметр называют параметр-значение.
При этом внутренние переменные функции "видны" только внутри самой функции, и существуют только, пока выполняется тело этой функции. Любое изменение значения локальной переменной в теле функции никак не влияет на значение внешней переменной.
 
Все объявленные и используемые в функции переменные по умолчанию локальны для функции. Т.е., по умолчанию нет возможности изменить значение глобальной переменной в теле функции.
Если вы в теле пользовательской функции будете использовать переменную с именем, идентичным имени глобальной переменной (находящейся вне пользовательской функции), то никакого отношения к глобальной переменной эта локальная переменная иметь не будет.
 
В данной ситуации в пользовательской функции будет создана локальная переменная с именем, идентичным имени глобальной переменной, но доступна данная локальная переменная будет только внутри этой функции.
Поясню данный факт на конкретном примере:
 
<?
$a = 200;
 
function my_func() {
  $a = 170;
  echo "<h3>$a</h3>";
}
 
my_func();
echo "<h3>$a</h3>";
?>
 
Сценарий выведет 170, а затем 200:
Для избавления от приведенного недостатка, в PHP существует специальная инструкция global, позволяющая пользовательской функции работать с глобальными переменными. Рассмотрим данный принцип на конкретных примерах:
 
<?
$a = 1;
$b = 2;
 
function my_sum() {
  global $a, $b;
  $b = $a + $b;
}
 
my_sum();
echo $b;
?>
 
Вышеприведенный скрипт выведет "3". После определения $a и $b внутри функции как global все ссылки на любую из этих переменных будут указывать на их глобальную версию.
Любое изменение этих переменных внутри функции отразится на состоянии этих глобальных переменных. Не существует никаких ограничений на количество глобальных переменных, которые могут обрабатываться пользовательскими функциями.
Второй способ доступа к переменным глобальной области видимости - использование специального, определяемого в PHP массива $GLOBALS. С использованием $GLOBALS вместо global предыдущий пример может быть переписан так:
 
<?
$a = 1;
$b = 2;
 
function my_sum() {
  $GLOBALS["b"] = $GLOBALS["a"] + $GLOBALS["b"];
}
 
my_sum();
echo $b;
?>
 
$GLOBALS - это ассоциативный массив, ключом которого является имя, а значением - содержимое глобальной переменной. Обратите внимание, что $GLOBALS существует в любой области видимости. Это объясняется тем, что этот массив является суперглобальным. Ниже приведен пример, демонстрирующий возможности суперглобальных переменных:
 
<?
function test_global() {
 
  // Большинство предопределенных переменных не являются
  // "супер" и чтобы быть доступными в локальной области
  // видимости функции требуют указания 'global'.
  global $HTTP_POST_VARS;
 
  echo $HTTP_POST_VARS['name'];
 
  // Суперглобальные переменные доступны в любой области
  // видимости и не требуют указания 'global'.
  // Суперглобальные переменные доступны, начиная с PHP 4.1.0
  echo $_POST['name'];
}
?>
 

Параметр-переменная

Параметр-переменная - это способ, передачи фактического параметра с обратной связью, его еще называют передачей параметра по ссылке.
Такой способ позволяет манипулировать значениями внешних переменных, указанных в вызове функции, как с локальными переменными, но все изменения значений этих якобы локальных переменных приведут к изменению значений соответствующих внешних переменных.
Таким образом, описывая функцию, можно сделать так, чтобы она возвращала в точку вызова результат, а то и несколько результатов одновременно.
 
<?
function increment(&$num) {
  $num ++;
}
 
$a = 10;
increment($a);
echo $a;
?>
 
Выдаст число 11. Обратите внимание на уже похожий код. Но в данном случае мы никакого возврата значения оператором return не выполняем. При этом входной параметр функции предваряем символом "&" (коммерческое "И"), что позволяет отождествлять локальную переменную $num с внешней переменной, указанной в качестве аргумента нашей функции. В результате выполнения функции будет изменено значение переменной $a. В итоге получили код, компактнее, чем аналогичный выше.
 

Вложенные вызовы. Рекурсия

Помимо этого, функция может вызывать другие функции, например
 
<?
function add_str($str) {
  return $str." my friends!";
}
 
function print_bold($str) {
  echo "<b>".add_str($str)."</b>n";
}
 
echo print_bold("Hello");
?>
 
В данном примере объявлены две функции, первая add_str() дописывает в конец полученного параметра строку " my friends!" и возвращает результат в точку вызова, а вторая print_bold() печатает строку, указанную в качестве параметра, заключив ее в теги жирного текста.
Если функция может вызывать другую функцию, то ничего ей не мешает сделать вызов самой себя. Такой прием называют рекурсией. Например, так можно написать функцию для расчета числа в N-степени (число в квадрате, в кубе, ...):
 
<?
function power($num, $p) {
  if(!$p) return 1; // любое число в степени 0 равно единице
  return $num * power($num, $p-1);
}
 
for($i=0; $i<=10; $i++){
  echo "2<sup>$i</sup> = ";
  echo power(2, $i)."<br />n";
 }
?>
 
тогда получим степени числа 2 от 0 до 10:
 
20 = 1
21 = 2
22 = 4
23 = 8
24 = 16
25 = 32
26 = 64
27 = 128
28 = 256
29 = 512
210 = 1024
 
Рекурсия может быть несколько сложной для восприятия, однако это весьма удобное свойство функций, позволяющее в компактном коде решать такие задачи, как вычисление факториала числа или нахождение определителя матрицы MxN. Применяя рекурсивные вызовы, следует быть осторожным.
 

Функции include, require

Часто возникает необходимость использования большого числа уже написанных скриптов в одном проекте. Аналогично несколько скриптов могут использовать некоторые функции, которые уже описаны в каком-то другом скрипте.
Разумеется, что такие популярные функции не имеет смысла снова и снова объявлять в каждом скрипте, где они используются. Поэтому логичнее такие популярные функции собрать в одном скрипте (библиотеке), а потом включить этот скрипт в другие скрипты при помощи стандартной функции include.
 
Например, в нашем проекте используются арифметические пользовательские функции plus_one() и minus_one(), которые увеличивают и уменьшают аргумент на единицу соответственно. Выделим эти функции в отдельный файл скрипта с именем functions.php (можно и в functions.inc, чтобы библиотека отличалась от самостоятельных скриптов):
 
<?
function plus_one($n) {
  return $n + 1;
}
 
function minus_one($n) {
  return $n - 1;
}
?>
 
Теперь напишем скрипт с именем test.php, в котором будут использоваться функции из выше описанного скрипта:
 
<?
include("functions.php"); // указываем относительный путь к файлу подключаемого скрипта
 
echo plus_one(1) + minus_one(2);
?>
 
Следует отметить, что сложный проект имеет большое количество скриптов, которые включаются один в другой при помощи функции include. Предположим, что скрипт B использует функции из скрипта A, а скрипт C использует функции из скрипта A и B. Тогда, если в скрипте C написать
 
include("a.php");
include("b.php");
 
то может возникнуть ситуация, когда скрипт A будет включен в скрипт C дважды. А это приведет к тому, что в вызове include("b.php"); будет выполнена попытка объявить функции с именами, которые уже были объявлены ранее в вызове include("a.php"); поскольку скрипт B тоже подключает скрипт А.
 
А это уже ошибка, поскольку имена функций должны быть уникальны в пределах выполняемого скрипта. Для таких случаев существует функция include_once(), которую можно использовать вместо include и тогда можно быть уверенным, что каждый подключаемый скрипт будет включен всего один раз.
 
Кроме include() есть функция require(). Ее действие похоже на include() за исключением того, что в случае подключения несуществующего скрипта (например, по указанному пути файл скрипта отсутствует) функция include() выдаст сообщение об ошибке и продолжит выполнение скрипта, а функция require() выдаст сообщение об ошибке и прекратит выполнение этого скрипта.
 
Это необходимо, когда включаются жизненно необходимые скрипты, например, функции, проверяющие логин и пароль пользователя для доступа в защищенную зону сайта - если этот скрипт не найден, то не имеет смысла генерировать веб-страницу.
Функция require() тоже имеет вариант require_once() для включения скрипта лишь один раз.
 
Продолжение следует…
 
© Владислав Демьянишин
 
На нашем сайте можно не только бесплатно скачать игры, но и документацию и книги по программированию на MIDLetPascal, Turbo Pascal 6, Turbo Pascal 7, Borland Pascal, по программированию устройств Sound Blaster, Adlib, VESA BIOS, справочник Norton Guide и много другой полезной информации для программистов, включая примеры решения реальных задач по созданию резидентных программ.
 

Журнал > Программирование > PHP и WEB для новичков (HTML, JavaScript, PHP, MySQL) > PHP и WEB для новичков (часть 5): Оператор варианта. Функции. Конструкция включений include
 
 
 
 
 
 
На главную страницу На предыдущую страницу На начало страницы