Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
php_лекции.doc
Скачиваний:
2
Добавлен:
21.09.2019
Размер:
817.66 Кб
Скачать

Комментарии

PHP предоставляет несколько методов для вставки комментариев.

<php

echo("<p>Hello</p>"); // комментарий

echo("<p>Hello</p>"); # комментарий

/*

и это тоже комментарии

*/

?>

Стили комментариев PHP действуют только внутри ограничителей PHP. Если PHP встретит эти символы комментариев вне ограничителей, то они, как и любой текст, будут помещены на html-страницу.

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

Инструкции завершаются точкой с запятой ;

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

Скалярные типы данных:

  • целый тип (integer),

  • вещественный тип данных (float, double),

  • логический тип (boolean),

  • строковый тип (string)

  • специальный тип NULL.

Нескалярные типы данных:

  • "ресурс" (resource),

  • массив (array)

  • и объект (object).

Тип NULL предназначен для переменных без определенного значения. Значение NULL принимают неинициализированные переменные, переменные инициализированные константой NULL, а также переменные, удаленные при помощи конструкции unset().

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

Переменные

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

При объявлении переменных в РНР не требуется явно указывать тип переменной, при этом одна и та же переменная может иметь на протяжении программы разные типы.

Переменная инициализируется в момент присваивания ей значения и существует до тех пор, пока выполняется программа. Т.е., в случае web-страницы это означает, что до тех пор, пока не завершен запрос.

Константы

Константы объявляются в РНР при помощи функции define():

define(CONSTANT, value)

Первый параметр этой функции – имя константы, второй – её значение. При использовании константы на неё ссылаются по имени:

<?

define(CONSTANT1,15);

define(CONSTANT2,"\x20"); // код пробела

echo(CONSTANT1);

echo(CONSTANT2);

?>

По традиции имена констант пишут буквами верхнего регистра. Существует функция defined(), которая проверяет, определена ли константа:

<?

define(CONSTANT,"Hello");

if(defined("CONSTANT"))

{

echo("<p>CONSTANT is defined</p>");

}

?>

Установка сервера Apache

Установка сервера Apache и сопутствующих программ вручную может оказаться довольно утомительным занятием. Вам придется разбираться с многочисленными параметрами конфигурации Apache, PHP и MySQL, которые никогда вам больше не пригодятся. В связи с этим возникает задача создания универсального инсталлятора, способного упростить установку всех программ, необходимых Web-программисту. Денвер — это те же самые дистрибутивы Apache, PHP, MySQL, Perl, объединенные в единый архив, снабженные удобным инсталлятором и утилитами настройки под конкретную машину (включая средства автоматического конфигурирования виртуальных хостов).

Денвер создавался для того, чтобы упростить настройку и установку свободно распространяемых программ (Apache, PHP, MySQL и т. д.). Естественно, он может безвозмездно использоваться любыми Web-программистами и дизайнерами, но только в некоммерческих целях. (Это означает, что вы не можете продавать его как отдельный продукт.)

Денвер имеет модульную структуру. Его ядро — так называемый "базовый пакет". Все остальные компоненты поставляются в виде автономных пакетов расширений', для работы которых нужен базовый пакет.

Состав базового пакета

  • Apache с поддержкой SSI, mod_rewrite, mod_php;

  • PHP с поддержкой GD и MySQL;

  • MySQL с поддержкой транзакций (mysqld-max);

  • phpMyAdmin — система управления MySQL через Web-интерфейс; полностью заменяет командную строку MySQL;

  • ядро Perl без стандартных библиотек (они поставляются отдельно);

  • эмулятор sendmail (отладочная "заглушка", помещающая приходящие письма в каталог /tmp); поддерживается работа совместно с РНР и Perl;

  • система управления виртуальными хостами, основанная на шаблонах. Чтобы создать новый хост, вам нужно лишь добавить каталог в /home, править конфигурационные файлы не требуется;

  • система настройки и управления запуском/завершением;

  • инсталлятор.

Установка дистрибутива

Для начала необходимо проверить, действительно ли настроен ваш компьютер для работы с Денвером. Самый простой тест: в меню Пуск выберите команду Выполнить и в появившемся диалоговом окне введите команду ping (рис. 1.1).

Рис. 1.1. Запуск команды ping

После нажатия клавиши <Enter> вы должны увидеть примерно то, что представлено на рис. 1.2.

Рис. 1.2. Результат работы команды ping

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

Инсталляция

Теперь вам необходимо скачать дистрибутив, расположенный по адресу http://web.dklab.ru/dis (подкаталог с именем Base_PHP5). Скачивайте самую последнюю версию, потому что в предыдущих, как правило, содержатся ошибки.

После того как вы скачали дистрибутив, вам нужно его запустить. Вначале архив будет распакован во временный каталог , а затем автоматически запустится инсталлятор. Инсталлятор написан на языке Perl.

Появится запрос, в какой каталог вы хотели бы установить комплекс (по умолчанию используется C:\WebServers, вам нужно лишь нажать клавишу <Enter>, чтобы согласиться с этим выбором). В указанном каталоге будут расположены абсолютно все компоненты системы, и вне его никакие файлы в дальнейшем не создаются .

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

  • создавать виртуальный диск при загрузке машины (естественно, инсталлятор позаботится, чтобы это происходило автоматически), а при остановке серверов его (диск) не отключать. Это наиболее удобный режим;

  • создавать виртуальный диск только по явной команде старта комплекса (при щелчке по ярлыку запуска на рабочем столе). И, соответственно, отключать диск от системы — при остановке серверов.

Наконец, установка завершена. Сразу же щелкайте по созданному инсталлятором ярлыку Start servers на рабочем столе, а затем, дождавшись, когда все консольные окна исчезнут, открывайте браузер и набирайте в нем адрес: http://localhost. Выходить из Интернета при этом не обязательно (рис. 1.3).

Рис. 1.3. Страница http://localhost после инсталляции комплекса

Если тестовая страница все же не загрузится, проверьте:

  1. Отключен ли у вас прокси-сервер в настройках браузера?

  2. Запущен ли Денвер? Если запущен, нет ли ошибок при щелчке на пиктограмме пера (справа внизу)?

  3. Не запущен ли у вас какой-то другой Web-сервер, который мешает Денверу (часто бывает в Windows XP)? Например, Microsoft IIS? Если да, отключите его.

Запуск скрипта в РНР

  1. Создайте файл с именем first.php, содержащий скрипт

<?php

echo 'Hello, world!';

?>

  1. Запустить сервер, с помощью ярлыка Start servers на рабочем столе

  2. Поместите файл first.php в папку «Z:\home\localhost\www»

  3. Введите в строке адреса браузера http://localhost/first.php

  4. В окне браузера должно появится Hello, world!

Задание

  1. Установить сервер Apache с помощью дистрибутивы Денвер.

  2. Запустить скрип на выполнение

Переменные, константы, типы данных

Переменные

В РНР как и в любом другом языке программирования существует такое понятие переменной. Имя переменной всегда должно начинаться с символа «$», за которым следуем имя переменной.

Имена переменных чувствительны к регистру букв: например, $my_variabie — не то же самое, что $My_variabie или $my_variable. В именах переменных можно использовать не только латинские буквы и цифры, но также и любые символы, код которых старше 127,— в частности, и "русские" буквы! Однако не рекомендуется применять кириллицу в именах переменных т.к. в различных кодировках ее буквы имеют различные коды.

Переменные в РНР — особые объекты, которые могут содержать в буквальном смысле все, что угодно. Если в программе что-то хранится, то оно всегда хранится в переменной (исключение — константа). Такого понятия, как указатель (как в С), в языке не существует — при присваивании переменная в большинстве случаев копируется один- в-один, какую бы сложную структуру она ни имела. Единственное исключение из этого правила — копирование переменной, ссылающейся на объект: в этом случае объект остается в единственном экземпляре, копируется лишь ссылка на него. В РНР также присутствует понятие ссылки. В РНР не нужно ни описывать переменные явно, ни указывать их тип. Интерпретатор все это делает сам. Однако иногда он может ошибаться (например, если в текстовой строке на самом деле задано десятичное число), поэтому изредка появляется необходимость явно указывать, какой же тип имеет то или иное выражение. В связи с этим рассмотрим основные типы данных РНР.

Типы переменных

РНР непосредственно поддерживает несколько типов переменных

integer -Целое число со знаком, обычно длиной 32 бита.

double -Вещественное число довольно большой точности.

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

array -Ассоциативный массив. Это набор из нескольких элементов, каждый из которых представляет собой пару вида ключ=>значение (символом => мы обозначаем соответствие определенному ключу какого-то значения). Доступ к отдельным элементам осуществляется указанием их ключа. В отличие от С-массивов, ключами здесь могут служить не только целые числа, но и любые строки. Например, вполне возможно существование таких команд:

// создаст массив с ключами "0", "surname" и "name"

$а = array( 0 => "Нулевой элемент", "surname" => "Иванов", "name" => "Иван", );

echo $а["surname"]; // выведет " Иванов "

$а["1"]="Первый элемент"; // создаст элемент и присвоит ему значение

$а["name "]="Вильям"; // присвоит существующему элементу новое значение

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

ЗАМЕЧАНИЕ

Переменные в РНР версии 5 (в отличие от версии 4) хранят не сами объекты, а лишь ссылки на них. Это означает, что при копировании таких переменных (например, оператором $а = $obj) данные объекта в памяти не дублируются, и последующее изменение объекта $а повлечет за собой немедленное изменение объекта $obj.

resource – Некоторый ресурс, который РНР обрабатывает особым образом. Пример ресурса — переменная, содержащая дескриптор открытого файла.

Существует и еще один тип переменных — логический. Логическая переменная может содержать одно из двух значений: false (ложь) или true (истина). Вообще, любое ненулевое число (и непустая строка), а также ключевое слово true символизирует истину, тогда как 0, пустая строка и слово false — ложь. Таким образом, любое ненулевое выражение (в частности, значение переменной) рассматривается в логическом контексте как истина.

NULL (специальное значение) - Переменной можно присвоить специальную константу null (или null, это одно и то же), чтобы пометить ее особым образом. Тип этой константы — особый и называется также null.

Действия с переменными

Вне зависимости от типа переменной, над ней можно выполнять три основных действия.

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

  2. Проверка существования при помощи встроенного в РНР оператора isset().

Например:

if (isset($myVar))

echo "Такая переменная есть. Ее значение $myVar";

Если переменной в данный момент не существует, то isset() возвращает ложь, в противном случае — истину.

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

// Переменная $а еще не существует

$а = "Hello there!";

// Теперь $а инициализирована

echo $a;

//А теперь удалим переменную $а

unset($a);

// Теперь переменная $а опять не существует

echo $a; // Ошибка: нет такой переменной $а

Обычно unset() не применяется для работы с обычными переменными, а используется для удаления элемента в ассоциативном массиве.

Определение типа переменной

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

is_integer($а) //Возвращает true, если $а — целое число.

is_double($a) //Возвращает true, если $а — действительное число.

is_string($a) //Возвращает true, если $а является строкой.

is_numeric($a) //Возвращает true, если $а является либо числом, либо строковым представлением числа (т. е. состоит из цифр и точки).

is_bool($a) //Возвращает true, если $а имеет значение true или false.

is_null($a) //Возвращает true, если $а хранит значение null.

is_array($a) //Возвращает true, если $а является массивом.

is_object($а) //Возвращает true, если $а содержит ссылку на объект.

gettype($a) //Возвращает строки, соответственно, со значениями: array, object, integer, double, string, boolean, NULL И Т. Д. ИЛИ unknown type в зависимости от типа переменной. Установка типа переменной

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

settype($a, $type) //Функция пытается привести тип переменной $а к типу $type. Если это сделать не удалось, возвращает false.

Ссылочные переменные

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

Жесткая ссылка представляет собой просто переменную, которая является синонимом другой переменной. Чтобы создать жесткую ссылку, нужно использовать оператор =&. Например:

$а = 10;

$b =&$а; // теперь $b — то же самое, что и $а

$b = 0; //на самом деле $а=0

echo "b=$b, a=$a"; // выводит "Ь=0, а=0"

Символическая ссылка — это всего лишь строковая переменная, хранящая имя другой переменной. Чтобы добраться до значения переменной, на которую указывает символическая ссылка, необходимо применить оператор разыменования — дополнительный знак $ перед именем ссылки.

$right = "красная";

$wrong = "синяя";

$color = "right";

echo $$color; // выводит значение переменной $right ("красная")

$$color = "несиняя"; // присваивает переменной $right новое значение

Ссылки на объекты( появившееся в РНР версии 5) - переменная хранит не сам объект, а лишь ссылку на него. Так как переменные содержат лишь ссылки на объекты, при их присваивании копируются только эти ссылки, но не сами объекты.

Константы

Константа отличается от переменной тем, что, во-первых, ей нигде в программе нельзя присвоить значение больше одного раза, а во-вторых, ее имя не предваряется знаком $, как это делается для переменных. Константы бывают двух типов: одни — предопределенные (т. е. устанавливаемые самим интерпретатором), а другие определяются программистом.

Существует несколько предопределенных констант.

_FILE_ // Хранит имя файла, в котором расположен запущенный в настоящий момент код.

_LINE_ //Содержит текущий номер строки, которую обрабатывает в текущий момент интерпретатор.

PHP_VERSION //Версия интерпретатора PHP.

PHP_OS //Имя операционной системы, под управлением которой работает РНР.

TRUE ИЛИ true

FALSE ИЛИ false

NULL ИЛИ null

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

void define (string $name, string $value, bool $case__sen) //Определяет новую константу с именем, переданным в $name, и значением $value.

Если необязательный параметр $case_sen равен true, то в дальнейшем в программе регистр букв константы учитывается, в противном случае — не учитывается (по умолчанию, регистр учитывается). Созданная константа не может быть уничтожена или переопределена.

Например:

define("PI", 3.1416);

// Предположим, определена константа PI, равная 3.1416...

$а = 2.34 * sin(3 * PI / 8) +5; // использование константы

echo "Это число ".PI; // выведет "Это число 3.1416..."

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

В РНР существует также функция, которая проверяет, существует ли (была ли определена ранее) константа с указанным именем.

bool defined(string $name) //Возвращает true, если константа с именем $name была ранее определена.

Задание.

  1. Определить 2 константы. Определить 2 переменные. Присвоить одной переменной число, а второй число, но в виде строки, т.е. заключенное в кавычки.

  2. Привести строку к числу. Вывести результат преобразования.

  3. Изменить значение одной из констант. Вывести результат.

  4. Создать еще одну переменную, и присвоить ей значение ссылки на первую переменную. Увеличить первую переменную на произвольное число. Вывести все три переменные и посмотреть результат.

  5. Удалить первую константу. Проверить, существует ли константа с именем первой константы.

Выражения и операции РНР

Выражения

Практически все, что вы пишете в программе, — это выражения. Самый простой пример выражения — переменная или константа, стоящая, скажем, в правой части оператора присваивания. Например

$а = 5;

$b = $а;

Чтобы преобразовать одно значение в другое (например, нам может не понравиться, что $b— типа string, хотя содержит целое число), используются операторы преобразования типов. Эти операторы доступны как в функциональной, так и в префиксной операторной форме. Например, следующие две инструкции эквивалентны:

$а = intval($b);

$а = (int)$b;

Итак, перечислим операторы преобразования типов.

$b = intval (выражение) ИЛИ $b = (int) (выражение) //Переводит значение выражения в целое число и присваивает его $b.

$b = doubleval (выражение) ИЛИ $b = (double) (выражение)//Переводит значение в действительное число и присваивает его $b.

$b = strval (выражение) ИЛИ $b = (string) (выражение) //Переводит значение выражения в строку.

$b = (bool) (выражение) //Преобразует значение выражения в логический тип.

Логические выражения — это выражения, у которых могут быть только два значения: ложь и истина (или, что почти то же самое, 0 и 1). На самом деле абсолютно любое выражение может рассматриваться как логическое в "логическом" же контексте (например, как условие для конструкции if-else). Ведь, как уже говорилось, в качестве истины может выступать любое ненулевое число, непустая строка и т. д., а под ложью подразумевается все остальное.

Например:

$less = 10 < 5; // $less - false

$equals = $b == 1; // $equals — true, если $b == 1

$between - $b>=l && $b<=10 // $between - true, если $b от 1 до 10

$x = !($b || $c) && $d; // true, если $b и $с ложны, a $d - истинно

Строковые выражения

Строки в РНР — одни из основных объектов. Они могут содержать текст вместе с символами форматирования или даже бинарные данные. Определение строки в кавычках или апострофах может начинаться на одной строке, а завершаться — на другой.

Если строка заключена в апострофы (например, 'строка'), то она трактуется почти в точности так же, как записана, за исключением двух специальных последовательностей символов:

  • последовательность \' трактуется РНР как апостроф и предназначена для вставки апострофа в строку, заключенную в апострофы: 'д\'Артаньян';

  • последовательность \\ трактуется как один обратный слэш и позволяет вставлять В строку ЭТОТ СИМВОЛ: 'С: \\m2transcript. txt'.

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

Строка в кавычках. Есть набор специальных метасимволов, которые, будучи помещены в кавычки, определяют тот или иной специальный символ.

Вот некоторые из них:

\n - обозначает символ новой строки;

\r - обозначает символ возврата каретки;

\t - обозначает символ табуляции;

\$ - обозначает символ $;

\” - обозначает кавычку;

\\ - обозначает обратный слэш;

NN - обозначает символ с шестнадцатеричным кодом NN.

Переменные в строках интерполируются. Например:

$hell = "Hello";

echo "$hell world!" //Этот фрагмент выведет Hello world!

т. е. $hell в строке была заменена на значение переменной $hell.

Операции

Арифметические операции ( а + b, а – b, а *b, а /b, а % b).

Операция деления / возвращает целое число (т. е. результат деления нацело), если оба выражения а и b — целого типа, в противном случае результат будет дробным. Операция вычисления остатка от деления % работает только с целыми числами, так что применение ее к дробным может привести, к нежелательному результату.

Строковые операции

а.b — слияние строк а и b;

а[n] — символ строки в позиции n.

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

Операции инкремента и декремента

Для операций $а += 1 и $b-= 1 в связи с их чрезвычайной распространенностью в РНР ввели, как и в С, специальные операторы:

$а++ — увеличение переменной $а на 1;

$а-- уменьшение переменной $а на 1.

Как и в языке С, эти операторы увеличивают или уменьшают значение переменной, а в выражении возвращают значение переменной $а до изменения. Например:

$а = 10;

$b= $а++;

echo "а=$а, b=$b"; // выведет а=11, Ь=10

Существуют также парные операторы, которые указываются до, а не после имени переменной. Соответственно, и возвращают они значение переменной уже после изменения. Например:

$а = 10;

$b = --$а;

echo "a=$a, b=$b"; // выведет а=9, b=9

Битовые операции

Эти операции предназначены для работы (установки/снятия/проверки) групп битов в целой переменной. Биты целого числа — это не что иное, как отдельные разряды того же самого числа, записанного в двоичной системе счисления.

а & b //Результат — число с установленными битами, которые выставлены и в а, и в b

одновременно.

а | b //Результат — число с установленными битами, которые выставлены либо в а,

либо в b, либо одновременно.

~ а //Результат, у которого на месте единиц в а стоят нули, и наоборот.

а << b //Результат — число, полученное поразрядным сдвигом а на b битов влево.

а>> b //Результат — число, полученное поразрядным сдвигом а на b битов вправо.

Операции сравнения

Операции сравнения позволяют сравнивать два значения между собой и, если условие выполнено, возвращают true, в противном случае — false.

а == b, а != b, а < b , а > b, а <= b, а >= b

Если один из операндов оператора сравнения — числовой, то сравнение всегда выполняется в числовом контексте, даже если второй операнд — не число.

Сравнение сложных переменных

В РНР версии 5 сравнивать на равенство или неравенство можно не только скалярные переменные (т. е. строки и числа), но также массивы и объекты.

$х = array(1, 2, "3") ;

$у = array(1, 2, 3);

echo "Равны ли два массива? ".($х == $у);

Данный пример сообщит, что массивы $х и $у равны, несмотря на то, что последний элемент одного из них — строка, а другого — число. То есть, если оператор == сталкивается с массивом, он идет "вглубь" и сверяет также каждую пару переменных. Делает он это при помощи самого себя (рекурсивно), выполняя, в частности, все правила сравнения логических выражений, которые были описаны выше. Рассмотрим еще один пример:

$х = array(1, 2, true);

$у = array(1, 2, 3) ;

echo "Равны ли два массива? ". ($х == $у);

Смотрите, на первый взгляд, массивы $х и $у сильно различаются. Но с точки зрения РНР 3==true. Поэтому нет ничего удивительного в сообщении программы о равенстве двух данных массивов. Опишем, как оператор == работает с объектами.

class AgentSmith {}

$smit = new AgentSmith();

$wesson = new AgentSmith();

echo ($smit == $wesson)

Хотя объекты $ smith и $wesson создавались независимо друг от друга и потому различны, они структурно выглядят одинаково (содержат одинаковые данные), а потому объекты совпадают. Вывод: две переменные равны в смысле ==, если они хранят одинаковые величины.

Операция эквивалентности

Еще в РНР версии 4 появился новый оператор сравнения — тройной знак равенства ===, или оператор проверки на эквивалентность.

$int = 10;

$string = "10";

if ($int == $string) echo "переменные равны";

И это несмотря на то, что переменная $int представляет собой число, а $ string — строку.

Проблему решает оператор эквивалентности === (тройное равенство). Он не только сравнивает два выражения, но также их типы.

<?php ## Операторы равенства и эквивалентности.

$уер = array("реальность", true);

$nein = array("реальность", "иллюзия");

if ($yep == $nein) echo "Два массива равны";

if ($yep === $nein) echo "Два массива эквивалентны";

?>

Если запустить представленный код, то выведется первое сообщение, но не второе: эквивалентности нет. Для объектов сравнение на эквивалентность также производится в "строгом" режиме .

Логические операции

Эти операции предназначены исключительно для работы с логическими выражениями и также возвращают false или true:

!a — истина, если а ложно, и наоборот;

а && b — истина, если истинны и а и b;

а || b — истина, если истинны или а, или b, или оба операнда.

Обратите внимание, что, например, | и || — два совершенно разных оператора, первый из которых может потенциально возвращать любое число, а второй — только false И true.

Задание.

  1. Дано расстояние L в сантиметрах. Используя операцию деления нацело, найти количество полных метров.

  2. Дан размер файла в байтах. Используя операцию деления нацело, найти количество полных килобайтов, которые занимает данный файл (1 килобайт = 1024 байта).

  3. С начала суток прошло N секунд (N — целое). Найти:

  1. количество полных минут, прошедших с начала суток;

  2. количество целых часов, прошедших с начала суток;

  3. количество секунд, прошедших с начала последней минуты;

  4. количество секунд, прошедших с начала последнего часа;

  5. количество полных минут, прошедших с начала последнего часа.

Конструкции языка

Инструкция if-else

if (логическое_выражение)

инструкция_1;

else

инструкция_ 2;

Действие инструкции следующее: если логическое_выражение истинно, то выполняется инструкция_1, а иначе — инструкция_2. Как и в любом другом языке, конструкция else может опускаться, в этом случае при получении ложного значения просто ничего не делается.

Пример:

if ($salary>=100 && $salary<=5000) echo "Вам полагается премия";

else echo "Не в этот раз.";

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

if ($a > $b) { print "а больше b"; $c-=$b; }

elseif ($a == $b) { print "а равно b"; $c = $a; }

else { print "а меньше b"; $c = $a; }

echo "<br>Минимальное из чисел: $с";

Это не опечатка: elseif пишется слитно, вместо else if. Так тоже можно писать. Конструкция if-eise имеет еще один альтернативный синтаксис:

if(логическое_выражение) :

команды;

elseif (другое_логическое_выражение) :

другие_команды;

else:

иначе_команды;

endif

Обратите внимание на расположение двоеточия (:)! Если его пропустить, будет сгенерировано сообщение об ошибке. И еще: блоки elseif и else можно опускать.

Цикл с предусловием while

Эта конструкция также унаследована непосредственно от С. Ее предназначение — цикличное выполнение команд в теле цикла, включающее предварительную проверку, нужно ли это делать (истинно ли логическое выражение в заголовке). Если не нужно (выражение ложно), то конструкция заканчивает свою работу, иначе выполняет очередную итерацию и начинает все сначала. Выглядит цикл так:

while (логическое_выражение)

инструкция;

где, логическое_вьражение — логическое выражение, а инструкция — простая или составная инструкция тела цикла. Если выражение с самого начала ложно, то цикл не выполнится ни разу.

<?php ## Вывод всех степеней двойки до 2^31 включительно.

$i=1; $р = 1;

while ($i < 32)

{

echo $p." ";

$р = $р * 2;

$i++;

}

?>

Аналогично инструкции if, цикл while имеет альтернативный синтаксис, что упрощает его применение совместно с HTML-кодом:

while (логическое_выражение) :

команды;

endwhile;

Цикл с постусловием do-while

В отличие от цикла while, этот цикл проверяет значение выражения не до, а после каждого прохода. Таким образом, тело цикла выполняется хотя бы один раз. Выглядит оператор так:

do {

команды;

} while (логическое_выражение) ;

После очередной итерации проверяется, истинно ли логическое_выражение, и, если это так, управление передается вновь на начало цикла, в противном случае цикл обрывается. Альтернативного синтаксиса для do-while разработчики РНР не предусмотрели.

Универсальный цикл for

for (инициализирующие_команды; условие_цикла; команды_после_прохода)

тело_цикла;

Как только управление доходит до цикла, первым делом выполняются операторы, включенные в инициализирующие_команды (слева направо). Эти команды перечисляются через запятую, например:

for ($i=0, $j=10, $k="Test!"; ...)

Затем начинается итерация. Сначала проверяется, выполняется ли условие_цикла (как в конструкции while). Если да, то цикл продолжается. Иначе осуществляется выход из конструкции.

<?php ## Демонстрация цикла for

for ($i=0, $k="Points"; $i<100; $i++)

$k = $k.".";

echo $k;

?>

Любой цикл for можно реализовать и через while. Например:

$i = 0; $к = "Points";

while ($i<100) {

$k = $k.".";

$i++;

}

Имеется и альтернативный синтаксис конструкции:

for (инициализирующие_команды; условие_цикла; команды_после_прохода) :

операторы;

endfor;

Инструкции break и continue

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

for ($i=0; $i<count($matrix); $i++)

{

for ($j=0; $j<count($matrix[$i]); $j++) {

if ($matrix[$i][$j] == 0) break(2);

}

}

if ($i < 10) echo 'Найден нулевой элемент в матрице!';

Инструкцию break удобно использовать для циклов поисков: как только очередная итерация удовлетворяет условию, цикл заканчивается.

Инструкция continue так же, как и break, работает только "в паре" с циклическими конструкциями. Она немедленно завершает текущую итерацию цикла и переходит к новой (конечно, если выполняется условие цикла для цикла с предусловием). Точно так же, как и для break, для continue можно указать уровень вложенности цикла, который будет продолжен по возврату управления. В основном continue используется в циклах-фильтрах, когда требуется перебрать некоторое количество объектов и выбрать из них только те, которые удовлетворяют определенным условиям. Например, ниже представлен цикл, который печатает только те элементы массива $ files (имена файлов и каталогов), которые являются файлами:

for ($i=0; $i<count($files)/ $i++) {

if ($files[$i] == ".") continue;

if ($files[$i] == "..") continue;

if (is_dir($files[$i])) continue;

echo "Найден файл: $files[$i]<br>";

}

Цикл foreach

Данный тип цикла предназначен специально для перебора всех элементов массива и был добавлен только в четвертой версии языка РНР.

foreach (массив as $ключ=>$значение)

команды;

Здесь команды циклически выполняются для каждого элемента массива, при этом очередная пара ключ=> значение оказывается в переменных $ключ и $ значение.

<?php ## Вывод всех переменных окружения,

foreach($_SERVER as $k=>$v)

echo "<b>$k</b> => <tt>$v</tt><br>\n";

?>

У цикла foreach имеется и другая форма записи, которую следует применять, когда нас не интересует значение ключа очередного элемента. Выглядит она так:

foreach ($массив as $значение)

команды;

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

Для того чтобы иметь возможность изменять массив изнутри тела цикла, в РНР 5 можно использовать ссылочный синтаксис:

foreach ($массив as $ключ=>&$значение)

команды;

Здесь можно изменять $значение, при этом изменяются элементы исходного массива $массив.

Конструкция switch-case

Часто вместо нескольких расположенных подряд инструкций if-eise целесообразно воспользоваться специальной конструкцией switch-case:

switch (выражение) {

case значение1: команды1; [break;]

case значение2: команды2; [break;]

case значениеN: командыN; [break; ]

[default: команды_по_умолчанию; [break]]

}

Делает она следующее: вычисляет значение выражения (пусть оно равно, например, v), а затем пытается найти строку, начинающуюся с case v:. Если такая строка обнаружена, выполняются команды, расположенные сразу после нее. Если же найти такую строку не удалось, выполняются команды после default (когда они заданы). Обратите внимание на операторы break (необязательные), добавленные после каждой строки команд, кроме последней. Если бы не они, то при равенстве v=значение1 сработали бы не только команды1, но и все нижележащие.

Альтернативный синтаксис для конструкции switch-case:

switch (выражение) :

case значение1: команды1; [break;]

case значениеЫ: командыЫ; [break; ]

[default: команды_по_умолчанию; [break]]

endswitch;

Инструкции require и include

Эти инструкции позволяют разбить текст программы на несколько файлов. Рассмотрим require. Ее формат такой:

require имя_файла;

При запуске программы интерпретатор просто заменит инструкцию на содержимое файла имя_файла (этот файл может также содержать сценарий на РНР, обрамленный, как обычно, тегами <? и ?>).

Инструкция include практически идентична require, за исключением того, что в случае невозможности включения файла работа сценария не завершается немедленно, а продолжается (с выводом соответствующего диагностического сообщения).

Инструкции однократного включения

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

Инструкция require_once работает точно так же, как и require, но за одним важным исключением. Если она видит, что затребованный файл уже был ранее включен, то ничего не делает.

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

Другие инструкции

В РНР существует еще масса других инструкций:

function — объявление функции;

class — объявление класса;

var, private, static, public — определение свойства класса;

throw — генерация исключения;

try-catch — перехват исключения

Задание.

  1. Дан номер некоторого года (положительное целое число). Вывести число дней в этом году, учитывая, что обычный год насчитывает 365 дней, а високосный — 366 дней. Високосным считается год, делящийся на 4, за исключением тех годов, которые делятся на 100 и не делятся на 400 (например, годы 300, 1300 и 1900 не являются високосными, а 1200 и 2000 — являются).

  2. Арифметические действия над числами пронумерованы следующим образом: 1 — сложение, 2 — вычитание, 3 — умножение, 4 — деление. Дан номер действия и два числа A и B (В не равно нулю). Выполнить над числами указанное действие и вывести результат.

  3. Дано вещественное число A (> 1). Вывести наибольшее из целых чисел N, для которых сумма 1 + 1/2 + ... + 1/N будет меньше A, и саму эту сумму. Задачу решить с помощью цикла for и переписать цикл for с помощью цикла while.

Массивы

Одной из основных и часто встречающихся структур для хранения данных являются массивы. Массив представляет собой индексированную совокупность переменных одного типа. Каждая переменная или элемент массива имеет свой индекс, т. е. все элементы массива последовательно пронумерованы от 0 до N, где N —размер массива.

Создание одномерных массивов

Существует два метода создания одномерных массивов: простое присвоение значений элементам массива и использование конструкции array ().

//Создание одномерного массива присвоением значений его элементам

<?php

$number[] ="10";

$number[]= "15";

$number[] = "20";

echo($number[0]) ;

?>

В результате выполнения этого скрипта будет выведена цифра 10, т.к. индексация массивов в РНР начинается с 0.

Посмотреть всю структуру массива сразу можно с помощью функции print_r()

// Вывод структуры массива функцией print_r()

<?php

$number[] ="10";

$number[] ="15";

$number[] ="20";

print_r($number);

?>

В этом случае будет выведена структура всего массива:

Array

(

[0] => 10

[1] => 15

[2] -> 20

)

Индекс элементов массива можно указывать и явно.

//Использование явного указания индекса элементов массива

<?php

$number[2] ="10";

$number[0] ="15";

$ number [5]="20";

print_r($number);

?>

В этом случае, запросив вывод значений элементов массива, мы получим следующий результат:

Array

(

[0] => 15

[2] => 10

[5] -> 20

)

Если при объявлении элементов массива смешиваются переменные с явной индексацией и без индексации, то тому элементу, индекс которого не задан, РНР присвоит первый доступный индекс, после самого большего использованного до сих пор индекса. Например, если мы создадим массив с элементами, индексы которых будут равны, скажем, 5, 10 и 100, а потом создадим элемент, индекс которого явно не укажем, то ему автоматически присвоится индекс 101.

Второй способ определения массивов состоит в использовании конструкции array()

// Использование конструкции array()

<?php

$number = array("10","15","20");

echo($number[1]); // выводит число 15

?>

Для явного указания индексов применяется оператор =>

$number = array("15",5 => "1","7","12");

Индексами массива в РНР могут быть не только числа, но и строки, в этом случае массив называется ассоциативным, а индексы — ключами

number = array("one" => "1","two"=>"2");

Создание многомерных массивов

Многомерные массивы можно создавать, обращаясь к элементам или используя вложенные конструкции array().

// Создание многомерного массива

<?php

$ship = array(

"Пассажирские корабли" => array("Лайнер","Яхта","Паром"),

"Военные корабли" => array("Авианосец","Линкор","Эсминец"),

"Грузовые корабли" => array("Сормовский","Волго-Дон","Окский")

);

print_r($ship);

?>

При обращении к элементу $ship['пассажирские корабли'] [0] возвратит значение "Лайнер".

Обход массива в цикле

Существует несколько способов обхода массива в цикле. Одни из которых:

1) с помощью цикла foreach;

2) с помощью цикла for;

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]