- •Государственное образовательное учреждение высшего профессионального образования Волго-Вятская академия государственной службы
- •Разработка Web-приложений
- •Часть 2. Основы php – основного языка создания Web - приложений
- •Оглавление
- •Глава 1. Основы языка php 7
- •Глава 2. Синтаксис и семантика операторов php 58
- •Глава 3. Массивы 103
- •Глава 4. Функции 141
- •Глава 5. Работа с файлами 198
- •Глава 6. Вопросы и задания 271
- •Глава 1.Основы языка php
- •1.1.Замечания о некоторых особенностях языка и среды его выполнения
- •1.2. Как работает обработчик кода php
- •1.3. Синтаксис php – начальные сведения
- •1.3.1. Как интерпретатор распознаёт (различает) код php
- •1.3.2. Синтаксис php разрешает совместное и раздельное использование кода php и html
- •Пример 1‑1
- •1.3.3. Другие особенности синтаксиса php начального уровня
- •Пример 1‑2
- •Наиболее часто применяемые символы управляющих последовательностей
- •1.4. Синтаксис php –типы данных, строки, переменные, константы, функции и выражения
- •1.4.1. Основы понятия «типы данных». Классификация данных в php
- •Скалярных типов (всего четыре):
- •Смешанных типов (всего 2):
- •Специальных типов (всего 2):
- •1.4.2. Интервалы значений числовых данных в php
- •1.4.2.1. Целые числа
- •1.4.2.2.Вещественные (с плавающей точкой) числа
- •1.4.3. Элементы языка, которые «держат» данные. Их синтаксис
- •1.4.3.1. Постановка задачи
- •1.4.3.2. Строки
- •Пример 1‑3
- •Пример 1‑4
- •1.4.3.3. Переменные
- •Пример 1‑5
- •Пример 1‑6
- •Пример 1‑7
- •1.4.3.4. Константы
- •Пример 1‑8
- •1.4.3.5. Функции в php – введение в тему
- •Пример 1‑9 – обобщённая схема определения функции
- •Пример 1‑10
- •1.4.3.6. Функции php по работе с данными
- •Пример 1‑11
- •Пример 1‑12
- •Пример 1‑13
- •Пример 1‑14
- •Пример 1‑15
- •1.4.3.7. Функции php по работе со строками
- •Пример 1‑16
- •Пример 1‑17
- •Пример 1‑18
- •Пример 1‑19
- •1.4.3.8. Понятие «выражение» в php
- •1.4.3.9. Манипуляции с типами
- •Глава 2. Синтаксис и семантика операторов php
- •2.1. Классификация операторов php и порядок их выполнения
- •О ператоры php в порядке убывания приоритета
- •2.2. Математические операторы
- •2.2.1. Арифметические операции
- •Арифметические операторы php
- •Пример 2‑20
- •2.2.2. Математические функции
- •2.2.3. Операторы присваивания
- •Пример 2‑21
- •2.2.4. Операторы инкремента (увеличения) и декремента (уменьшения)
- •Пример 2‑22
- •2.2.5. Строковые операторы
- •Пример 2‑23
- •2.2.6. Побитовые операторы
- •Пример 2‑24
- •Побитовые операторы php
- •2.2.7. Класс логических операторов
- •2.2.8. Операторы (конструкции) управления выполнением скрипта
- •2.2.8.1. Операторы условного перехода
- •If ( условие )
- •Пример 2‑25
- •2.2.8.2. Расширение оператора if - оператор elseif
- •If (выражение) блок_выполнения
- •Пример 2‑26
- •Пример 2‑27
- •Оператор переключения "switch" ("выбор")
- •Пример 2‑28
- •2.2.9. Операторы цикла
- •2.2.9.1. Простейший оператор цикла – цикл с предусловием - оператор while
- •While (выражение) {блок_выполнения}20
- •While (выражение): блок_выполнения endwhile;
- •Пример 2‑29
- •2.2.9.2. Цикл с постусловием - оператор do while
- •2.2.9.3. Циклы for
- •Пример 2‑30
- •Пример 2‑31
- •Пример 2‑32
- •2.2.9.4. Частные случаи использования цикла for в php
- •Пример 2‑33
- •Пример 2‑34
- •Пример 2‑35
- •Пример 2‑36
- •2.2.9.5. Об альтернативном синтаксисе операторов цикла
- •Глава 3. Массивы
- •3.1. Общие вопросы использования массивов в php: определение, типы, использование в выражениях и размерность
- •3.2. Создание массивов и особенности их использования в php
- •Пример 3‑37
- •Пример 3‑38
- •3.3. Операции с массивами
- •3.3.1. Вывод элементов массива на экран
- •Пример 3‑39
- •3.3.2. Изменение, перебор элементов и удаление элементов массива
- •Пример 3‑40
- •Пример 3‑41
- •3.3.3. Сортировка массива
- •Пример 3‑42 - сортировка массивов
- •Array(день1,день3, день11, день111);
- •Array(5,1,3,день1,день5,день3,day1,"яблоко","груша","apple")
- •3.3.4. Преобразование строк в массивы и наоборот
- •Пример 3‑43
- •3.3.5. Примеры специальных функций обработки массивов
- •Extract (имя_массива)
- •Пример 3‑44 - использование array_merge() с параметрами разных типов в php 5
- •Пример 3‑45 – обработка массивов
- •3.3.6. Функции по работе с массивами для самостоятельного изучения
- •3.4. Многомерные массивы
- •3.4.1. Введение
- •Пример 3‑46
- •3.4.2. Создание многомерных массивов
- •Пример 3‑47
- •Пример 3‑48
- •3.4.3. Ссылки на элементы многомерных массивов
- •3.4.4. Перебор элементов многомерных массивов
- •Пример 3‑49
- •3.4.5. Операторы над массивами
- •Операторы над массивами
- •Пример 3‑50
- •Глава 4.Функции
- •4.1. Введение
- •4.2.Создание, подключение и использование собственных функций в php
- •4.2.1. Синтаксис описания функции
- •4.2.2. Описание работы функции навигации по страницам сайта
- •4.2.3. Архитектура проекта, иллюстрирующего работу функции
- •Пример 4-1 - код «простого» решения
- •Пример 4‑2 - текст файла index.Php
- •4.3. Передача данных в функцию
- •4.3.1. Передача в функцию списка простых данных
- •Пример 4‑6
- •Пример 4‑7
- •4.3.2. Передача массивов в функцию
- •Пример 4‑8
- •Пример 4‑9
- •4.3.3. Функции с переменным числом аргументов
- •Пример 4‑10
- •4.3.4. Два способа передачи аргументов в функцию
- •4.3.5. Ссылка в php
- •4.3.6. Передача аргументов в функцию по ссылке
- •Пример 4‑11
- •4.4. Организация возврата значений из функции в вызывающий её скрипт
- •4.4.1. Функции, возвращающие единичные (скалярные) значения
- •Пример 4‑12
- •Пример 4‑13
- •4.4.2. Функция, возвращающая массив. Использование списков
- •Пример 4‑14
- •4.4.3. Функция, возвращающая ссылки
- •Пример 4‑15
- •4.5. Типизация переменных в php по их «области действия», «видимости» и «времени жизни». Глобальные, суперглобальные и статические переменные
- •4.5.1. Общие положения
- •Пример 4‑16
- •4.5.2. Предопределённые переменные и суперглобальные массивы
- •Пример 4‑17
- •4.5.3. Статические переменные
- •Пример 4‑18
- •4.6. Дополнительные возможности работы с функциями в php
- •4.6.1 Переменные, ссылающиеся на функции
- •Пример 4‑19
- •4.6.2. Условное (динамическое) описание функций
- •Пример 4‑20
- •4.6.3. Вложенные функции и вложенные файлы
- •Где хранить эти файлы?
- •Какую команду надо использовать, чтобы вставлять файл в нужное место?
- •Какими должны быть синтаксис и расширение таких файлов?
- •Пример 4‑511
- •4.6.4. Обработка ошибок в функциях пользователя
- •Пример 4‑22
- •4.7. Рекурсивное использование функций
- •4.7.1. Рекурсивные и итеративные функции – в чём разница, недостатки и преимущества
- •Пример 4‑23
- •4.8. Основные итоги по теме «Функции»
- •Глава 5.Работа с файлами
- •5.1. Возможности работы с файлами в php
- •5.1.1. Введение
- •5.1.2. Понятия и термины, связанные с понятием «файл»
- •5.1.2.1. Понятие файла и файловой системы
- •Свойства файла
- •Операции и сущности, связанные с файлами
- •Бинарные (двоичные) и текстовые файлы
- •5.2. Функция открытия файла - базовая функция при работе с файлам. Особенности обращения к файлам
- •5.2.1. Синтаксис функции открытия файла
- •Пример 5‑52
- •5.2.2. Абсолютные и относительные пути (дорожки) до файла
- •5.2.3. Понятие унифицированного (единообразного) идентификатора ресурса - uri
- •5.2.4. Уточнение возможных ссылок на файлы и особенности работы с ними
- •Пример 5‑53
- •Пример 5‑54
- •Перечень некоторых предопределённых констант php
- •5.3. Примеры использования других функций для работы с файлами
- •5.3.1. Проверка существования файла
- •5.3.2. Проверка существования и размера файла
- •Int filesize(string имя_файла)
- •5.3.3. Закрытие файла после завершения работы с ним
- •Int fclose(int дескриптор файла)
- •5.3.4. Основные операции с открытыми файлами
- •5.3.4.1. Запись в файл
- •Int fwrite(int дескриптор, string stroka[, int длина])
- •5.3.4.2. Запись файла целиком
- •Пример 5‑55
- •5.3.4.3. Чтение из файла
- •Пример 5‑56
- •5.3.5. Специальные случаи чтения файлов
- •5.3.5.1. Чтение строк текста: функция fgets( )
- •5.3.5.2. Чтение строк текста c отбрасыванием html тегов: функция fgetss( )
- •5.3.5.3. Посимвольное чтение файла: функция fgetс( )
- •Пример 5‑57
- •5.3.5.4. Чтение файла в индексированный массив: функция file()
- •5.3.5.5. Чтение файла целиком в строку: функция file_get_contents()
- •5.3.5.6. Чтение файла с его синтаксическим разбором: функция fscanf()
- •Пример 5‑58
- •5.4. Функции для операций над каталогами
- •Перечень функций по работе с каталогами
- •5.4.1. Получение дорожки до текущего скрипта и его имени
- •5.4.2. Чтение всего содержимого каталога
- •Пример 5‑8
- •5.4.3. Печать дерева каталогов
- •Визуальное отображение дерева каталогов для текущего каталога ТекКат
- •Пример 5‑9
- •5.5. Общая классификация функций php по работе с файловой системой
- •Категории функций php по работе с файловой системой
- •5.6. Права пользователей по доступу к файлам
- •5.6.1. Определение прав доступа
- •5.6.2. Описание прав доступа в системе unix и их реализация
- •Пример записи прав доступа к файлу для разных групп пользователей
- •B. Матричный вид
- •5.6.3. Особенности управления доступом к файлу в php
- •Глава 6.Вопросы и задания
- •6.1. Вопросы и задания к главе 1(Основы языка php)
- •6.1.1.Контрольные вопросы к главе 1
- •6.1.2. Задания к главе 1
- •6.2. Вопросы и задания к главе 2 (Синтаксис и семантика операторов php)
- •6.2.1.Контрольные вопросы к главе 2
- •6.2.2. Задания к главе 2
- •6.3. Вопросы и задания к главе 3 (Массивы)
- •6.3.1.Контрольные вопросы к главе 3
- •6.3.2. Задания к главе 3
- •6.4. Вопросы и задания к главе 4(Функции)
- •6.4.1.Контрольные вопросы к главе 4
- •6.4.2. Задания к главе 4
- •6.5. Вопросы и задания к главе 5(Работа с файлами)
- •6.5.1.Контрольные вопросы к главе 5
- •6.5.2. Задания к главе 5
- •Рекомендованные для работы с пособием источники
- •32 Монтирование файловой системы — процесс, подготавливающий раздел диска к использованию операционной системой.
Пример 5‑52
; Paths and Directories ;
; UNIX: "/path1:/path2"
;include_path = ".:/php/includes"
; Windows: "\path1;\path2"
;include_path = ".;c:\php\includes"
; PHP's default setting for include_path is ".;/path/to/php/pear"
; http://php.net/include-path
include_path = ".;D:\xampp\php\PEAR"39
resource zcontext – задаёт контекст файла. Это набор параметров, предназначенный для дополнительной настройки процессов обработки данных при их записи в файл или чтения из файла. В данном пособии не рассматривается (как и в большинстве учебников по PHP).
В случае удачного открытия файла, функция fopen возвращает дескриптор40 файла (именно поэтому, в синтаксисе определения функции стоит необязательное при использовании определение типа результата int), в случае неудачи - false.
Дескриптор файла представляет собой указатель на открытый файл, который используется операционной системой для поддержки операций с этим файлом и представляет собой уникальное число. Возвращенный функцией дескриптор файла необходимо затем указывать во всех функциях, которые в дальнейшем будут работать с этим файлом.
Не следует путать дескриптор файла и файловый указатель, который предназначен для указания положения точки ввода/вывода относительно начала открытого файла.
5.2.2. Абсолютные и относительные пути (дорожки) до файла
В этом и следующем разделах приводятся сведения, позволяющие разобраться в деталях и правильно применить пути до файлов при реализации операций с ними.
Обычно под дорожкой файлов понимают запись:
С:// имя_папки1/…/имя_папкиN/имяфайла
На эту запись очень похожа следующая:
http://site.ru/file.html
Однако, это - не путь до файла. Это - виртуальный адрес файла, так называемый URI41, с которым работает браузер. Рассмотрим подробнее, чем отличаются эти две записи.
Адрес файла является виртуальным, как и сам Web-сервер. Сайт существует как бы в двух измерениях – реальном и виртуальном.
Для всех посетителей - это виртуальный Web-сервер, на котором не существует файлов. В частности, если иметь в виду приведённый выше адрес - файла file.html.
Для разработчика сайта - это программа, выполняющаяся на совершенно конкретном реальном компьютере, с совершенно конкретным жестким диском, каталогами и файлами. И скрипт, работая со своими данными, подгружая другие скрипты, работает именно с реальными файлами, на физическом диске.
Вот в этом различии и кроются трудности, с которыми часто сталкиваются новички: теряют файлы, путают ссылки с файлами, обращаются к локальным файлам по протоколу HTTP или пытаются вставить в скрипт (посредством операции include) файлы от корня Web-сервера.
А всего-то надо:
1. разобраться в абсолютных и относительных путях до реальных файлов;
2. различать корень Web-сервера, как его видит браузер, и корень файловой системы на диске.
Начнем с первого.
Если путь указывается от корня системы, то это путь абсолютный. Это как почтовый адрес в реальной жизни - откуда бы мы не двигались, по точному адресу всегда точно найдётся нужное место.
Примеры абсолютных путей:
/var/www/site/forum/index.php
/img/frame.gif
с:\windows\command.com
В UNIX (ЮНИКС) - системах и на Web-сайтах корень обозначается косой чертой - "/".
Это очень важно, так как это не просто палочка, а самостоятельный адрес, путь. В адресе http://www.site.ru/ последняя косая черта не для красоты! Она обозначает вполне конкретный адрес - начало сайта.
На диске в ЮНИКС-системах так же можно набрать "cd /" и ты попадешь в корневой каталог.
В Windows-системах файловая система разбивается по дискам, поэтому, в абсолютном адресе надо указывать имя диска. Абсолютного корня всей файловой системы в Windows нет, у каждого диска – свой корень. Например, C:\ E:\ . Поэтому, даже если путь в Windows начинается с косой черты, то это не абсолютный путь, а относительный. Относительно текущего места на диске! А абсолютный путь всегда должен начинаться с буквы.
Если в начале пути корень не указать, то этот путь будет относительным, и он достраивается от текущего положения. В реальной жизни это напоминает совет, как найти магазин - "пройти два квартала прямо (с этого места), затем повернуть налево и там все время прямо". Дойти по такому пути можно только из конкретной точки. Если следовать совету, начиная путь из другой точки, то попадешь уже в иное место.
Самый простой пример относительного пути - это просто имя файла. Если файл находится в том же каталоге (папке), с которым работает программа - она его найдет, добавив текущий путь к имени файла. Текущий путь – это путь каталога, в котором находится работающая программа.
Ниже приведены примеры, из которых понятны принципы указания относительных путей (дорожек) до файла:
file.php (файл лежит в той же папке, в которой лежит работающая программа);
./file.php (файл лежит в той же папке; такая запись иногда требуется в некоторых ЮНИКС-системах);
images/picture.jpg (файл лежит в папке (каталоге) images, которая находится в текущей);
../file.php (файл лежит в папке, которая расположена на один уровень выше от текущей);
../../file.php (файл лежит в папке, которая расположена на два уровня выше от текущей).
И операционная система, и браузер, встретив относительный путь, достраивают его до абсолютного пути, но каждый - по-своему.
Теперь перейдём к рассмотрению второго пункта нашей программы, а именно, к выяснению, чем корень (корневая папка) каталога Web-сервера, как его видит браузер, отличается от корня (корневой папки) файловой системы на диске.
На диске путь к файлу скрипта может быть таким:
/var/www/site/forum/index.php
В то же время, виртуальный адрес этого скрипта при просмотре через браузер, будет:
http://www.site.ru/forum/index.php
В этом примере можно увидеть, где пересекаются два измерения: у этих двух адресов есть общая часть - /forum/index.php - она-то и служит причиной путаницы.
Для браузера это самый полный путь, который только может быть. Он начинается от корня сайта. Для скрипта же, исполняющегося на сервере - это всего лишь часть пути. Для скрипта путь /forum/index.php окажется несуществующим - в корне диска нет каталога forum! Чтобы получить полный путь для того, что на сайте выглядит как /forum/index.php, надо приставить слева к нему путь к папке, которая считается корневой для всего Web-сервера.
В нашем примере - это /var/www/site.
Эта часть пути задается в конфигурации реального Web-сервера, и именно он содержится в глобальной42 предопределённой системной переменной PHP (о глобальных системных переменных подробнее рассказано при обсуждении примера Пример 5 -53).
$_SERVER['DOCUMENT_ROOT'].
$_SERVER - это так называемый предопределённый массив43, причём один из самых важных. В него PHP-интерпретатор помещает переменные, полученные от сервера. Без данных переменных сложно организовать полноценную поддержку Web-приложений.
В виртуальном же сервере - том, который видит пользователь - наоборот, нет никакого диска. Есть корень сайта. Поэтому для того, чтобы любая ссылка гарантированно работала, независимо от того, из какого места сайта она вызывается, она должна быть абсолютной.
Рассмотрим следующий пример. Допустим, у вас на сайте есть два раздела:
http://www.site.ru/about/info.php
и
http://www.site.ru/job/vacancy.php
Если в файле info.php сделать ссылку просто на vacancy.php, то браузер ее не найдет - он будет искать адрес http://www.site.ru/about/vacancy.php, достраивая путь от текущего каталога. Поэтому надо писать полный путь от корня сайта - /job/vacancy.php
Всё это касается, естественно, не только тегов HTML <a>, но и <img>, и любых других, где используются ссылки на другие файлы.
Ссылки на локальные адреса следует писать без указания протокола и домена - только путь от корня сайта - /job/vacancy.php. Ссылки же на другие сайты следует писать полностью - http://www.site1.ru/job/vacancy.php.
PHP предоставляет развитые средства для работы с файлами, каталогами и URL-ами. Одним из них является константа глобальная __FILE__44, которая всегда содержит имя текущего исполняемого файла. Мы будем использовать эту константу в примерах.