Предисловие | 17 |
|
Введение | 18 |
|
1. Что нового в РНР 5 | 26 |
1.1. Введение | 26 |
1.2. Возможности языка | 26 |
1.2.1. Новая объектно-ориентированная модель | 26 |
1.2.2. Новые объектно-ориентированные особенности | 28 |
1.2.3. Прочие нововведения в язык программирования | 32 |
1.3. Основные изменения в расширениях РНР | 33 |
1.3.1. XML и веб-сервисы | 33 |
1.4. Другие новшества в РНР 5 | 37 |
1.4.1. Новый диспетчер памяти | 37 |
1.4.2. Отказ от поддержки Windows 95 | 37 |
1.5. Подведение итогов | 37 |
|
2. Основы языка программирования РНР 5 | 38 |
2.1. Введение | 38 |
2.2. Порядок внедрения кода РНР в HTML-страницы | 38 |
2.3. Комментарии | 39 |
2.4. Переменные | 40 |
2.4.1. Косвенные ссылки на переменные | 41 |
2.4.2. Действия с переменными | 41 |
2.4.3. Суперглобальные переменные | 43 |
2.5. Основные типы данных | 43 |
2.5.1. Целые числа | 44 |
2.5.2. Числа с плавающей точкой | 44 |
2.5.3. Строки | 44 |
2.5.4. Логический тип | 47 |
2.5.5. Специальный тип Null | 48 |
2.5.6. Ресурсы | 48 |
2.5.7. Массивы | 49 |
2.5.8. Константы | 55 |
2.6. Операторы | 56 |
2.6.1. Бинарные операторы | 57 |
2.6.2. Оператор присваивания | 57 |
2.6.3. Операторы сравнения | 58 |
2.6.4. Логические операторы | 59 |
2.6.5. Битовые операции | 60 |
2.6.6. Унарные операторы | 61 |
2.6.7. Оператор отрицания | 61 |
2.6.8. Операторы инкремента и декремента | 61 |
2.6.9. Операторы приведения типа | 62 |
2.6.10. Оператор подавления вывода сообщений об ошибках | 63 |
2.6.11. Единственный тернарный оператор | 63 |
2.7. Конструкции, управляющие ходом выполнения сценария | 64 |
2.7.1. Условные операторы | 64 |
2.7.2. Циклы | 66 |
2.7.3. Конструкции подключения внешних файлов | 70 |
2.8. Функции | 72 |
2.8.1. Пользовательские функции | 73 |
2.8.2. Область видимости функций | 73 |
2.8.3. Возврат величин по значению | 74 |
2.8.4. Возврат значений по ссылке | 75 |
2.8.5. Входные аргументы функций | 75 |
2.8.6. Статические переменные | 77 |
2.9. Подведение итогов | 77 |
|
3. РНР 5 — объектно-ориентированный язык программирования | 78 |
3.1. Введение | 78 |
3.2. Объекты | 79 |
3.3. Объявление класса | 80 |
3.4. Ключевое слово new и конструкторы | 81 |
3.5. Деструкторы | 81 |
3.6. Доступ к методам и свойствам с помощью переменной $this | 82 |
3.6.1. Ограничение области видимости свойств объекта | 83 |
3.6.2. Ограничение области видимости методов объекта | 84 |
3.6.3. Статические свойства | 85 |
3.6.4. Статические методы | 87 |
3.7. Константы класса | 88 |
3.8. Клонирование объектов | 88 |
3.9. Полиморфизм | 90 |
3.10. Зарезервированные имена parent и self | 92 |
3.11. Оператор instanceof | 93 |
3.12. Абстрактные методы и классы | 94 |
3.13. Интерфейсы | 96 |
3.14. Интерфейсы и наследование | 98 |
3.15. Финальные методы | 98 |
3.16. Финальные классы | 99 |
3.17. Метод __toString() | 99 |
3.18. Обработка исключений | 100 |
3.19. Функция __autoload() | 103 |
3.20. Определение типов входных аргументов функций | 105 |
3.21. Подведение итогов | 106 |
|
4. РНР 5 — дополнительные возможности ООП и шаблоны проектирования | 107 |
4.1. Введение | 107 |
4.2. Возможности перезагрузки | 107 |
4.2.1. Перехват обращений к свойствам и методам | 107 |
4.2.2. Виртуальные массивы | 110 |
4.3. Итераторы | 111 |
4.4. Шаблоны проектирования | 116 |
4.4.1. Шаблон стратегии | 116 |
4.4.2. Шаблон единственного экземпляра класса в приложении | 118 |
4.4.3. Шаблон фабрики классов | 119 |
4.4.4. Шаблон Observer (Наблюдатель) | 123 |
4.5. Рефлексия | 125 |
4.5.1. Введение | 125 |
4.5.2. Прикладной интерфейс рефлексии | 125 |
4.5.3. Примеры применения рефлексии | 127 |
4.5.4. Реализация шаблона делегирования с использованием рефлексии | 128 |
4.6. Подведение итогов | 130 |
|
5. Создание веб-приложений на языке РНР | 131 |
5.1. Введение | 131 |
5.2. Встраивание кода РНР в HTML-страницы | 132 |
5.3. Ввод пользователя | 134 |
5.4. Меры предосторожности при обработке данных, получаемых от пользователя | 136 |
5.4.1. Распространённые ошибки | 137 |
5.5. Способы защиты от атак | 139 |
5.5.1. Проверка ввода | 140 |
5.5.2. Проверка методом НМАС | 141 |
5.5.3. PEAR::Crypt_HMAC | 143 |
5.5.4. Входной фильтр | 146 |
5.5.5. Работа с паролями | 146 |
5.5.6. Обработка ошибок | 148 |
5.6. Cookies | 149 |
5.7. Сессии | 153 |
5.8. Отправка файлов на сервер | 156 |
5.8.1. Обработка присланных файлов | 157 |
5.9. Архитектура веб-приложения | 161 |
5.9.1. Всё в одном | 161 |
5.9.2. Один сценарий — одна функция | 163 |
5.9.3. Отделение логики от способа представления информации | 163 |
5.10. Подведение итогов | 165 |
|
6. Работа с базами данных в РНР 5 | 166 |
6.1. Введение | 166 |
6.2. MySQL | 167 |
6.2.1. Сильные и слабые стороны MySQL | 167 |
6.2.2. Интерфейс для работы с MySQL | 168 |
6.2.3. Пример базы данных | 168 |
6.2.4. Соединение с базой данных | 169 |
6.2.5. Буферизованные и небуферизованные запросы | 171 |
6.2.6. Запросы | 171 |
6.2.7. Одновременное исполнение нескольких запросов | 172 |
6.2.8. Режимы выборки строк | 173 |
6.2.9. Параметризованные запросы | 174 |
6.2.10. Обработка BLOB-полей | 176 |
6.3. SQLite | 178 |
6.3.1. Слабые и сильные стороны SQLite | 178 |
6.3.2. Область применения | 179 |
6.3.3. Интерфейс для работы SQLite | 180 |
6.4. PEARDB | 196 |
6.4.1. Установка PEARDB | 196 |
6.4.2. «За» и «против» уровня абстракции | 196 |
6.4.3. Что подвергается абстрагированию | 197 |
6.4.4. Соединение с базой данных | 197 |
6.4.5. Исполнение запросов | 199 |
6.4.6. Выборка результатов | 202 |
6.4.7. Последовательности | 204 |
6.4.8. Обеспечение переносимости | 206 |
6.4.9. Абстрагирование кодов ошибок | 207 |
6.4.10. Прочие методы выборки результатов | 209 |
6.5. Подведение итогов | 211 |
|
7. Обработка ошибок | 212 |
7.1. Введение | 212 |
7.2. Типы ошибок | 213 |
7.2.1. Ошибки в программе | 213 |
7.2.2. Неопределённые символы | 215 |
7.2.3. Ошибки переносимости | 218 |
7.2.4. Ошибки времени исполнения | 222 |
7.2.5. Механизм обработки ошибок в РНР | 222 |
7.3. Механизм обработки ошибок в PEAR | 228 |
7.3.1. Класс PEAR_Error | 232 |
7.3.2. Обработка ошибок PEAR | 235 |
7.3.3. Режимы обработки ошибок PEAR | 236 |
7.3.4. Дополнительные способы обработки ошибок | 237 |
7.4. Исключения | 240 |
7.4.1. Что такое исключения | 240 |
7.4.2. try, catch и throw | 240 |
7.5. Подведение итогов | 242 |
|
8. XML и РНР 5 | 243 |
8.1. Введение | 243 |
8.2. Терминология | 244 |
8.3. Синтаксический анализ XML | 246 |
8.3.1. SAX | 246 |
8.3.2. DOM | 250 |
8.4. SimpleXML | 255 |
8.4.1. Создание объекта SimpleXML | 255 |
8.4.2. Обзор объектов SimpleXML | 256 |
8.4.3. Сохранение объектов SimpleXML | 257 |
8.5. PEAR | 257 |
8.5.1. Класс XML_Tree | 258 |
8.5.2. Класс XML_RSS | 259 |
8.6. Преобразование XML | 262 |
8.6.1. XSLT | 262 |
8.7. XML и взаимодействие между различными системами | 266 |
8.7.1. XML-RPC | 267 |
8.7.2. SOAP | 274 |
8.8. Подведение итогов | 281 |
|
9. Основные расширения | 282 |
9.1. Введение | 282 |
9.2. Файлы и потоки | 283 |
9.2.1. Доступ к файлам | 283 |
9.2.2. Потоки ввода и вывода программ | 285 |
9.2.3. Стандартные потоки ввода-вывода | 288 |
9.2.4. Потоки со сжатыми данными | 289 |
9.2.5. Пользовательские потоки | 291 |
9.2.6. Потоки с доступом по URL | 292 |
9.2.7. Блокировка | 297 |
9.2.8. Переименование и удаление файлов | 298 |
9.2.9. Временные файлы | 299 |
9.3. Регулярные выражения | 299 |
9.3.1. Синтаксис | 300 |
9.3.2. Функции | 314 |
9.4. Работа с датами и временем | 321 |
9.4.1. Функции получения даты и времени | 321 |
9.4.2. Форматированный вывод даты и времени | 325 |
9.4.3. Преобразование строк в значения даты и времени | 333 |
9.5. Работа с изображениями | 335 |
9.5.1. Пример 1: защита от заполнения и посылки форм |
автоматизированными средствами | 336 |
9.5.2. Пример 2: гистограмма | 341 |
9.5.3. Exif | 347 |
9.6. Кодировки и многобайтные символы | 349 |
9.6.1. Преобразование из одной кодировки в другую | 351 |
9.6.2. Дополнительные функции для работы |
с наборами символов | 356 |
9.6.3. Языковые настройки | 360 |
9.7. Подведение итогов | 363 |
|
10. Библиотека PEAR | 365 |
10.1. Введение | 365 |
10.2. Основные понятия PEAR | 366 |
10.2.1. Пакеты | 366 |
10.2.2. Выпуски | 366 |
10.2.3. Нумерация версий | 367 |
10.3. Установка PEAR | 370 |
10.3.1. Установка из дистрибутива PHP в ОС UNIX/Linux | 370 |
10.3.2. Установка с помощью PHP Windows Installer | 371 |
10.3.3. go-pear.org | 372 |
10.4. Установка пакетов | 376 |
10.4.1. Работа с командой pear | 376 |
10.5. Параметры конфигурации | 379 |
10.6. Команды PEAR | 386 |
10.6.1. pearinstall | 386 |
10.6.2. pear list | 391 |
10.6.3. pearinfo | 392 |
10.6.4. pear list-all | 393 |
10.6.5. pear list-upgrades | 393 |
10.6.6. pearupgrade | 394 |
10.6.7. pear upgrade-all | 395 |
10.6.8. pear uninstall | 396 |
10.6.9. pearsearch | 396 |
10.6.10. pear remote-list | 397 |
10.6.11. pear remote-info | 398 |
10.6.12. pear download | 398 |
10.6.13. pearconfig-get | 399 |
10.6.14. pearconfig-set | 399 |
10.6.15. pearconfig-show | 399 |
10.6.16. Сокращения | 400 |
10.7. Пользовательские интерфейсы инсталлятора | 401 |
10.7.1. Интерфейс командной строки | 401 |
10.7.2. Графический интерфейс на базе библиотеки Gtk | 401 |
10.8. Подведение итогов | 404 |
|
11. Наиболее важные пакеты библиотеки PEAR | 405 |
11.1. Введение | 405 |
11.2. Пакеты для работы с базами данных | 405 |
11.3. Шаблоны | 405 |
11.3.1. Терминология | 406 |
11.3.2. HTML_Template_IT | 406 |
11.3.3. HTML_Template_Flexy | 410 |
11.4. Аутентификация | 415 |
11.4.1. Краткий обзор | 415 |
11.4.2. Пример: Auth и файл паролей | 415 |
11.4.3. Пример: Auth и DB | 416 |
11.4.4. Вопросы безопасности в Auth | 419 |
11.4.5. Вопросы масштабирования | 420 |
11.4.6. В заключение о пакете Auth | 421 |
11.5. Формы | 421 |
11.5.1. HTML_QuickForm | 421 |
11.5.2. Пример: форма регистрации | 422 |
11.5.3. Приём данных | 422 |
11.6. Кэширование | 422 |
11.6.1. Cache_Iite | 423 |
11.7. Подведение итогов | 424 |
|
12. Разработка компонентов PEAR | 425 |
12.1. Введение | 425 |
12.2. Стандарты PEAR | 425 |
12.2.1. Вопросы именования | 426 |
12.2.2. Выравнивание блоков кода | 428 |
12.3. Нумерация версий выпусков | 430 |
12.4. Окружение командной строки | 431 |
12.5. Основы | 432 |
12.5.1. Как и когда подключать файлы | 433 |
12.5.2. Обработка ошибок | 434 |
12.6. Сборка пакетов | 434 |
12.6.1. Пример пакета Hello World | 434 |
12.6.2. Сборка файла пакета | 436 |
12.6.3. Проверка | 437 |
12.6.4. Проведение тестовых испытаний | 438 |
12.7. Формат файла package.xml | 439 |
12.7.1. Информация о пакете | 439 |
12.7.2. Сведения о версии пакета | 441 |
12.8. Зависимости | 445 |
12.8.1. Элемент <deps> | 446 |
12.8.2. Элемент <dep> | 446 |
12.8.3. Типы зависимостей | 447 |
12.8.4. Причины, по которым следует избегать зависимостей | 448 |
12.8.5. Необязательные зависимости | 449 |
12.8.6. Примеры | 449 |
12.9. Подстановка строк | 450 |
12.9.1. Элемент <гер1асе> | 450 |
12.9.2. Примеры | 450 |
12.10. Включение исходных текстов на языке С | 451 |
12.10.1. Элемент <configureoptions> | 451 |
12.10.2. Элемент <configureoption> | 451 |
12.11. Публикация пакетов | 452 |
12.12. Процесс публикации пакетов PEAR | 452 |
12.13. Упаковка | 453 |
12.13.1. Анализ исходных текстов | 453 |
12.13.2. Генерация контрольных сумм MD5 | 453 |
12.13.3. Обновление файла package.xml | 454 |
12.13.4. Создание архива | 455 |
12.14. Передача на сервер | 455 |
12.14.1. Передача пакета на сервер | 455 |
12.14.2. Конец! | 455 |
12.15. Подведение итогов | 455 |
|
13. Вопросы миграции | 456 |
13.1. Введение | 456 |
13.2. Объектная модель | 456 |
13.3. Передача объектов в функции | 457 |
13.4. Режим совместимости | 458 |
13.4.1. Приведение типов объектов | 458 |
13.4.2. Сравнение объектов | 459 |
13.5. Прочие изменения | 460 |
13.5.1. Присваивание значений переменной $this | 460 |
13.5.2. get_class() | 463 |
13.6. Е_STRICT | 463 |
13.6.1. Автоматическое создание объектов | 463 |
13.6.2. Модификаторы var и public | 464 |
13.6.3. Конструкторы | 464 |
13.6.4. Унаследованные методы | 464 |
13.6.5. Объявление класса перед его использованием | 465 |
13.7. Прочие проблемы совместимости | 465 |
13.7.1. Интерфейс командной строки | 465 |
13.7.2. Комментарии | 466 |
13.7.3. MySQL | 467 |
13.8. Изменения в функциях | 467 |
13.8.1. array_merge() | 467 |
13.8.2. strrpos() и strripos() | 468 |
13.9. Подведение итогов | 469 |
|
14. Производительность | 470 |
14.1. Введение | 470 |
14.2. Проектирование высокопроизводительных приложений | 471 |
14.2.1. Совет 1: осторожнее с информацией о состоянии приложения | 471 |
14.2.2. Совет 2: кэшируйте данные! | 472 |
14.2.3. Совет 3: главное — не переусердствовать! | 478 |
14.3. Тестирование производительности | 479 |
14.3.1. ApacheBench | 479 |
14.3.2. Siege | 480 |
14.3.3. Недостатки тестирования | 480 |
14.4. Профилирование с помощью пакета Zend Studio | 481 |
14.5. Профилирование с помощью APD | 483 |
14.5.1. Установка APD | 483 |
14.5.2. Анализ полученных данных | 484 |
14.6. Профилирование с помощью XDebug | 487 |
14.6.1. Установка XDebug | 487 |
14.6.2. Трассировка сценариев | 488 |
14.6.3. KCachegrind | 490 |
14.7. АРС | 492 |
14.8. ZPS | 493 |
14.8.1. Автоматическая оптимизация | 493 |
14.8.2. Кэширование скомпилированного кода | 494 |
14.8.3. Динамическое кэширование страниц | 496 |
14.8.4. Сжатие содержимого страниц | 499 |
14.9. Оптимизация кода | 500 |
14.9.1. Микротесты | 500 |
14.9.2. Переписывание кода РНР на языке С | 503 |
14.9.3. Сравнение процедурного |
и объектно-ориентированного подходов | 503 |
14.10. Подведение итогов | 504 |
|
15. Введение в разработку расширений РНР | 505 |
15.1. Введение | 505 |
15.2. Начало | 506 |
15.2.1. Управление памятью | 511 |
15.2.2. Возврат значений из функций | 512 |
15.2.3. Завершение реализации self_concat() | 513 |
15.2.4. Итоги примера | 514 |
15.2.5. Расширения-обёртки вокруг библиотек |
сторонних производителей | 515 |
15.2.6. Глобальные переменные | 525 |
15.2.7. Добавление параметров конфигурации в php.ini | 526 |
15.2.8. Макроопределения, управляющие ресурсами |
в многопоточной среде | 528 |
15.3. Подведение итогов | 529 |
|
16. Создание сценариев командной строки на РНР | 530 |
16.1. Введение | 530 |
16.2. Сценарии командной строки на РНР | 531 |
16.2.1. Чем CLI отличается от CGI | 531 |
16.2.2. Окружение сценариев командной строки | 533 |
16.2.3. Разбор параметров командной строки | 535 |
16.2.4. Рекомендации | 538 |
16.2.5. Управление процессами | 540 |
16.2.6. Примеры | 544 |
16.3. Подведение итогов | 549 |
|
A. Каталог пакетов PEAR и PECL | 550 |
|
B. Краткий справочник по работе с phpDocumentor | 647 |
|
C. Краткое руководство пользователя Zend Studio | 674 |
|
Алфавитный указатель | 687 |