Технологии применения. Примеры программ
Что такое РНР?
РНР — это серверный язык создания сценариев (или стороны сервера), разработанный специально для Web. В HTML-страницу можно внедрить код РНР, который будет выполняться при каждом ее посещении. Код РНР интерпретируется Web-сервером и генерирует HTML или иной вывод, наблюдаемый посетителем страницы.
Разработка РНР была начата в 1994 г. и вначале выполнялась одним человеком, Расмусом Лердорфом (Rasmus Lerdorf). Этот язык был принят рядом талантливых людей и претерпел три основных редакции, пока не стал широко используемым и зрелым продуктом, с которым мы имеем дело сегодня. К январю 2001 г. он использовался почти в пяти миллионах доменов во всем мире и их число продолжает быстро расти. Количество доменов, в которых в настоящее время используется РНР, можно выяснить на странице http://www.php.net/ usage.php. РНР — это продукт с открытым исходным кодом (Open Source). У пользователя имеется доступ к исходному коду. Его можно использовать, изменять и свободно распространять другим пользователям или организациям.
Первоначально РНР являлось сокращением от Personal Home Page (Персональная начальная страница), но затем это название было изменено в соответствии с рекурсивным соглашением по наименованию GNU (GNU = Gnu's Not Unix) и теперь означает РНР Hypertext Preprocessor (Препроцессор гипертекста РНР).
В настоящее время основной версией РНР является четвертая. Адрес начальной страницы для РНР — http://www.php.net
Что нового в РНР 4?Имеется ряд важных усовершенствований 4 версии:
· РНР 4 работает значительно быстрее предшествующих версий, поскольку в нем используется новый механизм Zend Engine. Если требуется еще более высокая производительность, по адресу http://www.zend.com можно получить модули Zend Optimizer, Zend Cache или Zend Compiler.
· РНР всегда можно было использовать как эффективный модуль сервера Apache. С появлением новой версии РНР можно устанавливать и в виде модуля ISAPI для Internet Information Server компании Microsoft.
· Теперь поддержка сеансов является встроенной. В предшествующих версиях для управления сеансом или создания собственного сеанса требовалось устанавливать дополнительный модуль PHPLib.
Некоторые преимущества РНР.К числу конкурентов РНР относятся Perl, Active Server Pages (ASP) от Microsoft, Java Server Pages (JSP) и Allaire Cold Fusion.
РНР обладает множеством преимуществ по сравнению с этими продуктами:
• Высокая производительность
• Наличие интерфейсов ко многим различным системам баз данных
• Встроенные библиотеки для выполнения многих общих задач, связанных с Web
• Низкая стоимость
• Простота изучения и использования
• Переместимость
• Доступность исходного кода
Производительность.РНР исключительно эффективен. Используя единственный недорогой сервер, можно обслуживать миллионы обращений в день. Результаты тестирования, опубликованные компанией Zend Technologies (http://www.zend.com), подтверждают более высокую производительность РНР по сравнению с конкурирующими продуктами.
Интеграция с базами данных.РНР обладает встроенной связностью со многими системами баз данных. В дополнение к MySQL, в числе прочих можно непосредственно подключаться к базам данных PostgreSQL, mSQL, Oracle, dbm, Hyperware, Informix, InterBase и Sybase.
Используя Open Database Connectivity Standard (Стандарт открытого интерфейса связи с базами данных, ODBC), можно подключаться к любой базе данных, для которых существует ODBC-драйвер. Это распространяется на продукты Microsoft и многих других компаний.
Встроенные библиотеки.Поскольку РНР был разработан для использования в Web, он имеет множество строенных функций для выполнения широкого разнообразия полезных, связанных с Web, задач. С его помощью можно "на лету" генерировать GIF-изображения, подключаться к другим сетевым службам, отправлять сообщения электронной почты, работать с cookie-наборам и генерировать PDF-документы посредством нескольких строк кода.
Стоимость.Пакет РНР является бесплатным. Наиболее новую версию можно в любой момент совершенно бесплатно выгрузить из http://www.php.net
Изучение РНР.Синтаксис РНР основывается на других языках программирования, в первую очередь на С и Perl, Если вы уже знакомы с С, Perl или С-подобным языком, таким как C++ или Java, то почти сразу сможете эффективно использовать РНР.
Переносимость.Пакет РНР можно использовать под управлением многих различных операционных систем. Код РНР можно создавать в среде таких бесплатных Unix-подобных операционных систем, как Linux и FreeBSD, коммерческих версий Unix типа Solaris и IRIX или различных версий Microsoft Windows. Как правило, программы будут работать без каких-либо изменений в различных средах с установленным РНР.
Исходный код.Пользователь имеет доступ к исходному коду РНР. В отличие от коммерческих закрытых программных продуктов, если нужно что-либо изменить или добавить в этом языке, то это всегда можно сделать. Не следует дожидаться, пока фирма-изготовитель выпустит правки (патчи). Нет необходимости беспокоиться о том, что изготовитель собирается покинуть рынок или перестанет поддерживать продукт.
Синтаксис и грамматика. Синтаксис PHP заимствован непосредственно из C. Java и Perl также повлияли на синтаксис данного языка.
Переход из HTML.Есть три способа выхода из HTML и перехода в "режим PHP кода":
1. <? echo("простейший способ, инструкция обработки SGML\n"); ?>
2. <?php echo("при работе с XML документами делайте так\n"); ?>
3. <script language="php">
echo ("некоторые редакторы (подобные FrontPage) не любят обрабатывающие инструкции");
</script>;
4. <% echo("От PHP 3.0.4 можно факультативно применять ASP-тэги"); %>
Разделение инструкций.Инструкции (утверждения) разделяются также как в C или Perl - точкой с запятой. Закрывающий тэг (?>) тоже подразумевает конец утверждения, поэтому следующие записи эквивалентны:
<php
echo "Это тест";
?>
<php echo "Это тест" ?>
Типы переменных.PHP поддерживает переменные следующих типов:
· integer - целое
· double - число с дробной частью
· string - строковая переменная
· array - массив
· object - объектная переменная
· pdfdoc - PDF-документ (только при наличии поддержки PDF)
· pdfinfo - PDF-инфо (только при наличии поддержки PDF)
Тип переменной обычно не устанавливается программистом; вместо этого, он определяется PHP во время выполнения программы, в зависимости от контекста, в котором она используется. Если вам нравится указывать тип переменной непосредственно, используйте для этого инструкцию cast либо функцию settype(), но учтите, что переменная может вести себя по-разному, в зависимости от того, какой тип определен для нее в данное время.
Инициализация переменной.Для инициализации переменной в PHP вы просто присваиваете ей значение. Для большинства переменных это именно так; для массивов и объектных переменных, однако, может использоваться несколько иной механизм.
Инициализация массивов.Массив может инициализироваться одним из двух способов: последовательным присвоением значений, или посредством конструкции array().
При последовательном добавлении значений в массив вы просто записываете значения элементов массива, используя пустой индекс. Каждое последующее значение будет добавляться в качестве последнего элемента массива.
$names[] = "Jill"; // $names[0] = "Jill"
$names[] = "Jack"; // $names[1] = "Jack"
Как в C и Perl, элементы массива нумеруются, начиная с 0, а не с 1.
Инициализация объектов.Для инициализации объектной переменной используйте новое предписание для сопоставления данного объекта объектной переменной.
class foo {
function do_foo () { echo "Doing foo."; }
}
$bar = new foo;
$bar -> do_foo ();
Область переменной.Областью переменной является контекст, внутри которого она определена. Обычно все переменные PHP имеют одну область. Однако, внутри функций определенных пользователем, представлена локальная область функции. Любая переменная, определенная внутри функции, по умолчанию ограничена локальной областью функции. Например:
$a = 1; /* глобальная область */
Function Test () {
echo $a; /* ссылка на переменную локальной области */
}
Test ();
Этот скрипт не выдаст что-либо на выходе, поскольку инструкция echo относится к локальной версии переменной $a, значение которой присваивается не внутри этой области. Вы можете заметить, что здесь имеется некоторое отличие от языка C, в том, что глобальные переменные в C автоматически действуют и внутри функций, если только они не переписываются локальными определениями. Это может вызвать некоторые проблемы, т.к. по неосторожности можно изменить глобальную переменную. В PHP глобальные переменные должны быть продекларированы глобально внутри функции, если предполагается их использование в данной функции. Например:
$a = 1;
$b = 2;
Function Sum () {
global $a, $b;
$b = $a + $b;
}
Sum ();
echo $b;
Этот скрипт выдаст значение "3". Поскольку $a и $b декларируются глобально внутри функции, ссылки на данные переменные трактуются как ссылки на их глобальные версии.
Вторым способом доступа к переменным из глобальной области является использование специального определяемого PHP массива $GLOBALS. При этом предыдущий пример может быть записан как:
$a = 1; $b = 2;
Function Sum () { $GLOBALS["b"] = $GLOBALS["a"] + $GLOBALS["b"]; }
Sum ();
echo $b;
Массив $GLOBALS является ассоциативным, в котором имя глобальной переменной является ключом, а значение этой переменной является значением элемента массива.
Другой важной характеристикой от области определения переменной является статическая переменная. Статическая переменная существует только в локальной области функции, но она не теряет своего значения, когда программа, при исполнении, покидает эту область. Рассмотрим следующий пример:
Function Test () {
$a = 0;
echo $a;
$a++;
}
Эта функция совершенно бесполезна практически, поскольку каждый раз при ее вызове она устанавливает $a в 0 и выводит "0". Выражение $a++ так же бесполезно, поскольку при выходе из функции переменная $a исчезает. Для придания дееспособности функции подсчета переменная $a декларируется как статическая:
Function Test () {
static $a = 0;
echo $a;
$a++;
}
Теперь при вызове функции Test() она будет выводить значение $a и увеличивать его.
Статические переменные также весьма существенны, когда функции вызываются рекурсивно. Рекурсивные функции - это те, которые вызывают сами себя. Составлять рекурсивную функцию нужно внимательно, т.к. при неправильном написании можно сделать рекурсию неопределенной. Вы должны быть уверены в адекватности способа прекращения рекурсии. Следующая простая функция рекурсивно считает до 10:
Function Test () {
static $count = 0;
$count++;
echo $count;
if ($count < 10) {
Test ();
}
$count--;
}
Изменяемые переменные.Иногда бывает удобно давать переменным изменяемые имена. Такие имена могут изменяться динамически. Обычная переменная устанавливается так:
$a = "hello";
Изменяемая переменная берет некое значение и обрабатывает его как имя переменной. В приведенном выше примере значение hello может быть использовано как имя переменной, посредством применения двух записанных подряд знаков доллара, т.е.:
$$a = "world";
С этой точки зрения, две переменных определены и сохранены в символьном дереве PHP: $a с содержимым "hello" и $hello с содержимым "world". Так, инструкция:
echo "$a ${$a}";
осуществляет то же самое, что и инструкция:
echo "$a $hello";
а именно, обе они выводят: hello world.
Чтобы использовать изменяемые переменные с массивами, решите проблему неоднозначности. Это означает, что если вы пишете $$a[1], то синтаксическому анализатору необходимо знать, имеете ли вы в виду использовать $a[1] как переменную, или вы предполагаете $$a как переменную, а [1] как индекс этой переменной. Синтаксис для разрешения неоднозначности такой: ${$a[1]} для первого случая и ${$a}[1] для второго.
Переменные вне PHP. HTML Формы (GET и POST)
Когда программой-обработчиком формы является PHP-скрипт, переменные этой формы автоматически доступны для данного скрипта PHP. Например, рассмотрим следующую форму:
<form action="foo.php" method="post">
Name: <input type="text" name="name"><br>
<input type="submit">
</form>
При активизации формы PHP создаст переменную $name, значением которой будет то содержимое, которое было введено в поле Name: данной формы.
PHP также воспринимает массивы в контексте переменных формы, но только одномерные. Вы можете, например, группировать взаимосвязанные переменные вместе или использовать это свойство для определения значений переменных при множественном выборе на входе:
<form action="array.php" method="post">
Name: <input type="text" name="personal[name]"><br>
Email: <input type="text" name="personal[email]"><br>
Beer: <br>
<select multiple name="beer[]">
<option value="warthog">Warthog
<option value="guinness">Guinness
</select>
<input type="submit">
</form>
Если PHP-атрибут track_vars включен, через установку конфигурации track_vars или директивой <?php_track_vars?>, тогда переменные, активизированные посредством методов POST или GET, будут также находиться в глобальных ассоциативных массивах $HTTP_POST_VARS и $HTTP_GET_VARS соответственно.
Имена переменных РИСУНКА АКТИВИЗАЦИИ.При активизации (запуске) формы можно использовать рисунок (изображение) вместо стандартной кнопки запуска:
<input type=image src="image.gif" name="sub">
Когда пользователь нажимает кнопку мыши где-либо над таким рисунком, сопровождающая форма передается на сервер с двумя дополнительными переменными, sub_x и sub_y. Они содержат координаты места нажатия кнопки мыши пользователем внутри данного рисунка. Можно отметить, что практически, реальные имена переменных, передаваемые браузером, содержат точку вместо символа подчеркивания, но PHP конвертирует точку в элемент подчеркивания (underscore) автоматически.
Переменные окружения.PHP автоматически создает переменные окружения, как и обычные переменные.
echo $HOME; /* Показывает переменную HOME, если она установлена.*/
Хотя при поступлении информации механизмы GET, POST и Cookie также автоматически создают переменные PHP, иногда лучше явным образом прочитать переменную окружения, для того чтобы быть уверенным в получении ее правильной версии. Для этого может использоваться функция getenv(). Для установки значения переменной окружения пользуйтесь функцией putenv().
Изменение типа.PHP не требует явного определения типа при объявлении переменной, тип переменной определяется по контексту в котором она используется. То есть, если вы присваиваете строковое значение переменной var, var становится строкой. Если затем присвоить переменной var значение целого (числа), то она станет целым.
Примером автоматического преобразования типа в PHP может служить оператор сложения '+'. Если какой-либо из операндов является числом с дробной частью (тип double), то затем все операнды оцениваются как double и результат будет иметь тип double. Иначе, эти операнды будут интерпретированы как целые (integers) и результат будет так же иметь тип integer. Отметим, что при этом НЕ меняются типы операндов, меняется только их оценка.
$foo = "0"; // $foo является строкой (ASCII 48)
$foo++; // $foo является строкой "1" (ASCII 49)
$foo += 1; // $foo сейчас является целым (2)
$foo = $foo + 1.3; // $foo сейчас имеет тип double (3.3)
$foo = 5 + "10 Little Piggies"; // $foo является целым (15)
$foo = 5 + "10 Small Pigs"; // $foo является целым (15)
Если вы желаете изменить тип переменной, используйте settype().
Определение типов переменных.Поскольку PHP определяет типы переменных и преобразует их (в общем) по мере необходимости, не всегда очевидно какой тип данная переменная имеет в какой-то отдельный момент. Поэтому PHP включает несколько функций, которые позволяют определить текущий тип переменной. Это функции gettype(), is_long(), is_double(), is_string(), is_array(), и is_object().
Приведение типа.Приведение типа работает в PHP во многом так же как в C: название требуемого типа записывается в круглых скобках перед переменной, которая должна быть приведена к данному типу.
$foo = 10; // $foo is an integer
$bar = (double) $foo; // $bar is a double
Допускается следующее приведение типов:
· (int), (integer) - приведение к целому
· (real), (double), (float) - приведение к типу double
· (string) - приведение к строке
· (array) - приведение к массиву
· (object) - приведение к объектной переменной
Заметим, что табуляция и пробелы допускаются внутри круглых скобок, поэтому следующее функционально эквивалентно:
$foo = (int) $bar;
$foo = ( int ) $bar;
Преобразование строк.Когда строковая переменная оценивается как числовая, результирующее значение и тип переменной определяются следующим образом.
Переменная string будет оценена как double, если она содержит любой из символов '.', 'e', или 'E'. Иначе она будет оценена как integer.
Данное значение задается начальной частью строковой переменной. Если строка начинается с допустимых цифровых данных, то это значение и будет использоваться. Иначе, будет значение 0 (ноль). Допустимые цифровые данные - это конструкция из факультативного символа, следующего за одной или несколькими цифрами (содержащими факультативно десятичную точку), обозначающего экспоненту. Экспонента может обозначаться символом 'e' или 'E', который может следовать за одной или несколькими цифрами.
$foo = 1 + "10.5"; // $foo тип double (11.5)
$foo = 1 + "-1.3e3"; // $foo тип double (-1299)
$foo = 1 + "bob-1.3e3"; // $foo тип integer (1)
$foo = 1 + "bob3"; // $foo тип integer (1)
$foo = 1 + "10 Small Pigs"; // $foo тип integer (11)
$foo = 1 + "10 Little Piggies"; // $foo тип integer (11);
Манипуляции с массивом.PHP поддерживает как скалярные, так и ассоциативные массивы. Фактически, между ними нет разницы. Вы можете создать массив, используя функции list() или array(), или можно явно задать значение каждого элемента массива.
$a[0] = "abc";
$a[1] = "def";
$b["foo"] = 13;
Можно также создать массив просто добавляя в него значения.
$a[] = "hello"; // $a[2] == "hello"
$a[] = "world"; // $a[3] == "world"
Массив может сортироваться функциями asort(), arsort(), ksort(), rsort(), sort(), uasort(), usort(), и uksort() в зависимости от типа желаемой сортировки. Подсчет количества элементов массива осуществляется функцией count(). Перемещаться по массиву позволяют функции next() и prev(). Другим типовым способом перемещения по массиву является использование функции each().
Элементы языка.
Любой скрипт PHP состоит из последовательности операторов. Оператор может быть присваиванием, вызовом функции, циклом, условным выражением или пустым выражением (ничего не делающим). Операторы обычно заканчиваются точкой с запятой. Также операторы могут быть объединены в группу заключением группы операторов в фигурные скобки. Группа операторов также является оператором.
Константа.PHP определяет несколько констант и предоставляет механизм для определения Ваших констант. Константы похожи на переменные, но они имеют иной синтаксис.
Предопределенные константы - это __FILE__ and __LINE__, которые соответствуют имени файла и номеру строки, которая выполняется в настоящий момент.
<?php
function report_error($file, $line, $message) {
echo "An error occured in $file on line $line: $message.";}
report_error(__FILE__,__LINE__, "Something went wrong!");
?>
Можно определить дополнительные константы с помощью функций define() и undefine().
<?php
define("CONSTANT", "Hello world.");
echo CONSTANT; // outputs "Hello world."
undefine ("CONSTANT");
?>
Выражения.Выражения - это краеугольный камень PHP. В PHP почти всё является выражениями. Простейший и наиболее точный способ определить выражение - это "что-то, имеющее значение". Простейший пример, приходящий на ум - это константы и переменные. Когда вы печатаете "$a = 5", вы присваиваете значение '5' переменной $a.
После этого присваивания вы считаете значением $a 5, также, если вы напишете $b = $a, вы будете ожидать того же как, если бы вы написали $b = 5. Другими словами, $a это также выражение со значением 5. Запись типа '$b = ($a = 5)' похожа на запись'$a = 5; $b = 5;' (точка с запятой отмечает конец выражения). Так как присваивания рассматриваются справа налево, вы также можете написать '$b = $a = 5'.
Более сложные примеры выражений - это функции:
function foo () {
return 5;
}
Функции - это выражения с тем значением, которое они возвращают. Так как foo() возвращает 5, значение выражение 'foo()' - 5.
PHP поддерживает 3 скалярных типа значений: целое, число с плавающей точкой и строки (скалярные выражения вы не можете "разбить" на более маленькие части, как, к примеру, массивы). PHP поддерживает 2 составных (нескалярных) типа: массивы и объекты. Каждое из таких значений может быть присвоено переменной или возвращено функцией.
PHP это язык, ориентированный на выражения, практически всё является выражениями.
Другой хороший пример выражения это префиксное и постфиксное увеличение и уменьшение. Пользователи С и многих других языков могут быть знакомы с записями variable++ and variable--. Это операторы увеличения и уменьшения. В PHP, подобно C, есть 2 типа инкремента - префиксный и постфиксный. Префиксное увеличение, которое записывается как '++$variable', приравнивается увеличенной переменной (PHP увеличивает переменную до того, как прочитать её значение).
Очень распространённый тип выражений - это выражения сравнения. Эти выражения имеют значение 0 или 1 (означает ложь или истину соответственно). PHP поддерживает > (больше, чем), >= ( больше или равно), = (равно), < (меньше, чем) и <= (меньше или равно). Эти выражения в основном используются внутри условий, например оператора IF.
Последний пример выражений, с которыми мы разберёмся, это совмещённые выражения оператор-присваивание. В PHP, также как и в ряде других языков типа C, вы можете писать '$a+=3'. Значение '$a+=3' как и значение обычного присваивания - это присвоенное значение. Любой бинарный оператор может быть записан таким методом, например : '$a–=5' (вычесть 5 из значения $a), '$b*=7' (умножиить значение $a на 7) и так далее.
Есть ещё условный оператор с тремя операндами: $first ? $second : $third. Если значение первого выражения истинно (не равно 0), то исполняется второе выражение и это является результатом данного условного выражения. Иначе исполняется третий оператор.
Этот пример должен помочь Вам лучше понять выражения:
function double($i) /* функция удваивания переменной */
{ return $i*2; }
$b = $a = 5; /* присваиваем значения переменым $a и $b */
$c = $a++; /* постфиксное увеличение, присваиваем $c начальное значение $a (5)*/
$e = $d = ++$b; /* префиксное увеличение, $d и $e равны увеличенному значение $b */
$f = double($d++); /* $f = удвоенное значение $d до его увеличения*/
$g = double(++$e); /* $g = удвоенное значение $e после его увеличения */
$h = $g += 10; /* увеличить значение $g на 10, присвоить это значение переменной $h */
Не каждое выражения является оператором. Оператор имеет форму 'выражение' ';', то есть выражение, за которым следует точка с запятой. В '$b=$a=5;' $a=5 это правильное выражение, но оно не является оператором. А вот '$b=$a=5;' является оператором.
Ещё одна вещь, которую нужно упомянуть - это логические значения выражений. Во многих случаях, в основном в условных операторах и операторах циклов, вы не заинтересованы в конкретных значениях выражений, а только являются ли их значения TRUE или FALSE (в PHP нет специального типа boolean). Логические значения вычисляются примерно так же, как я в языке Perl. Любое не нулевое целое значение - это TRUE, ноль - это FALSE. Обратите внимание на то, что отрицательные значения - это не ноль и поэтому они считаются равными TRUE. Пустая строка и строка '0' это FALSE; все остальные строки - TRUE. И насчёт составных типов (массивы и объекты) - если значение такого типа не содержит элементов, то оно считается равным FALSE; иначе подразумевается TRUE.
Далее мы будем писать 'expr' для обозначения любого правильного выражения PHP.
IF.Возможности PHP по использованию выражения IF похожи на C:
if (expr) statement
Вычисляется логический результат "expr" . Если expr равно TRUE, то PHP выполнит "statement", а если FALSE - проигнорирует.
Следующий пример выведет фразу 'a is bigger than b' если $a больше $b:
if ($a > $b) print "a is bigger than b";
Зачастую Вам требуется исполнить больше чем одно выражение по условию. Конечно, не надо окружать каждое выражение конструкцией IF. Вместо этого вы можете сгруппировать несколько выражений в блок выражений. К примеру, следующий код не только выведет фразу, но и присвоит значение $a переменной $b:
if ($a > $b) { print "a is bigger than b"; $b = $a; }
Выражение IF может иметь неограниченную степень вложенности в другие выражения IF, что позволяет Вам использовать выполнение по условию различных частей программы.
ELSE.Зачастую Вам требуется исполнить одно выражение, если соблюдается какое-либо условие и другое выражение в противном случае. Вот для этого применяется ELSE. ELSE расширяет возможности IF по части обработки вариантов выражения, когда оно равно FALSE. Данный пример выведет фразу 'a is bigger than b' если $a больше $b, и 'a is NOT bigger than b' в противном случае:
if ($a > $b) { print "a is bigger than b"; }
else { print "a is NOT bigger than b"; }
Выражение ELSE выполняется только если выражение IF равно FALSE, а если есть конструкции ELSEIF - то если и они также равны FALSE (см. ниже).
ELSEIF.Является комбинацией IF и ELSE. ELSEIF, как и ELSE позволяет выполнить выражение, если значение IF равно FALSE, но в отличие от ELSE, оно выполнится только если выражение ELSEIF равно TRUE. К примеру, следующий код выведет 'a is bigger than b' если $a>$b, 'a is equal to b' если $a==$b, и 'a is smaller than b' если$a<$b:
if ($a > $b) { print "a is bigger than b";}
elseif ($a == $b) { print "a is equal to b";}
else { print "a is smaller than b"; }
Внутри одного выражения IF может быть несколько ELSEIF. Первое выражение ELSEIF (если таковые есть), которое будет равно TRUE, будет выполнено. В PHP вы можете написать 'else if' (два слова), что будет значить то же самое, что и 'elseif' (одно слово).
Выражение ELSEIF будет выполнено, только если выражение IF и все предыдущие ELSEIF равно FALSE, а данный ELSEIF равен TRUE.
Иной синтаксис для оператора IF: IF(): ... ENDIF;PHP предлагает иной путь для группирования операторов с оператором IF. Наиболее часто это используется, когда вы внедряете блоки HTML внутрь оператора IF, но вообще может использоваться где угодно. Вместо использования фигурных скобок за "IF(выражение)" должно следовать двоеточие, одно или несколько выражений и завершающий ENDIF. Рассмотрите следующий пример:
<?php if ($a==5): ?> A = 5 <?php endif; ?>
В этом примере блок "A = 5" внедрЈн внутрь выражения IF, используемого альтернативным способом. Блок HTML будет виден, только если $a равно 5.
Этот альтернативный синтаксис применим и к ELSE и ELSEIF (expr) .Вот пример подобной структуры :
if ($a == 5): print "a equals 5"; print "...";
elseif ($a == 6): print "a equals 6"; print "!!!";
else: print "a is neither 5 nor 6";
endif;
WHILE.Цикл WHILE - простейший тип цикла в PHP. Он действует, как и его аналог в C. Основная форма оператора WHILE:
WHILE(expr) statement
Он предписывает PHP выполнять вложенный(е) оператор(ы) до тех пор, пока expr равно TRUE. Значение выражения проверяется каждый раз при начале цикла, так что если значение выражения изменится внутри цикла, то он не прервётся до конца текущей итерации. Если значение expr равно FALSE с самого начала, цикл не выполняется ни разу.
Как и в IF, вы можете сгруппировать несколько операторов внутри фигурных скобок или использовать альтернативный синтаксис:
WHILE(expr): выражения ... ENDWHILE;
Следующие примеры идентичны - оба выводят номера с 1 по 10:
/* example 1 */
$i = 1;
while ($i <= 10) { print $i++; }
/* example 2 */
$i = 1;
while ($i <= 10): print $i; $i++;
endwhile;
DO..WHILE.Цикл DO..WHILE очень похож на WHILE за исключением того, что значение логического выражения проверяется не до, а после окончания итерации. DO..WHILE гарантировано выполнится хотя бы один раз, что в случае WHILE не обязательно.
Для циклов DO..WHILE существует только один вид синтаксиса:
$i = 0; do { print $i; } while ($i>0);
Этот цикл выполнится один раз, так как после окончания итерации будет проверено значение логического выражения, а оно равно FALSE ($i не больше 0).
Программисты на C знакомы с иным использованием DO..WHILE, позволяющим прекратить исполнение блока операторов в середине путём внедрения его в цикл DO..WHILE(0) и использования оператора BREAK. Следующий код демонстрирует такую возможность :
do {
if ($i < 5) {
print "i is not big enough";
break;
}
$i *= $factor;
if ($i < $minimum_limit) { break; }
print "i is ok";
} while(0);
FOR.Циклы FOR - наиболее мощные циклы в PHP. Они работают подобно их аналогам в C. Синтаксис цикла FOR :
FOR (expr1; expr2; expr3) statement
Первое выражение (expr1) безусловно вычисляется(выполняется) в начале цикла.
В начале каждой итерации вычисляется expr2. Если оно равно TRUE, то цикл продолжается и выполняются вложенный(е) оператор(ы). Если оно равно FALSE, то цикл заканчивается. В конце каждой итерации вычисляется(исполняется) expr3.
Каждое из этих выражений может быть пустым. Если expr2 пусто, то цикл продолжается бесконечно (PHP по умолчанию считает его равным TRUE, как и С). Это не так бесполезно, как могло бы показаться, так как зачастую вам требуется закончить выполнение цикла, используя оператор BREAK в сочетании с логическим условием вместо использования логического выражения в FOR.
Рассмотрим следующие примеры. Все они выводят номера с 1 по 10 :
/* пример 1 */
for ($i = 1; $i <= 10; $i++)
print $i;
}/* пример 2 */
for ($i = 1;;$i++) {
if ($i > 10) break;
print $i;
}/* пример 3 */
$i = 1;
for (;;) {
if ($i > 10) break;
print $i;
$i++;
}/* пример 4 */
for ($i = 1; $i <= 10; print $i, $i++) ;
PHP также поддерживает альтернативный синтаксис FOR :
FOR (expr1; expr2; expr3): выражение; ...; endfor;
Другие языки используют оператор foreach для того, чтобы обрабатывает массивы или списки. PHP использует для этого оператор while и функции list() и each() . Для примера смотрите документацию по этим функциям.
BREAK. Прерывает выполнение текущего цикла.
$i = 0;
while ($i < 10) {
if ($arr[$i] == "stop") { break; }
$i++;
}
CONTINUE.CONTINUE переходит на начало ближайшего цикла.
while (list($key,$value) = each($arr)) {
if ($key % 2) { // skip even members
continue; }
do_something_odd ($value);
}
SWITCH.Оператор SWITCH похож на группу операторов IF с одинаковым выражением. Во многих случаях вам нужно сравнить переменную (или выражение) со многими различными значениями и выполнить различные фрагменты кода в зависимости от того, чему будет равно значение выражения.
Следующие 2 примера - это 2 различных пути для достижения одной цели, но один использует серию операторов IF, а другой - оператор SWITCH.
/* пример 1 */
if ($i == 0) { print "i equals 0"; }
if ($i == 1) { print "i equals 1"; }
if ($i == 2) { print "i equals 2"; }
/* пример 2 */
switch ($i) {
case 0: print "i equals 0"; break;
case 1: print "i equals 1"; break;
case 2: print "i equals 2"; break;
}
SWITCH выполняет последовательно оператор за оператором. В начале код не исполняется. Только когда встречается оператор CASE с подходящим значением, PHP начинает выполнять программу. PHP продолжает выполнять операторы до конца блока SWITCH или пока не встретит оператор BREAK. Если вы не напишете BREAK в конце цикла операторов, то PHP продолжит выполнять операторы и следующего SWITCH'а. К примеру:
switch ($i) {
case 0: print "i equals 0";
case 1: print "i equals 1";
case 2: print "i equals 2";
}
В этом случае, если $i равно 0, то PHP выполнит все операторы print! Если $i равно 1, то PHP выполнит последние два print. И только если $i равно 2, вы получите ожидаемый результат и выведено будет только 'i equals 2'. Так что важно не забывать ставить BREAK. Специальный случай - это 'default case'. Этот оператор соответствует всем значениям, которые не удовлетворяют другим case'ам. К примеру :
switch ($i) {
case 0: print "i equals 0"; break;
case 1: print "i equals 1"; break;
case 2: print "i equals 2"; break;
default: print "i is not equal to 0, 1 or 2";
}
Выражения в CASE могут быть любого скалярного типа, то есть целые числа или числа с плавающей запятой, а так же строки. Массивы и объекты не будут ошибкой.
REQUIRE.Оператор REQUIRE заменяет себя содержимым указанного файла, похоже на то, как в препроцессоре C работает #include. Это означает, что вы не можете поместить require() внутрь цикла и ожидать, что он включит содержимое другого файла несколько раз в процессе каждой итерации. Для это используйте INCLUDE.
require ('header.inc');
INCLUDE.Оператор INCLUDE вставляет и выполняет содержимое указанного файла. Это случается каждый раз, когда встречается оператор INCLUDE, так что вы можете включить этот оператор внутрь цикла, чтобы включить несколько файлов :
$files = array ('first.inc', 'second.inc', 'third.inc');
for ($i = 0; $i < count($files); $i++) { include($files[$i]); }
include() отличается от require() тем, что оператор include выполняется каждый раз при его встрече, а require() заменяется на содержимое указанного файла безотносительно будет ли выполнено его содержимое или нет. Так как include() это специальный оператор, требуется заключать его в фигурные скобки при использовании внутри условного оператора.
/* Это неправильно и не будет работать, как хотелось бы. */
if ($condition) include($file);
else include($other);
/* А вот это - верно. */
if ($condition) { include($file);}
else { include($other); }
Когда файл исполняется, парсер пребывает в "режиме HTML", то есть будет выводить содержимое файла, пока не встретит первый стартовый тег PHP (<?).
FUNCTION.Функция может быть объявлена следующим образом:
function foo ($arg_1, $arg_2, ..., $arg_n) {
echo "Example function.\n";
return $retval; }
Внутри функции может быть любой верный код PHP, даже объявление другой функции или класса. Функции должны быть определены перед тем, как на них ссылаться.
Возвращение результатов.Результаты возвращаются через необязательный оператор 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();
Аргументы.Информация может быть передана функции через список аргументов, которые являются разделенным запятыми списком переменных и/или констант.
PHP поддерживает передачу аргументов по значению (по умолчанию), по ссылке, и значения по умолчанию. Списки аргументов переменной длины не поддерживаются, но того же можно достичь, передавая массивы.
function takes_array($input) {
echo "$input[0] + $input[1] = ", $input[0]+$input[1];
}
Передача по ссылке.По умолчанию, аргументы функции передаются по значению. Если вы хотите в функции модифицировать аргументы, то можете передать их по ссылке.
Если вы хотите, чтобы аргумент всегда передавался по ссылке, то следует поставить амперсанд (&) перед именем аргумента в объявлении функции:
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.'
Значения по умолчанию.Функции могут определять значения по умолчанию для скалярных аргументов в стиле 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", $flavour) {
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.
Класс. Класс - это набор переменных и функций, работающих с этими переменными. Класс определяется следующим образом :
<?php
class Cart {
var $items; // Количество вещей в корзине покупателя
// Добавить $num наименований типа $artnr в корзину
function add_item ($artnr, $num) {
$this->items[$artnr] += $num; }
// Убрать $num наименований $artnr из корзины
function remove_item ($artnr, $num) {
if ($this->items[$artnr] > $num) {
$this->items[$artnr] -= $num;
return true; }
else { return false; }
}
}
?>
Это определения класса Cart, который состоит связного списка наименований товаров в корзине и двух функций для добавления и удаления вещей из корзины.
Классы это типы, то есть, заготовки для реальных переменных. Вы должны создавать переменные желаемого типа, используя оператор new :
$cart = new Cart;
$cart->add_item("10", 1);
Таким образом, мы создали объект $cart класса Cart. Функция add_item() этого объекта вызывается для добавления 1 товара номер 10 к корзине.
Классы могут быть расширениями других классов. Расширенный класс обладает всеми переменными и функциями базового класса и тем, что вы определите при расширении класса. Это делается, используя ключевое слово extends:
class Named_Cart extends Cart {
var $owner;
function set_owner ($name) {
$this->owner = $name; }
}
Это определяет класс Named_Cart, который имеет все переменные и функции класса Cart плюс дополнительную переменную $owner и дополнительную функцию set_owner(). Вы можете создать поименованную корзину обычным образом и установить или получить владельца корзины. Также вы можете использовать и нормальные функции корзины в поименованной корзине :
$ncart = new Named_Cart; // Создать корзину
$ncart->set_owner ("kris"); // Указать владельца
print $ncart->owner; // Распечатать имя владельца корзины
$ncart->add_item ("10", 1); // (унаследовано из обычной корзины)
Внутри функций класса переменная $this означает сам объект. Вы должны использовать $this->нечто для доступа к переменной или функции с именем 'нечто' внутри объекта.
Конструкторы это функции в классе, которые автоматически вызываются, когда вы создаёте новую переменную данного класса. Функция становится классом, когда она имеет такое же имя, как и сам класс.
class Auto_Cart extends Cart {
function Auto_Cart () {
$this->add_item ("10", 1); }
}
Мы определили класс Auto_Cart который является тем же классом Cart плюс имеет конструктор, который инициализирует корзину при создании, наполняя ее одним товаром типа "10". Конструкторы также могут иметь аргументы, и эти аргументы могут быть необязательными, что делает конструктор более полезным:
class Constructor_Cart {
function Constructor_Cart ($item = "10", $num = 1) {
$this->add_item ($item, $num);
}
}// Покупаем все одно и то же:
$default_cart = new Constructor_Cart;
// А тут что-то новое :
$different_cart = new Constructor_Cart ("20", 17);
Операторы
Арифметические операторы.Эти операторы работают подобным образом
Таблица 6.1. Арифметические операторы
пример | название | результат |
$a + $b | Сложение | Сумма $a и $b. |
$a - $b | Вычитание | Вычитает $b из $a. |
$a * $b | Умножение | Произведение $a и $b. |
$a / $b | Деление | Деление $a на $b. |
$a % $b | Остаток деления | Остаток от деления $a на $b. |
Оператор деления("/") возвращает целую величину(результат целочисленного деления) если оба оператора - целые (или строка преобразованная в целое). Если каждый операнд является величиной с плавающей запятой, выполнится деление с плавающей запятой.
Операторы строк.B действительности есть только один оператор - конкатенации (".").
$a = "Hello ";
$b = $a . "World!"; // теперь $b = "Hello World!"
Дата добавления: 2015-11-04; просмотров: 839;