Глава 24. Работа с каталогами……………………………………………………………… 502
Текущий каталог……………………………………………………………………………………………………………………… 502
Создание каталога…………………………………………………………………………………………………………………… 503
Работа с записями……………………………………………………………………………………………………………………. 504
Рекурсивный обход каталога…………………………………………………………………………………………………. 505
Фильтрация содержимого каталога………………………………………………………………………………………. 506
Удаление каталога………………………………………………………………………………………………………………….. 508
Класс Directory…………………………………………………………………………………………………………………………. 509
Резюме………………………………………………………………………………………………………………………………………. 511
Глава 25. Права доступа и атрибуты файлов……………………………………….. 512
Идентификатор пользователя…………………………………………………………………………………………………. 512
Идентификатор группы…………………………………………………………………………………………………………… 513
Владелец файла……………………………………………………………………………………………………………………….. 514
Права доступа………………………………………………………………………………………………………………………….. 514
Числовое представление прав доступа………………………………………………………………………….. 515
Особенности каталогов…………………………………………………………………………………………………… 515
Примеры……………………………………………………………………………………………………………………………. 517
Домашний каталог пользователя………………………………………………………………………….. 517
Защищенный от записи файл…………………………………………………………………………………. 517
CGI-скрипт………………………………………………………………………………………………………………. 517
Системные утилиты………………………………………………………………………………………………… 517
Закрытые системные файлы………………………………………………………………………………….. 518
Функции PHP……………………………………………………………………………………………………………………………. 518
Назначение прав доступа……………………………………………………………………………………………….. 518
Определение атрибутов файла……………………………………………………………………………………….. 520
Специальные функции……………………………………………………………………………………………. 521
Определение типа файла……………………………………………………………………………………….. 522
Определение возможности доступа……………………………………………………………………………….. 523
Ссылки………………………………………………………………………………………………………………………………………. 524
Символические ссылки……………………………………………………………………………………………………. 524
Жесткие ссылки………………………………………………………………………………………………………………… 524
Резюме………………………………………………………………………………………………………………………………………. 525
Глава 26. Запуск внешних программ……………………………………………………. 526
Запуск утилит…………………………………………………………………………………………………………………………… 526
Оператор «обратные кавычки»………………………………………………………………………………………………. 528
Экранирование командной строки………………………………………………………………………………………… 528
Каналы……………………………………………………………………………………………………………………………………… 529
Временные файлы……………………………………………………………………………………………………………. 529
Открытие канала……………………………………………………………………………………………………………… 530
Взаимная блокировка (deadlock)……………………………………………………………………………………. 531
Резюме………………………………………………………………………………………………………………………………………. 533
Глава 27. Работа с датой и временем……………………………………………………. 534
Представление времени в формате timestamp………………………………………………………………………. 534
Вычисление времени работы скрипта……………………………………………………………………………. 535
Большие вещественные числа………………………………………………………………………………………… 536
Построение строкового представления даты………………………………………………………………… 537
Построение timestamp……………………………………………………………………………………………………… 539
Разбор timestamp……………………………………………………………………………………………………………… 541
Календарик………………………………………………………………………………………………………………………………. 542
Географическая привязка……………………………………………………………………………………………………….. 544
Хранение абсолютного времени…………………………………………………………………………………….. 547
Перевод времени………………………………………………………………………………………………………………. 548
Окончательное решение задачи……………………………………………………………………………………… 549
Календарные классы PHP………………………………………………………………………………………………………. 549
Класс DateTime…………………………………………………………………………………………………………………. 549
Класс DateTimeZone…………………………………………………………………………………………………………. 551
Класс DateInterval……………………………………………………………………………………………………………. 551
Класс DatePeriod……………………………………………………………………………………………………………… 553
Резюме………………………………………………………………………………………………………………………………………. 554
Глава 28. Основы регулярных выражений…………………………………………… 555
Начнем с примеров………………………………………………………………………………………………………………….. 555
Пример первый…………………………………………………………………………………………………………………. 555
Пример второй………………………………………………………………………………………………………………….. 556
Пример третий………………………………………………………………………………………………………………….. 556
Пример четвертый……………………………………………………………………………………………………………. 557
Что такое регулярные выражения?………………………………………………………………………………………… 558
Терминология…………………………………………………………………………………………………………………………… 558
Использование регулярных выражений в PHP……………………………………………………………………… 559
Сопоставление…………………………………………………………………………………………………………………. 559
Сопоставление с заменой………………………………………………………………………………………………… 560
Язык регулярных выражений…………………………………………………………………………………………………. 561
Ограничители…………………………………………………………………………………………………………………… 561
Альтернативные ограничители……………………………………………………………………………… 562
Отмена действия спецсимволов…………………………………………………………………………….. 563
Простые символы…………………………………………………………………………………………………………….. 564
Классы символов…………………………………………………………………………………………………….. 564
Альтернативы………………………………………………………………………………………………………….. 564
Отрицательные классы…………………………………………………………………………………………… 566
Квантификаторы повторений…………………………………………………………………………………………. 566
Ноль или более совпадений…………………………………………………………………………………… 566
Одно или более совпадений…………………………………………………………………………………… 566
Ноль или одно совпадение…………………………………………………………………………………….. 567
Заданное число совпадений………………………………………………………………………………….. 567
Мнимые символы……………………………………………………………………………………………………………… 567
Оператор альтернативы………………………………………………………………………………………………….. 568
Группирующие скобки…………………………………………………………………………………………………….. 568
«Карманы»………………………………………………………………………………………………………………………… 568
Карманы в функции замены…………………………………………………………………………………… 570
Карманы в функции сопоставления………………………………………………………………………. 571
Игнорирование карманов………………………………………………………………………………………. 572
Именованные карманы…………………………………………………………………………………………… 572
«Жадность» квантификаторов………………………………………………………………………………………… 572
Рекуррентные структуры……………………………………………………………………………………….. 574
Модификаторы…………………………………………………………………………………………………………………. 574
Модификатор /i — игнорирование регистра……………………………………………………….. 574
Модификатор /x — пропуск пробелов и комментариев………………………………………. 574
Модификатор /m — многострочность…………………………………………………………………… 575
Модификатор /s — однострочный поиск……………………………………………………………… 576
Модификатор /u — UTF-8………………………………………………………………………………………. 576
Модификатор /U — инвертируем «жадность»……………………………………………………… 576
Незахватывающий поиск………………………………………………………………………………………………… 576
Позитивный просмотр вперед………………………………………………………………………………… 576
Негативный просмотр вперед………………………………………………………………………………… 577
Позитивный просмотр назад………………………………………………………………………………….. 577
Негативный просмотр назад………………………………………………………………………………….. 578
Другие возможности регулярных выражений……………………………………………………………….. 578
Функции PHP……………………………………………………………………………………………………………………………. 578
Поиск совпадений…………………………………………………………………………………………………………….. 578
Замена совпадений………………………………………………………………………………………………………….. 582
Разбиение по регулярному выражению…………………………………………………………………………. 585
Выделение всех уникальных слов из текста………………………………………………………… 585
Экранирование символов………………………………………………………………………………………………… 586
Фильтрация массива………………………………………………………………………………………………………… 587
Примеры регулярных выражений………………………………………………………………………………………….. 588
Преобразование адресов e-mail……………………………………………………………………………………… 588
Преобразование гиперссылок…………………………………………………………………………………………. 588
Быть или не быть?……………………………………………………………………………………………………………………. 589
Ссылки………………………………………………………………………………………………………………………………………. 590
Резюме………………………………………………………………………………………………………………………………………. 590
Глава 29. Разные функции…………………………………………………………………… 591
Информационные функции……………………………………………………………………………………………………… 591
Принудительное завершение программы……………………………………………………………………………… 593
Генерация кода во время выполнения……………………………………………………………………………………. 593
Функции хеширования…………………………………………………………………………………………………………….. 595
Подсветка PHP-кода………………………………………………………………………………………………………………… 600
Резюме………………………………………………………………………………………………………………………………………. 601
Часть V. Основы объектно-ориентированного программирования 603
Глава 30. Наследование……………………………………………………………………….. 605
Расширение класса………………………………………………………………………………………………………………….. 606
Метод включения…………………………………………………………………………………………………………….. 607
Недостатки метода включения……………………………………………………………………………… 608
Несовместимость типов………………………………………………………………………………………….. 609
Наследование…………………………………………………………………………………………………………………… 609
Переопределение методов………………………………………………………………………………………………. 611
Модификаторы доступа при переопределении…………………………………………………… 611
Доступ к методам базового класса……………………………………………………………………….. 611
Финальные методы…………………………………………………………………………………………………. 612
Запрет наследования……………………………………………………………………………………………… 612
Константы __CLASS__ и __METHOD__………………………………………………………………………… 613
Позднее статическое связывание……………………………………………………………………………………. 613
Анонимные классы………………………………………………………………………………………………………………….. 614
Полиморфизм……………………………………………………………………………………………………………………………. 616
Абстрагирование……………………………………………………………………………………………………………… 616
Виртуальные методы………………………………………………………………………………………………………. 621
Расширение иерархии……………………………………………………………………………………………………… 625
Абстрактные классы и методы……………………………………………………………………………………………….. 625
Совместимость родственных типов……………………………………………………………………………………….. 627
Уточнение типа в функциях…………………………………………………………………………………………….. 627
Оператор instanceof…………………………………………………………………………………………………………. 628
Обратное преобразование типа……………………………………………………………………………………… 629
Резюме………………………………………………………………………………………………………………………………………. 629
Глава 31. Интерфейсы………………………………………………………………………….. 630
Ограничения наследования…………………………………………………………………………………………………….. 630
Создание интерфейса………………………………………………………………………………………………………………. 633
Наследование интерфейсов……………………………………………………………………………………………………. 635
Реализация нескольких интерфейсов…………………………………………………………………………………….. 638
Реализует ли объект интерфейс?……………………………………………………………………………………………. 640
Резюме………………………………………………………………………………………………………………………………………. 641
Глава 32. Трейты………………………………………………………………………………….. 642
Создание трейта………………………………………………………………………………………………………………………. 642
Трейты и наследование…………………………………………………………………………………………………………… 645
Разрешение конфликтов………………………………………………………………………………………………………….. 648
Вложенные трейты………………………………………………………………………………………………………………….. 650
Резюме………………………………………………………………………………………………………………………………………. 651
Глава 33. Перечисления……………………………………………………………………….. 652
Создание перечисления…………………………………………………………………………………………………………… 652
Типизированные перечисления………………………………………………………………………………………………. 655
Сравнение значений………………………………………………………………………………………………………………… 658
Перечисления как классы……………………………………………………………………………………………………….. 658
Ограничения перечислений…………………………………………………………………………………………….. 658
Методы перечислений…………………………………………………………………………………………………….. 659
Использование трейтов……………………………………………………………………………………………………. 662
Константы………………………………………………………………………………………………………………………… 663
Резюме………………………………………………………………………………………………………………………………………. 664
Глава 34. Исключения………………………………………………………………………….. 665
Базовый синтаксис…………………………………………………………………………………………………………………… 665
Конструкция throw…………………………………………………………………………………………………………………… 667
Раскрутка стека……………………………………………………………………………………………………………………….. 667
Исключения и деструкторы…………………………………………………………………………………………………….. 668
Интерфейс класса Exception…………………………………………………………………………………………………… 670
Генерация исключений в классах………………………………………………………………………………………….. 672
Создание собственных исключений………………………………………………………………………………………. 675
Перехват собственных исключений………………………………………………………………………………………. 678
Повторная генерация исключений…………………………………………………………………………………………. 679
Блок finally……………………………………………………………………………………………………………………………….. 681
Использование интерфейсов…………………………………………………………………………………………………… 682
Резюме………………………………………………………………………………………………………………………………………. 684
Глава 35. Обработка ошибок……………………………………………………………….. 685
Что такое ошибка?…………………………………………………………………………………………………………………… 685
Роли ошибок……………………………………………………………………………………………………………………… 686
Виды ошибок……………………………………………………………………………………………………………………. 686
Ошибки и исключения……………………………………………………………………………………………………………… 687
Контроль ошибок…………………………………………………………………………………………………………………….. 689
Директивы контроля ошибок………………………………………………………………………………………….. 689
Установка режима вывода ошибок………………………………………………………………………………… 691
Оператор отключения ошибок……………………………………………………………………………………….. 692
Предостережения……………………………………………………………………………………………………. 693
Перехват ошибок……………………………………………………………………………………………………………… 693
Проблемы с оператором @……………………………………………………………………………………. 695
Генерация ошибок……………………………………………………………………………………………………………. 696
Стек вызовов функций……………………………………………………………………………………………………… 697
Резюме………………………………………………………………………………………………………………………………………. 699
Глава 36. Пространство имен……………………………………………………………….. 700
Проблема именования…………………………………………………………………………………………………………….. 700
Объявление пространства имен……………………………………………………………………………………………… 701
Иерархия пространства имен…………………………………………………………………………………………………. 705
Текущее пространство имен…………………………………………………………………………………………………… 706
Импортирование………………………………………………………………………………………………………………………. 707
Автозагрузка классов………………………………………………………………………………………………………………. 708
Функция spl_autoload_register()……………………………………………………………………………………… 708
Резюме………………………………………………………………………………………………………………………………………. 711
Глава 37. Шаблоны проектирования……………………………………………………. 712
Зачем нужны шаблоны проектирования?……………………………………………………………………………… 713
Одиночка (Singleton)………………………………………………………………………………………………………………… 713
Фабричный метод (Factory Method)………………………………………………………………………………………. 715
Модель-Представление-Контроллер…………………………………………………………………………………….. 720
Резюме………………………………………………………………………………………………………………………………………. 731
Глава 38. Итераторы…………………………………………………………………………….. 732
Стандартное поведение foreach…………………………………………………………………………………………….. 732
Интерфейсы для создания итераторов…………………………………………………………………………………… 733
Интерфейс Iterator……………………………………………………………………………………………………………. 734
Интерфейс IteratorAggregate…………………………………………………………………………………………… 736
Пример собственного итератора……………………………………………………………………………………. 737
Как PHP обрабатывает итераторы?………………………………………………………………………………………. 740
Множественные итераторы……………………………………………………………………………………………………. 740
Виртуальные массивы…………………………………………………………………………………………………………….. 741
Библиотека SPL……………………………………………………………………………………………………………………….. 743
Класс ArrayObject…………………………………………………………………………………………………………….. 744
Класс DirectoryIterator…………………………………………………………………………………………………….. 744
Класс FilterIterator…………………………………………………………………………………………………………… 745
Класс LimitIterator……………………………………………………………………………………………………………. 746
Рекурсивные итераторы………………………………………………………………………………………………….. 747
Резюме………………………………………………………………………………………………………………………………………. 748
Глава 39. Отражения……………………………………………………………………………. 749
Механизм отражений………………………………………………………………………………………………………………. 749
Отражение функции: ReflectionFunction……………………………………………………………………….. 750
Отражение параметра функции: ReflectionParameter………………………………………………….. 753
Отражение класса: ReflectionClass………………………………………………………………………………… 755
Пояснение: отражения и наследование…………………………………………………………………………. 760
Отражение свойства класса: ReflectionProperty…………………………………………………………… 762
Отражение метода класса: ReflectionMethod………………………………………………………………… 763
Отражение библиотеки расширения: ReflectionExtension……………………………………………. 765
Полезное добавление: класс Reflection………………………………………………………………………….. 766
Обработка исключений: ReflectionException………………………………………………………………… 767
Иерархия…………………………………………………………………………………………………………………………… 767
Резюме………………………………………………………………………………………………………………………………………. 767
Часть VI. Расширения PHP………………………………………………………….. 769
Глава 40. Подключение и настройка расширений……………………………….. 771
Подключение расширений……………………………………………………………………………………………………… 771
Конфигурационный файл php.ini…………………………………………………………………………………………… 773
Структура php.ini…………………………………………………………………………………………………………….. 773
Параметры языка PHP……………………………………………………………………………………………………… 774
Ограничение ресурсов…………………………………………………………………………………………………….. 776
Загрузка файлов……………………………………………………………………………………………………………….. 777
Обзор расширений…………………………………………………………………………………………………………………… 777
Резюме………………………………………………………………………………………………………………………………………. 778
Глава 41. Работа с PostgreSQL……………………………………………………………… 779
Что такое база данных?………………………………………………………………………………………………………….. 780
Неудобство работы с файлами………………………………………………………………………………………. 780
Почему PostgreSQL?…………………………………………………………………………………………………………. 781
Установка PostgreSQL……………………………………………………………………………………………………………… 782
Установка в Windows……………………………………………………………………………………………………….. 782
Установка в macos…………………………………………………………………………………………………………… 784
Установка в Linux Ubuntu……………………………………………………………………………………………….. 784
Администрирование базы данных…………………………………………………………………………………. 785
Введение в СУБД и SQL………………………………………………………………………………………………………….. 785
Первичные ключи…………………………………………………………………………………………………………….. 788
Управление базами данных……………………………………………………………………………………………. 790
Управление таблицами……………………………………………………………………………………………………. 792
Создание таблицы………………………………………………………………………………………………….. 792
Извлечение структуры таблицы……………………………………………………………………………. 793
Изменение структуры таблицы……………………………………………………………………………… 793
Удаление таблицы………………………………………………………………………………………………….. 796
Комментарии в SQL…………………………………………………………………………………………………………. 797
Вставка записей в таблицу……………………………………………………………………………………………… 798
Удаление записей…………………………………………………………………………………………………………….. 801
Обновление записей…………………………………………………………………………………………………………. 802
Выборка данных………………………………………………………………………………………………………………. 803
Условная выборка…………………………………………………………………………………………………… 804
Псевдонимы столбцов…………………………………………………………………………………………….. 807
Сортировка записей……………………………………………………………………………………………….. 808
Вывод записей в случайном порядке……………………………………………………………………. 811
Ограничение выборки…………………………………………………………………………………………….. 811
Вывод уникальных значений…………………………………………………………………………………. 812
Резюме………………………………………………………………………………………………………………………………………. 813
Глава 42. Расширение PDO………………………………………………………………….. 814
Настройка PDO………………………………………………………………………………………………………………………… 814
Установка соединения с базой данных…………………………………………………………………………………. 815
Выполнение SQL-запросов……………………………………………………………………………………………………… 816
Обработка ошибок…………………………………………………………………………………………………………………… 817
Извлечение данных………………………………………………………………………………………………………………….. 818
Параметризация SQL-запросов………………………………………………………………………………………………. 820
Заполнение связанных таблиц……………………………………………………………………………………………….. 822
Резюме………………………………………………………………………………………………………………………………………. 824
Глава 43. Работа с изображениями……………………………………………………….. 825
Универсальная функция getimagesize()………………………………………………………………………………….. 826
Работа с изображениями и библиотека GD…………………………………………………………………………… 827
Пример создания изображения………………………………………………………………………………………………. 828
Создание изображения……………………………………………………………………………………………………………. 829
Загрузка изображения…………………………………………………………………………………………………………….. 829
Определение параметров изображения…………………………………………………………………………………. 830
Сохранение изображения……………………………………………………………………………………………………….. 831
Преобразование изображения в палитровое………………………………………………………………………… 832
Работа с цветом в формате RGB…………………………………………………………………………………………….. 832
Создание нового цвета…………………………………………………………………………………………………….. 832
Текстовое представление цвета……………………………………………………………………………………… 833
Получение ближайшего в палитре цвета………………………………………………………………………. 833
Эффект прозрачности………………………………………………………………………………………………………. 834
Получение RGB-составляющих……………………………………………………………………………………… 835
Использование полупрозрачных цветов……………………………………………………………………….. 835
Графические примитивы…………………………………………………………………………………………………………. 836
Копирование изображений……………………………………………………………………………………………… 836
Прямоугольники……………………………………………………………………………………………………………….. 838
Выбор пера……………………………………………………………………………………………………………………….. 839
Линии………………………………………………………………………………………………………………………………… 840
Дуга сектора…………………………………………………………………………………………………………………….. 840
Закраска произвольной области…………………………………………………………………………………….. 841
Закраска текстурой………………………………………………………………………………………………………….. 841
Многоугольники………………………………………………………………………………………………………………. 842
Работа с пикселами………………………………………………………………………………………………………….. 843
Работа с фиксированными шрифтами……………………………………………………………………………………. 843
Загрузка шрифта………………………………………………………………………………………………………………. 844
Параметры шрифта………………………………………………………………………………………………………….. 844
Вывод строки……………………………………………………………………………………………………………………. 844
Работа со шрифтами TrueType……………………………………………………………………………………………….. 845
Вывод строки……………………………………………………………………………………………………………………. 845
Проблемы с русскими буквами……………………………………………………………………………………….. 846
Определение границ строки……………………………………………………………………………………………. 846
Коррекция функции imageTtfBBox()……………………………………………………………………………….. 847
Пример………………………………………………………………………………………………………………………………. 849
Резюме………………………………………………………………………………………………………………………………………. 851
Глава 44. Работа с сетью………………………………………………………………………. 852
Файловые функции и потоки…………………………………………………………………………………………………… 852
Другие схемы……………………………………………………………………………………………………………………. 853
Контекст потока……………………………………………………………………………………………………………….. 854
Работа с сокетами……………………………………………………………………………………………………………………. 857
«Эмуляция» браузера………………………………………………………………………………………………………. 858
Неблокирующее чтение…………………………………………………………………………………………………… 859
Функции для работы с DNS…………………………………………………………………………………………………….. 859
Расширение CURL…………………………………………………………………………………………………………………… 860
Отправка данных методом POST……………………………………………………………………………………………. 865
Передача пользовательского агента……………………………………………………………………………………… 867
Резюме………………………………………………………………………………………………………………………………………. 868
Глава 45. NoSQL-база данных Redis…………………………………………………….. 869
Почему Redis?…………………………………………………………………………………………………………………………… 870
Установка сервера Redis…………………………………………………………………………………………………………. 871
В среде Linux Ubuntu……………………………………………………………………………………………………….. 871
В среде macos…………………………………………………………………………………………………………………… 871
В среде Windows………………………………………………………………………………………………………………. 871
Проверка работоспособности………………………………………………………………………………………… 872
Клиент redis-cli………………………………………………………………………………………………………………………….. 872
Вставка и получение значений………………………………………………………………………………………………. 873
Обновление и удаление значений………………………………………………………………………………………….. 874
Управление ключами………………………………………………………………………………………………………………. 876
Время жизни ключа…………………………………………………………………………………………………………………. 876
Типы данных……………………………………………………………………………………………………………………………. 877
Хеш …………………………………………………………………………………………………………………………………………… 878
Множество……………………………………………………………………………………………………………………………….. 879
Отсортированное множество………………………………………………………………………………………………….. 881
Базы данных…………………………………………………………………………………………………………………………….. 882
Производительность Redis………………………………………………………………………………………………………. 883
PHP-расширение Redis…………………………………………………………………………………………………………….. 884
Установка расширения php-redis……………………………………………………………………………………. 884
Хранение сессий в Redis………………………………………………………………………………………………….. 885
Методы для обслуживания данных в Redis…………………………………………………………………… 886
Кеширование данных………………………………………………………………………………………………………. 888
Резюме………………………………………………………………………………………………………………………………………. 893
Часть VII. Компоненты………………………………………………………………. 895
Глава 46. Управление компонентами…………………………………………………… 897
Composer: управление компонентами…………………………………………………………………………………… 897
Установка Composer……………………………………………………………………………………………………………….. 898
Установка в Windows……………………………………………………………………………………………………….. 898
Установка в macos…………………………………………………………………………………………………………… 900
Установка в Linux Ubuntu……………………………………………………………………………………………….. 900
Где искать компоненты?…………………………………………………………………………………………………………. 900
Установка компонента……………………………………………………………………………………………………………. 900
Использование компонента…………………………………………………………………………………………………….. 903
Полезные компоненты…………………………………………………………………………………………………………….. 904
Компонент psySH: интерактивный отладчик………………………………………………………………… 904
Компонент phinx: миграции……………………………………………………………………………………………. 905
Инициализация компонента…………………………………………………………………………………… 906
Подготовка миграций……………………………………………………………………………………………… 908
Выполнение миграций……………………………………………………………………………………………. 911
Откат миграций……………………………………………………………………………………………………….. 912
Операции со столбцами…………………………………………………………………………………………. 913
Подготовка тестовых данных………………………………………………………………………………… 914
Резюме………………………………………………………………………………………………………………………………………. 916
Глава 47. Стандарты PSR…………………………………………………………………….. 917
PSR-стандарты…………………………………………………………………………………………………………………………. 917
PSR-1: основной стандарт кодирования……………………………………………………………………………….. 918
PHP-теги……………………………………………………………………………………………………………………………. 919
Кодировка UTF-8……………………………………………………………………………………………………………… 919
Разделение объявлений и выполнения действий…………………………………………………………… 919
Пространство имен………………………………………………………………………………………………………….. 920
Именование классов, методов и констант классов……………………………………………………….. 920
PSR-12. Руководство по стилю кода………………………………………………………………………………………. 921
Соблюдение PSR-1…………………………………………………………………………………………………………… 921
Отступы…………………………………………………………………………………………………………………………….. 921
Файлы……………………………………………………………………………………………………………………………….. 922
Строки……………………………………………………………………………………………………………………………….. 922
Ключевые слова……………………………………………………………………………………………………………….. 922
Пространства имен………………………………………………………………………………………………………….. 922
Классы………………………………………………………………………………………………………………………………. 923
Методы……………………………………………………………………………………………………………………………… 924
Управляющие структуры………………………………………………………………………………………………… 925
Автоматическая проверка стиля…………………………………………………………………………………….. 926
PSR-4: автозагрузка…………………………………………………………………………………………………………………. 927
Резюме………………………………………………………………………………………………………………………………………. 927
Глава 48. Документирование……………………………………………………………….. 928
Установка…………………………………………………………………………………………………………………………………. 928
Документирование PHP-элементов………………………………………………………………………………………… 928
Теги 930
Резюме………………………………………………………………………………………………………………………………………. 933
Глава 49. Атрибуты……………………………………………………………………………… 934
Синтаксис…………………………………………………………………………………………………………………………………. 935
Отражения для работы атрибутами………………………………………………………………………………………. 937
Класс атрибута………………………………………………………………………………………………………………………… 938
Аргументы атрибутов……………………………………………………………………………………………………………… 940
Резюме………………………………………………………………………………………………………………………………………. 942
Глава 50. Разработка собственного компонента…………………………………… 943
Имя компонента и пространство имен…………………………………………………………………………………… 943
Организация компонента………………………………………………………………………………………………………… 944
Реализация компонента…………………………………………………………………………………………………………… 947
Базовый класс навигации Pager……………………………………………………………………………………… 948
Постраничная навигация по содержимому папки………………………………………………………… 951
Базовый класс представления View……………………………………………………………………………….. 954
Представление: список страниц……………………………………………………………………………………… 955
Собираем все вместе………………………………………………………………………………………………………… 957
Постраничная навигация по содержимому файла……………………………………………………….. 958
Постраничная навигация по содержимому базы данных……………………………………………. 962
Представление: диапазон элементов……………………………………………………………………………… 966
Публикация компонента…………………………………………………………………………………………………………. 970
Зачем разрабатывать собственные компоненты?………………………………………………………………… 972
Резюме………………………………………………………………………………………………………………………………………. 972
Заключение………………………………………………………………………………………….. 973
Приложение. Описание электронного архива………………………………………. 975
Предметный указатель…………………………………………………………………………. 976