Последнее обновление: 21.12.2022
-
Глава 1. Введение в PHP
-
Общий обзор языка программирования PHP
-
Установка PHP
-
Установка веб-сервера Apache
-
Установка веб-сервера Apache и PHP на Mac OS
-
Первый сайт на PHP
-
-
Глава 2. Основы PHP
-
Основы синтаксиса
-
Переменные
-
Типы данных
-
Операции в PHP
-
Конструкция if..else и тернарная операция
-
Конструкции switch и match
-
Циклы
-
Массивы
-
Ассоциативные массивы
-
Многомерные массивы
-
Функции
-
Параметры функции
-
Возвращение значений и оператор return
-
Анонимные функции
-
Замыкания / Closure
-
Стрелочные функции
-
Генераторы
-
Ссылки
-
Область видимости переменной
-
Константы
-
Проверка существования переменной
-
Получение и установка типа переменной. Преобразование типов
-
Операции с массивами
-
-
Глава 3. Отправка данных на сервер
-
Получение данных из строки запроса. GET-запросы
-
Отправка форм. POST-запросы
-
Безопасность данных
-
Отправка массивов
-
Работа с полями ввода форм
-
Пример обработки форм
-
Отправка файлов на сервер
-
-
Глава 4. Объектно-ориентированное программирование
-
Объекты и классы
-
Конструкторы и деструкторы
-
Анонимные классы
-
Наследование
-
Модификаторы доступа
-
Статические методы и свойства
-
Интерфейсы
-
Абстрактные классы и методы
-
Traits
-
Копирование объектов классов
-
Свойства и классы для чтения
-
-
Глава 5. Базовые возможности PHP
-
Подключение внешних файлов
-
Пространства имен
-
Типизация данных
-
Работа со строками
-
Работа с cookie
-
Сессии
-
-
Глава 6. Обработка исключений
-
Конструкция try catch finally
-
Генерация исключений
-
-
Глава 7. Работа с файловой системой
-
Чтение и запись файлов
-
Управление файлами и каталогами
-
Блокировка файла. Функция flock
-
- Глава 1. Введение в PHP
- Общий обзор языка программирования PHP
- Установка PHP
- Установка веб-сервера Apache
- Установка веб-сервера Apache и PHP на Mac OS
- Первый сайт на PHP
- Глава 2. Основы PHP
- Основы синтаксиса
- Переменные
- Типы данных
- Операции в PHP
- Конструкция if..else и тернарная операция
- Конструкции switch и match
- Циклы
- Массивы
- Ассоциативные массивы
- Многомерные массивы
- Функции
- Параметры функции
- Возвращение значений и оператор return
- Анонимные функции
- Замыкания / Closure
- Стрелочные функции
- Генераторы
- Ссылки
- Область видимости переменной
- Константы
- Проверка существования переменной
- Получение и установка типа переменной. Преобразование типов
- Операции с массивами
- Глава 3. Отправка данных на сервер
- Получение данных из строки запроса. GET-запросы
- Отправка форм. POST-запросы
- Безопасность данных
- Отправка массивов
- Работа с полями ввода форм
- Пример обработки форм
- Отправка файлов на сервер
- Глава 4. Объектно-ориентированное программирование
- Объекты и классы
- Конструкторы и деструкторы
- Анонимные классы
- Наследование
- Модификаторы доступа
- Статические методы и свойства
- Интерфейсы
- Абстрактные классы и методы
- Traits
- Копирование объектов классов
- Свойства и классы для чтения
- Глава 5. Базовые возможности PHP
- Подключение внешних файлов
- Пространства имен
- Типизация данных
- Работа со строками
- Работа с cookie
- Сессии
- Глава 6. Обработка исключений
- Конструкция try catch finally
- Генерация исключений
- Глава 7. Работа с файловой системой
- Чтение и запись файлов
- Управление файлами и каталогами
- Блокировка файла. Функция flock
Добро пожаловать
В интернете очень много устаревшей информации, которая приводит к заблуждению, распространению неверных решений и написанию плохого кода у начинающих PHP-разработчиков. Это нужно остановить. PHP: Правильный Путь — легкочитаемое руководство для быстрого ознакомления с правилами эффективного использования PHP, принятыми стандартами написания кода и ссылками на признанные руководства по всему интернету.
Переводы
Руководство PHP: Правильный путь уже (или вскоре будет) переведено на множество различных языков:
- English
- Catalan
- Chinese
- Japanese
- Italian
- Polish
- Portuguese
- Russian (Данная страница)
- Spanish
- Ukrainian
- Bulgarian
- German
Дисклеймер
В интернете не существует описания каноничного способа использования PHP. Как бы то ни было, этот скромный сайт содержит лучшие решения, доступные варианты и другую полезную информацию. Он направлен на ознакомление начинающих разработчиков с PHP и переосмысление опытными профессионалами свежих идей.
Это живой документ и он продолжит обновляться более полезной информацией и примерами по мере их появления.
Как внести вклад
Помогите сделать этот сайт лучшим ресурсом для начинающих PHP программистов! Помочь используя GitHub
Расскажите о нас
Руководство PHP: Правильный путь содержит веб-баннеры, которые вы можете использовать на своём сайте. Окажите поддержку, показав начинающим PHP-разработчикам где они могут найти полезную информацию!
Посмотреть баннеры
Наверх
Начало
Использование стабильной версии (7.2)
Если вы только начинаете работу с PHP, убедитесь в том, что вы используете текущую стабильную версию PHP 7.2. За последние несколько лет PHP добился больших успехов, добавив
новые возможности.
Наиболее часто в ближайшем будущем вы будете видеть, что используются версии PHP 5.x, с последней 5.6. Но вы должны попробовать использовать последнюю стабильную версию, если это возможно. Не дайте скромной разнице между числами 5.2 и 5.6 ввести вас в заблуждение,
эта разница представляет важные изменения. Если вам нужна функция или пример её использования, вы всегда можете
найти документацию на php.net.
Встроенный веб-сервер
Вы можете начать изучение PHP без необходимости в установке и конфигурировании полноценного веб-сервера (необходим PHP 5.4 или новее). Для запуска сервера вам необходимо выполнить следующую команду из терминала в корневой папке веб-проекта:
- Подробнее о встроенном консольном веб-сервере
Установка на Mac
OSX поставляется с предзапакованным PHP, но, в лучшем случае, он немного отстает от стабильной версии. Lion поставляется с
PHP 5.3.6 и Mountain Lion имеет 5.3.10.
Для обновления PHP в OSX вы можете установить его с помощью нескольких пакетных менеджеров,
наиболее рекомендуемый из которых php-osx by Liip.
Другой вариант, скомпилировать самостоятельно, в этом случае убедитесь, что у вас установлен либо
Xcode, либо его аналог от Apple “CLI для Xcode”, который можно загрузить с Apple Mac Developer Center.
В качестве полного набора «всё-в-одном», который включает PHP, веб-сервер Apache и СУБД MySQL, и всё это с хорошим управлением через GUI, попробуйте MAMP.
Установка в Windows
PHP для Windows можно получить несколькими путями. Вы можете загрузить установочные файлы и, до недавнего времени, вы могли использовать ‘.msi’ установщик. Начиная с PHP версии 5.3.0 установщик не поддерживается.
Для изучения и локальной разработки вы можете использовать встроенный в PHP 5.4+ веб-сервер, о конфигурации которого можно не беспокоиться. Если вы предпочитаете сервера «всё-в-одном», которые включают в себя полноценный веб-сервер и MySQL, тогда можете воспользоваться такими инструментами, как Web Platform Installer, Zend Server CE, XAMPP или WAMP, которые помогут быстро развернуть окружение для разработки в Windows. Но, стоит сказать, что эти инструменты будут отличаться от продакшна, так что будьте осторожны и учитывайте эти различия, если вы работаете на Windows и деплоите на Linux.
Если вам нужно запустить конечную систему на Windows, то IIS7 даст вам лучшую стабильность и производительность. Вы можете использовать phpmanager (плагин для IIS7) для легкого конфигурирования и управления PHP. IIS7 поставляется с встроенным FastCGI, вам нужно просто настроить PHP в качестве обработчика. Для получения помощи и дополнительной информации посетите iis.net.
Vagrant
Запуск вашего приложения в разных окружениях на этапе разработки и продакшна может привести к различным багам, которые дадут о себе знать уже непосредственно при работе приложения. Также сложно поддерживать в разных окружениях стабильные версии для всех библиотек, которые используются при работе в команде разработчиков.
Если вы разрабатываете на Windows и деплоите на Linux (или что-либо отличающееся от Windows) или разрабатываете в команде, вы должны рассмотреть возможность использования виртуальной машины. Это звучит сложно, но, используя Vagrant, вы можете установить простую виртуальную машину всего лишь в несколько шагов. Они могут быть как выполнены вручную, так и с помощью специализированного софта, например, Puppet или Chef, который автоматизирует эту задачу. Использование этого софта гарантирует использование одинаковой конфигурации для нескольких машин, что избавляет вас от необходимости поддержки сложных списков установки. Вы также можете удалить вашу машину, и пересоздать её без большого количества ручных шагов, что делает создание «свежей» виртуалки очень простым.
Vagrant создает общие папки, которые используются для совместного использования кода между вашим хостом и виртуальной машиной, а это означает, что вы можете создавать и редактировать файлы на хосте и позже запускать код в вашей виртуальной машине.
Наверх
Стандарты написания кода
Сообщество PHP является очень большим и разнообразным, сочетая в себе бесчисленное количество библиотек, фреймворков, и различных компонентов. Для PHP разработчика это обычная практика — выбрать несколько из них и соединить в одном проекте. Очень важно придерживаться общих стандартов написания кода (так точно, насколько это возможно) в своём PHP коде, чтобы позволить разработчикам сочетать и использовать различные библиотеки для своих проектов.
Группа Совместимости Фреймворков предложила и одобрила ряд стилевых рекомендаций, известных как PSR-0, PSR-1 и PSR-2. Не дайте веселым именам смутить вас, эти рекомендации представляют собой набор правил, которых начинают придерживаться такие проекты, как Drupal, Zend, Symfony, CakePHP, phpBB, AWS SDK, FuelPHP, Lithium и другие. Вы можете использовать их при работе над собственным проектом, или в дальнейшем использовать ваш собственный стиль.
В идеале, вы должны писать PHP код, придерживаясь известных стандартов. Это может быть любая комбинация PSR-ов, или один из стандартов кода, сделанных PEAR или Zend. Это позволит другим разработчикам легко читать и работать с вашим кодом, и приложения, которые используют компоненты, смогут сохранить структуру приложения, даже работая с огромным количеством стороннего кода.
- Подробнее о PSR-0
- Подробнее о PSR-1
- Подробнее о PSR-2
- Подробнее о Стандартах PEAR
- Подробнее о Стандартах Zend
Вы можете использовать PHP_CodeSniffer чтобы проверить код на соответствие одной из этих рекомендаций, а также плагин для текстовых редакторов, таких как, к примеру, Sublime Text 2 чтобы получить отчёт в реальном времени.
Используйте PHP Coding Standards Fixer, созданный Фабиеном Потенсьером, для автоматического исправления синтаксиса вашего кода так, чтобы он соответствовал этим стандартам, что спасет вас от исправления каждой проблемы вручную.
Английский язык является наиболее предпочтительным для всех символических имен и инфраструктуры кода. Комментарии могут быть написаны на любом языке, который будет легко читаем текущими и будущими разработчиками, которым предстоит работать над кодом.
Наверх
Основные моменты языка
Парадигмы программирования
PHP представляет собой гибкий, динамичный язык, который поддерживает несколько техник программирования. Он значительно развился в течение последних нескольких лет: добавлена мощная объектно-ориентированная модель в PHP 5.0 (2004), анонимные функции (замыкания) и пространства имен в PHP 5.3 (2009), а также трейты в PHP 5.4 (2012).
Объектно-ориентированное программирование
PHP реализует очень большой набор особенностей объектно-ориентированного программирования, включая поддержку классов, абстрактных классов, интерфейсов, наследования, конструкторов, клонирования, исключений и т.д.
- Подробнее об объектно-ориентированном PHP
- Подробнее о трейтах
Функциональное программирование
PHP поддерживает первоклассные функции, т.е. функция может быть применена к переменной. И определенные пользователем, и встроенные функции могут быть применены к переменной и вызываться динамически. Функции могут быть переданы, как аргумент к другой функции (эта особенность называется функцией высшего порядка), а также функция может возвращать другую функцию.
Рекурсия — это особенность, которая позволяет функции вызывать саму себя, это поддерживается языком, но бо́льшая часть кода PHP фокусируется на итерации.
Анонимные функции (замыкания) поддерживаются PHP начиная с версии 5.3 (2009).
В PHP 5.4 добавлена возможность связывать замыкание с областью видимости объекта, а также улучшена поддержка callables (всё, что может быть вызвано), так что они могут быть использованы наравне с анонимными функциями практически во всех случаях.
- Продолжить чтение про Функциональное программирование PHP
- Подробнее об Анонимных Функциях
- Подробнее о классе Closure
- Больше информации в Closures RFC
- Подробнее о Callables
- Узнать о динамически вызываемых функциях с
call_user_func_array
Meta Programming
PHP поддерживает несколько форм метапрограммирования, что реализуется с помощью таких механизмов, как Reflection API и Магические Методы. Доступно много Магических Методов, например: __get()
, __set()
, __clone()
, __toString()
, __invoke()
, и т.д., которые позволяют отслеживать поведение внутри класса. Разработчики Ruby часто говорят, что PHP не хватает method_missing
, но он доступен, как __call()
и __callStatic()
.
- Подробнее о Магических Методах
- Подробнее о Reflection
Пространства имен
Как было сказано выше, сообщество PHP состоит из множества разработчиков, создающих очень много кода. Это значит, что одна библиотека PHP может иметь такое же название класса, как и другая. Когда обе библиотеки используются в одном пространстве имен, они конфликтуют и возникают проблемы.
Пространства имен решают эту проблему. Как описано в руководстве PHP, пространства имен можно сравнить с папками операционной системы, которые являются пространствами имен файлов; два файла с одинаковым именем могут сосуществовать в разных директориях. Подобно этому, два PHP класса с одинаковым названием могут существовать в разных пространствах имен PHP.
Использование пространств имен необходимо для того, чтобы избежать конфликтов при использовании вашего кода с библиотеками других разработчиков.
Один из рекомендуемых способов использования пространств имен описан в PSR-4, который призван обеспечить стандарты для описания файлов, классов и пространств имен, что позволяет создавать подключаемый (plug-and-play) код.
- Подробнее о пространствах имен
- Подробнее о PSR-4
Стандартная Библиотека PHP (SPL)
Стандартная библиотека PHP (SPL) поставляется вместе с PHP и предоставляет набор классов и интерфейсов. Она состоит в основном из часто используемых классов структур данных (стек, очередь, куча, и т.д.), а также итераторов, которые предназначены для прохождения через эти структуры данных или ваши собственные классы, которые реализуют интерфейсы SPL.
- Подробнее о SPL
Интерфейс командной строки
Главная цель, с которой был создан PHP — это разработка веб-приложений, но он также полезен при написания кода для интерфейса командной строки (CLI). PHP программы командной строки могут помочь вам автоматизировать такие общие задачи, как тестирование, развертывание и администрирование приложения.
CLI PHP программы очень мощные, потому что вы можете использовать код вашего приложения напрямую, без нужды в создании и обеспечении безопасности веб-интерфейса (GUI) для него. Только убедитесь, что вы не используете для ваших скриптов (CLI) корень вашего веб-сервера.
Попробуйте запустить PHP из консоли:
> php -i
Опция -i
выдаст вам конфигурацию вашего PHP, подобно функции phpinfo
.
Опция -a
предоставляет доступ к интерактивной оболочке, подобно ruby IRB или интерактивной оболочки python. Также существует целый ряд других полезных опций командной строки.
Давайте напишем простую «Привет, $name» программу CLI. Чтобы это сделать, создайте файл с именем hello.php
, как показано ниже.
<?php
if ($argc != 2) {
echo "Использование: php hello.php [name].n";
exit(1);
}
$name = $argv[1];
echo "Привет, $namen";
PHP устанавливает две специальные переменные, основанных на аргументах, с которыми запущен ваш скрипт. $argc
— это переменная с числовым значением, которая содержит количество переданных аргументов, $argv
— это массив, содержащий значение каждого аргумента. Первый аргумент — всегда название вашего PHP скрипта, в этом случае hello.php
.
Выражение exit()
используется с ненулевым числом, чтобы дать оболочке понять, что команда не удалась.
Часто используемые коды завершения можно найти здесь
Для запуска сценария, указанного выше, наберите в командной строке:
> php hello.php
Использование: php hello.php [name]
> php hello.php Мир
Привет, Мир
- Подробнее о запуске PHP из командной строки
- Подробнее о настройке Windows для запуска PHP из командной строки
XDebug
Один из самых полезных инструментов в разработке программного обеспечения — хороший отладчик. Он позволяет вам отследить исполнение вашего кода и контролировать содержимое вашего стека. XDebug — это PHP отладчик, который может использоваться различными IDE, чтобы дать вам возможность устанавливать Брейкпоинты (точки отладки кода) и контролировать стек. Он также позволяет использовать такие инструменты, как PHPUnit и KCacheGrind, для покрытия кода тестами и его профилирования.
Если вы оказываетесь в безвыходном положении при использовании var_dump/print_r, и у вас не получается найти решение, то возможно вам поможет использование отладчика.
Установка XDebug может оказаться сложной, но одна из самых полезных его функций это «Удаленная отладка» — если вы разрабатываете код локально и затем тестируете его в локальной машине или на другом сервере, Удаленная Отладка — это возможность, которую вы захотите сразу же включить.
Стандартно, вы отредактируете ваш Apache VHost или .htaccess файл со следующими значениями:
php_value xdebug.remote_host=192.168.?.?
php_value xdebug.remote_port=9000
“remote_host” и “remote_port” будут указывать на ваш локальный компьютер и порт, который вы указали в вашей IDE для прослушивания. Дальше достаточно включить режим «ожидания соединений» в вашей IDE, и загрузить URL:
http://your-website.example.com/index.php?XDEBUG_SESSION_START=1
Ваша IDE теперь будет перехватывать текущее состояние, позволяя вам устанавливать брейкпоинты и исследовать значения в памяти по мере выполнения скрипта.
- Подробнее о XDebug
Наверх
Менеджер зависимостей
Существует много библиотек, фреймворков и компонентов PHP на выбор. Ваш проект, скорее всего, будет использовать некоторые из них — это и есть зависимости проекта. До недавнего времени в PHP не существовало удобного способа для управления зависимостями проекта. Даже если вы управляете ими вручную, вам приходилось беспокоиться об автозагрузчиках. Больше это не требуется.
В настоящее время существует две основные системы управления пакетами для PHP — Composer и PEAR. Какая из них подходит именно вам? Ответ — обе.
- Используйте Composer для управления зависимостями одного проекта.
- Используйте PEAR для управления зависимостями всех проектов во всей вашей системе.
В общем, пакеты Composer будут доступны только в проектах, для которых вы явно укажете его использование, тогда как пакеты PEAR будут доступны во всех ваших PHP проектах. PEAR, на первый взгляд, может показаться более простым подходом, но есть преимущества в использовании подхода «проект-к-проекту» для зависимостей.
Composer и Packagist
Composer является блестящим менеджером зависимостей для PHP. Укажите список зависимостей вашего проекта в файле composer.json
и, с помощью нескольких простых команд, Composer автоматически скачает зависимости вашего проекта и установит для вас автозагрузку.
На данный момент существует много PHP библиотек, которые совместимы с Composer, готовых для использования в вашем проекте. Список этих «пакетов» есть на Packagist, официальном репозитории для Composer-совместимых PHP библиотек.
Как установить Composer
Вы можете установить Composer локально (в вашей текущей рабочей директории; хотя это не рекомендуется) или глобально (например /usr/local/bin). Предположим, вы хотите установить Composer локально. Из корневой директории вашего проекта выполните:
curl -s https://getcomposer.org/installer | php
Это позволит загрузить файл composer.phar
(бинарный PHP-архив). Вы можете запустить его, используя php
для управления зависимостями вашего проекта. Обратите внимание: Если вы скачаете код напрямую в ваш интерпретатор, пожалуйста, сперва прочитайте код онлайн, для подтверждения его безопасности.
Как установить Composer (вручную)
Ручная установка Composer — это продвинутая техника; однако, существуют причины, по которым разработчик может предпочесть именно этот метод использованию интерактивной установки. Интерактивная установка проверяет настройки PHP, чтобы подтвердить, что:
- Используется необходимая версия PHP
- Файлы
.phar
могут быть верно выполнены - Определенные права на каталог достаточны
- Не установлены конфликтные расширения
- Установлены необходимые настройки
php.ini
В случае, если ни одно из этих условий не соблюдено, вы должны принять решение стоит ли идти на такой компромисс. Ниже описано, как установить Composer вручную:
curl -s http://getcomposer.org/composer.phar -o $HOME/local/bin/composer
chmod +x $HOME/local/bin/composer
Путь $HOME/local/bin
(или другой каталог, выбранный вами) должен находиться в вашей переменной окружения $PATH
. Это позволит быть доступной команде composer
.
Если вы прочтете документацию Composer, которая гласит, что нужно запускать Composer с помощью команды php composer.phar install
, вы можете заменить эту команду на:
Как объявить и установить зависимости
Composer продолжает следить за зависимостями вашего проекта в файле composer.json
. Вы можете управлять им вручную, если вам нравится, или же использовать сам Composer. Команда php composer.phar require
добавляет зависимость в проект и, если в каталоге нет файла composer.json
, он будет создан. Далее мы рассмотрим пример, который добавляет Twig, как зависимость вашего проекта. Запустите это в корневой директории вашего проекта, куда вы загружали composer.phar
:
php composer.phar require twig/twig:~1.8
Аналогично команда php composer.phar init
проведет вас через создание полного файла composer.json
для вашего проекта. Есть и другой путь, когда вы создадите файл composer.json
вы можете сказать Composer, чтобы он скачал все ваши зависимости в папку vendors/
. Это также применимо для проектов, которые вы загрузили и которые предоставляют файл composer.json
:
php composer.phar install
Затем добавьте этот код в основной PHP-файл вашего приложения; это укажет PHP использовать автозагрузчик Composer для зависимостей вашего проекта.
<?php
require 'vendor/autoload.php';
Теперь вы можете использовать зависимости вашего проекта и они будут автоматически загружаться (по требованию).
Обновление зависимостей
Composer создает файл composer.lock
который хранит точную версию каждого пакета, который он загрузил во время первого запуска php composer.phar install
. Если вы поделились проектом с другими разработчиками и файл composer.lock
является частью него, то при запуске php composer.phar install
они получат ту же версию, что и вы. Чтобы обновить ваши зависимости запустите php composer.phar update
.
Очень удобно гибко указывать требуемые версии. Если вы нуждаетесь в версии ~1.8, что значит “всё что новее 1.8.0, но меньше 2.0.x-dev”. Вы также можете использовать шаблон *
, например 1.8.*
. Теперь команда Composer php composer.phar update
обновит все ваши зависимости до новейших версий, которые соответствуют указанным ограничениям.
Проверка ваших зависимостей на безопасность
Security Advisories Checker является веб-сервисом и инструментом командной строки, оба из которых изучают ваш файл composer.lock
и сообщают, если есть необходимость в обновлении какой-либо из ваших зависимостей.
- Подробнее о Composer
PEAR
Другим ветераном среди пакетных менеджеров, которым наслаждаются многие PHP-разработчики, является PEAR. Он работает практически так же, как и Composer, но имеет несколько важных отличий.
PEAR требует, чтобы каждый пакет имел определенную структуру, это означает, что автор пакета должен подготовить его для использования с PEAR. Использование проекта, который не был подготовлен для работы с PEAR невозможно.
PEAR устанавливает пакеты глобально, что означает то, что после установки, они доступны всем проектам на этом сервере. Это может быть полезно, если много проектов строятся на тех же пакетах с той же версией, но может привести к проблемам, если проекты разрабатывались для разных версий.
Как установить PEAR
Вы можете установить PEAR, загрузив установщик phar и выполнив его. Документация PEAR содержит подробную
инструкцию по установке для каждой операционной системы.
Если вы используете Linux, вы также можете посмотреть наличие PEAR в пакетном менеджере вашего дистрибутива. Debian и Ubuntu, к примеру, содержат информацию о пакете php-pear
в пакетном менеджере apt.
Как установить пакет
Если пакет существует в списке пакетов PEAR, вы можете установить его, указав официальное название:
Если пакет выложен на другом канале, вам нужно сначало сделать discover
этого канала и затем указать его во время установки. Подробнее об этом в использование каналов.
- Подробнее о PEAR
Обработка зависимостей PEAR с Composer
Если вы уже используете Composer и желаете установить какой-то код из PEAR, вы можете использовать Composer для обработки зависимостей PEAR. Этот пример установит код из pear2.php.net
:
{
"repositories": [
{
"type": "pear",
"url": "http://pear2.php.net"
}
],
"require": {
"pear-pear2/PEAR2_Text_Markdown": "*",
"pear-pear2/PEAR2_HTTP_Request": "*"
}
}
Первый раздел "repositories"
даст понять Composer, что он должен сделать “initialise” (или “discover” в терминологии PEAR) репозиторий pear. Затем секция require укажет именам пакетов префикс, как ниже:
pear-channel/Package
Префикс “pear” жестко ограничен, чтобы избежать любых конфликтов, так как каналы Pear могут быть схожи с другими поставщиками пакетов например, вместо короткого имени (или полного URL) может быть использовано для объявления в каком канале находится пакет.
Когда код будет установлен он будет доступен в вашей папке vendor и автоматически доступен через автозагрузчик (файл Autoload) Composer.
vendor/pear-pear2.php.net/PEAR2_HTTP_Request/pear2/HTTP/Request.php
Чтобы использовать этот пакет PEAR просто объявите как ниже:
$request = new pear2HTTPRequest();
- Подробнее о использовании PEAR с Composer
Наверх
Практики написания кода
Основы
PHP — это обширный язык, который позволяет разработчикам всех уровней писать код не только быстро, но и эффективно. В любом случае, изучая язык, мы нередко забываем основы, которые мы изучали изначально (или бегло просмотрели), в пользу коротких путей и/или вредных привычек. Чтобы помочь в борьбе с этой общей проблемой, эта секция предназначена для напоминания разработчикам основ практик написания кода PHP.
- Продолжить чтение Основы
Дата и время
PHP содержит встроенный класс DateTime, предназначенный для чтения, записи, сравнения и вычисления даты или времени. Также в PHP много функций, связанных с датой и временем, помимо класса DateTime, но класс предоставляет хороший объектно-ориентированный интерфейс для решения большинства задач. Он способен даже обрабатывать временные зоны, но это уже не рассматривается в данном коротком введении.
Для начала работы с DateTime, сконвертируйте «сырую» строку даты и времени в объект с помощью фабричного метода createFromFormat()
или выполните new DateTime
, чтобы получить текущую дату и время. Используйте метод format()
для конвертирования DateTime обратно в строку для вывода.
<?php
$raw = '22. 11. 1968';
$start = DateTime::createFromFormat('d. m. Y', $raw);
echo 'Start date: ' . $start->format('m/d/Y') . "n";
Вычисления с DateTime возможны с использованием класса DateInterval. У класса DateTime есть методы add()
и sub()
, которые принимают DateInterval, как аргумент. Не пишите код, который ожидает одинаковое число секунд каждый день, перевод часов и смена часовых поясов разрушат это предположение. Вместо этого используйте интервалы дат. Для расчета разницы между датами используйте метод diff()
. Он вернет новый объект DateInterval, который очень легко отобразить.
<?php
// создает копию $start и добавляет 1 месяц и 6 дней
$end = clone $start;
$end->add(new DateInterval('P1M6D'));
$diff = $end->diff($start);
echo 'Difference: ' . $diff->format('%m месяц, %d дней (total: %a дней)') . "n";
// Разница : 1 месяц, 6 дней (всего : 37 дней)
С объектами DateTime, вы можете использовать стандартные методы сравнения:
<?php
if ($start < $end) {
echo "Начальная дата раньше конечной!n";
}
И последний пример для демонстрации класса DatePeriod. Он используется для перебора повторяющихся событий. Класс может принимать два объекта DateTime, начало и конец, и интервал, для которого он вернет все события между ними.
<?php
// выводит все четверги между началом и концом
$periodInterval = DateInterval::createFromDateString('first thursday');
$periodIterator = new DatePeriod($start, $periodInterval, $end, DatePeriod::EXCLUDE_START_DATE);
foreach ($periodIterator as $date) {
// вывести каждую дату в периоде
echo $date->format('m/d/Y') . ' ';
}
- Подробнее о DateTime
- Подробнее о форматировании даты (разрешенные опции строки формата даты)
Design Patterns
При построении приложения полезно использовать в коде шаблоны, а также придерживаться некоторых стандартов для всей структуры проекта. Использование шаблонов полезно, потому что оно упрощает управление кодом, а также позволяет другим разработчикам быстро понять, как всё взаимодействует друг с другом.
Если вы используете фреймворк, то большинство высокоуровневого кода и структура проекта будет основываться на архитектуре фреймворка, поэтому большинство решений относительно шаблона сделано за вас. Но всё же наиболее верным решением будет выбрать наиболее подходящие шаблоны и следовать им в коде, который вы пишете на базе фреймворка. С другой стороны, если вы не используете фреймворк для построения приложения, тогда вы должны найти шаблоны, которые наилучшим образом соответствуют типу и размеру приложения, которое вы создаете.
- Продолжить чтение Шаблоны проектирования
Исключения
Исключения — это неотъемлемая часть большинства популярных языков программирования, но зачастую PHP разработчики не уделяют им должного внимания. Языки, подобные Ruby, очень подробно обрабатывают исключения, поэтому, если что-то идёт не верно, например: не удался HTTP запрос, запрос к базе данных происходит неправильно или если запрошенное изображение не было найдено, Ruby (или используемые гемы) выбросит исключение на экран, помогающее понять где вы допустили ошибку.
PHP сам по себе довольно слаб в плане этого и вызов file_get_contents()
, как правило, даст вам только FALSE
и предупреждение. Многие устаревшие PHP-фреймворки, как CodeIgniter, просто вернут false, добавят сообщение в свой собственный журнал и, может быть, дадут вам использовать метод, как $this->upload->get_error()
, чтобы посмотреть, что пошло не так. Проблема в том, что вы должны искать ошибку и проверять документацию, чтобы понять, какой ошибочный метод существует в этом классе, вместо того, чтобы сделать это всё более очевидным.
Еще одна проблема в том, что классы автоматически выдают ошибку на экран и закрывают процесс. Когда вы делаете это, вы не даете другому разработчику динамически обработать эту ошибку. Исключения должны быть выброшены, чтобы дать разработчику знать об ошибке и выбрать, как её обработать. Например:
<?php
$email = new FuelEmail;
$email->subject('My Subject');
$email->body('How the heck are you?');
$email->to('guy@example.com', 'Some Guy');
try
{
$email->send();
}
catch(FuelEmailValidationFailedException $e)
{
// Валидация не удалась
}
catch(FuelEmailSendingFailedException $e)
{
// Драйвер не может отправить сообщение
}
Исключения SPL
Универсальный класс Exception
предоставляет очень мало отладочного контекста для разработчика; как бы то ни было, для того чтобы исправить это, можно создать специализированный класс, который будет расширять возможности универсального класса Exception
:
<?php
class ValidationException extends Exception {}
Это означает, что вы можете добавить несколько блоков отлова и обрабатывать разные исключения по-разному. Это может привести к созданию множества изменённых Исключений, некоторые из которых можно было бы избежать, используя Исключения SPL, предоставляемые расширением SPL.
Например, если вы используете магический метод __call()
и вами был вызван неизвестный метод, то вместо выбрасывания стандартного исключения, которое очень расплывчато, или вместо создания своего исключения, вы можете просто использовать throw new BadFunctionCallException;
.
- Подробнее об Исключениях
- Подробнее о SPL Исключениях
- Вложенные исключения в PHP
- Лучшие практики использования исключений в PHP 5.3
Наверх
Базы данных
Скорее всего, ваш PHP код будет использовать базу данных для сохранения информации. Существует несколько вариантов для подключения и взаимодействия с базой данных. Рекомендуемым вариантом до PHP 5.1.0 было использование нативных (родных) драйверов, таких как mysql, mysqli, pgsql, etc.
Встроенные драйвера замечательны, если вы используете ОДНУ базу данных в ваших приложениях, но если, например, вы используете MySQL и немного MSSQL, или вам нужно подключиться в базе данных Oracle, тогда вы не сможете использовать те же драйвера. Вам нужно будет изучить новый API для каждой базы данных — и это может оказаться нерациональным.
Обратите внимание, что расширение mysql для PHP больше не поддерживается, и его официальным статусом, начиная с PHP версии 5.4.0, является «Устарело в связи с длительным сроком использования». Это значит, что оно будет удалено в течение нескольких следующих релизов, так что в PHP 5.6 (или в версиях, следующих за 5.5) оно вполне может пропасть. Если вы используете mysql_connect()
и mysql_query()
в своих приложениях, тогда вам придется столкнуться с переписыванием кода, поэтому лучшим вариантом сейчас является использование в приложениях mysqli или PDO вместо mysql, прежде чем вы в дальнейшем столкнётесь с нерабочими приложениями. Если вы начинаете изучение баз данных с нуля, тогда полностью откажитесь от использования расширения mysql — используйте Расширение MySQLi или PDO.
- PHP: Выбор API для MySQL
PDO
PDO — это абстрактная библиотека для подключения к базе данных, встроенная в PHP с версии 5.1.0, которая обеспечивает единый интерфейс для взаимодействия с большим количеством различных баз данных. PDO не будет переводить ваши SQL запросы или эмулировать отсутствующие возможности; он чист для подключения к нескольким типам баз данных с тем же API.
Более важно, что PDO
позволяет вам безопасно вводить пользовательские данные (например идентификатор) в ваши SQL запросы, без беспокойства о SQL-инъекциях. Это возможно благодаря использованию PDO выражений и связывания (bound) параметров.
Предположим, что PHP скрипт получает числовой идентификатор в качестве параметра из запроса. Этот идентификатор должен быть использован для получения пользовательских записей из базы данных. Ниже приведён неправильный
способ реализации этого:
<?php
$pdo = new PDO('sqlite:users.db');
$pdo->query("SELECT name FROM users WHERE id = " . $_GET['id']); // <-- Это неправильно!
Это ужасный код. Вы вставляете необработанные параметры в SQL запрос. Это приведёт к взлому. Просто представьте, что взломщик сделает запрос http://domain.com/?id=1%3BDELETE+FROM+users
, который присвоит переменной $_GET['id']
значение 1;DELETE FROM users
и приведёт к удалению всех ваших пользователей! Вместо этого, вы должны очистить ввод идентификатора с помощью связывания параметров PDO.
<?php
$pdo = new PDO('sqlite:users.db');
$stmt = $pdo->prepare('SELECT name FROM users WHERE id = :id');
$stmt->bindParam(':id', $_GET['id'], PDO::PARAM_INT); //<-- Автоматически очищено с помощью PDO
$stmt->execute();
Это правильный код. Он использует связанный параметр в выражении PDO. Это позволяет избежать ввода некоректного ID перед тем, как передать запрос в базу данных, тем самым предотвращая потенциальные SQL-инъекции.
- Подробнее о PDO
Вы также должны понимать, если подключение не закрыто должным образом, то оно использует много ресурсов, которые тратятся впустую, впрочем это больше относится к другим языкам. Используя PDO, вы можете неявно закрывать подключение уничтожив объект — все ссылки на него будут удалены, т.е. установлены в NULL. Если не сделать этого явно, PHP закроет подключение за вас, когда выполнение скрипта завершится, если только вы не используете постоянные подключения.
- Подробнее о подключениях PDO
Уровни абстракции
Многие фреймворки предоставляют собственный уровень абстракции, который может строиться на основе PDO. Такая фактическая абстракция баз данных позволяет оборачивать запросы на PHP в методы, которые отсутствуют в одной системе баз данных, но работают в другой. Это, конечно, добавит небольшие накладные расходы, но если вы строите портативные приложения, которым необходима работа с MySQL, PostgreSQL и SQLite, тогда, для чистоты кода, минимальными накладными расходами можно пренебречь.
Некоторые уровни абстракции построены с использованием PSR-0 стандарта, поэтому могут быть установлены в любое приложение:
- Aura SQL
- Doctrine2 DBAL
- ZF2 Db
- ZF1 Db
Наверх
Безопасность
Безопасность веб-приложений
Есть плохие люди, которые могут и хотят взломать ваши веб-приложения. Важно принять необходимые меры предосторожности, чтобы укрепить безопасность вашего приложения. К счастью, прекрасные люди в The Open Web Application Security Project (OWASP) составили полный список известных проблем безопасности и методов защиты от них. Это должно быть прочитано любым разработчиком, заботящимся о безопасности.
- Прочитать руководство по безопасности OWASP
Хэширование паролей
Наверное, каждый PHP-разработчик занимается разработкой приложений, которые нуждаются в пользовательской авторизации. Имя пользователя и пароль хранятся в базе данных и позже используются для авторизации пользователя.
Очень важно правильно хэшировать пароль перед его сохранением. Хэширование пароля является необратитым, односторонняя функция применяется на пользовательских паролях. Она возвращает строку определенной длины, которую невозможно расшифровать. Это значит, что вы можете сравнить один хэш с другим, чтобы понять, что они пришли из одной и той же исходной строки, но вы не можете определить оригинальную строку. Если ваши пароли не захэшированы, и доступ к базе данных получен третьй стороной, то ваши пользовательские аккаунты теперь скомпрометированы. Некоторые пользователи (к сожалению) могут использовать один и тот же пароль для разных сервисов. Как бы то ни было, очень важно серьезно относиться к безопасности.
Хэширование паролей с функцией password_hash
В PHP 5.5 была представлена функция password_hash
. Сейчас она использует BCrypt, сильнейший алгоритм, поддерживаемый PHP. Она будет обновлена в будущем, для поддержки бОльшего числа алгоритмов, по мере необходимости. Библиотека password_compat
была создана для обратной совместимости с PHP >= 5.3.7.
Ниже мы хэшируем строку и далее сверяем её с новой строкой. Поскольку наши две исходные строки отличаются (‘secret-password’ и ‘bad-password’) эта авторизация будет неудачной.
<?php
require 'password.php';
$passwordHash = password_hash('secret-password', PASSWORD_DEFAULT);
if (password_verify('bad-password', $passwordHash)) {
//Правильный пароль
} else {
//Неправильный пароль
}
- Подробнее о
password_hash
password_compat
для PHP >= 5.3.7 && < 5.5- Подробнее о хэшировании в отношении криптографии
- PHP
password_hash
RFC
Фильтрация данных
Никогда не доверяйте пользовательскому вводу, который передаётся вашему PHP коду. Всегда проверяйте и очищайте пользовательский ввод перед его использованием в коде. Функции filter_var
и filter_input
помогут очистить переменные, а также проверить соответствие введённых данных некоторому формату (например, адрес электронной почты).
Пользовательский ввод может быть различным: $_GET
и $_POST
, данные введённые в форму, некоторые значения в суперглобальной переменной $_SERVER
и тело HTTP запроса, открытое с помощью fopen('php://input', 'r')
. Запомните, что пользовательский ввод не ограничивается данными формы, отправленной пользователем. Отправляемые и загружаемые файлы, значения сессий, данные cookie и данные сторонних веб-сервисов также приравниваются к пользовательскому вводу.
Хотя пользовательские данные могут быть без проблем сохранены, скомбинированы и к ним может быть получен доступ позже, они всё ёще являются пользовательским вводом. Каждый раз, когда вы что-либо обрабатываете, объединяете или подключаете данные в ваш код, спросите себя, отфильтрованы ли эти данные и можно ли им доверять.
Данные могут быть отфильтрованы по-разному, в зависимости от их назначения. Например, когда нефильтрованные данные, введённые пользоватем, передаются в HTML код страницы, он может выполнить HTML и JavaScript на вашем сайте! Этот тип атаки известен, как Cross-Site-Scripting (XSS) и может иметь очень серьёзные последствия. Один из способов избежать XSS заключается в очистке ввода от всех HTML тэгов (их удалением, или заменой на HTML символы) с помощью функции strip_tags
или экранирование символов в равносильные им HTML сущности с функцией htmlentities
или htmlspecialchars
.
Другой пример, передача данных для выполнения командной строкой. Это может быть крайне опасно (и, как правило — это плохая идея), но вы можете использовать встроенную функцию escapeshellarg
для очистки аргументов командной строки.
Последний пример, принимает пользовательский ввод, чтобы определить, какой файл загружать из файловой системы. Это может быть использовано для изменения имени файла на путь файла. Вам нужно убрать “/”, “../”, нулевые байты или другие символы из пути файла, так чтобы скрипт не мог загружать скрытые, непубличные или конфиденциальные файлы.
- Подробнее о фильтрации данных
- Подробнее о функции
filter_var
- Подробнее о функции
filter_input
- Подробнее об обработке нулевых байтов
Санитизация
Санитизация удаляет (или экранирует) неправильные или небезопасные символы из пользовательского ввода.
Например, вам необходимо нормализовать пользовательский ввод перед подключением ввода в HTML или
его вставкой в сырой SQL запрос. Когда вы используете связанные параметры с PDO,
они будут очищать ввод за вас.
Иногда требуется разрешить некоторые безопасные HTML тэги в вводе, когда он подключается в HTML
страницу. Это очень трудно сделать и многие избегают этого, используя ограниченное форматирование,
как например Markdown или BBCode, либо библиотеки с белым списком, как HTML Purifier,
существующие по этой причине.
Санитизационные фильтры
Валидация
Валидация гарантирует, что пользовательский ввод, является тем, что вы ожидаете. Например, вы
можете валидировать адрес электронной почты, номер телефона или возраст при обработке запроса
регистрации.
Валидационные фильтры
Конфигурационные файлы
Когда вы создаёте файлы конфигурации для ваших приложений, рекомендуется использование одного из следующих способов:
- Рекомендуется хранить вашу конфигурационную информацию там, где к ней не может быть получен доступ напрямую, а доступ к ней осуществлялся через файловую систему.
- Если вы вынуждены хранить конфигурационные файлы в корневом каталоге, именуйте файл с расширением
.php
. Это гарантирует, что, если к скрипту обратятся напрямую, он не будет выведен, как обычный текст. - Информация в файлах конфигурации, должна быть защищена соответственно, либо с помощью шифрования или системных прав группы/пользователя файла.
Использование глобальных переменных
Примечание: С появлением PHP 5.4 директива register_globals
была удалена и больше не может быть использована. Это касается тех, кому нужно обновить старое приложение.
Включенный параметр конфигурации register_globals
делает несколько типов переменных (в том числе из $_POST
, $_GET
и $_REQUEST
) глобальными, доступными в глобальной области видимости вашего приложение. Это может легко привести к проблемам с безопасностью, поскольку ваше приложение не сможет эффективно определить откуда пришли данные.
Например : $_GET['foo']
будет доступна через $foo
, которая может заместить переменную, которая не была объявлена. Если вы используете PHP < 5.4.0 убедитесь что register_globals
off (выключена).
- Register_globals в руководстве PHP
Сообщения об ошибках
Логирование ошибок полезно при поиске проблемных мест вашего приложения, также логирование может выдать информацию о структуре вашего приложения. Для эффективной защиты вашего приложения от проблем, которые могут быть вызваны выводом этих сообщений, вам необходимы различные настройки сервера для разработки и продакшна.
Разработка
Для того, чтобы видеть все возможные ошибки во время разработки, настройте следующие параметры в вашем php.ini
:
display_errors = On
display_startup_errors = On
error_reporting = -1
log_errors = On
Установка значения в
-1
покажет каждую возможную ошибку, даже если новые уровни и константы будут добавлены в новых версиях PHP. КонстантаE_ALL
ведёт себя так-же в PHP 5.4. — php.net
Константа уровня ошибок E_STRICT
была введена в 5.3.0 и не является частью E_ALL
, как бы то ни было, она стала частью E_ALL
в 5.4.0 Что это значит? Для вывода всех возможных ошибок в версии 5.3 вам нужно использовать либо -1
либо E_ALL | E_STRICT
.
Вывод всех ошибок разными версиями PHP
- < 5.3
-1
orE_ALL
- 5.3
-1
orE_ALL | E_STRICT
- > 5.3
-1
orE_ALL
Продакшн
Чтобы спрятать все ошибки вашей среды во время продакшна, настройте ваш php.ini
следующим образом:
display_errors = Off
display_startup_errors = Off
error_reporting = E_ALL
log_errors = On
С этими настройками в продакшне, ошибки всё также будут записываться в лог ошибок веб сервера, но не будут показаны пользователю. Для подробной информации об этих настройках, смотрите руководство PHP:
- error_reporting
- display_errors
- display_startup_errors
- log_errors
Наверх
Тестирование
Написание автоматизированных тестов для вашего кода PHP, считается наилучшей практикой.
Автоматизированные тесты являются отличным инструментом для подтверждения того, что ваше
приложение не сломается, когда вы внесёте изменения или добавите новую функциональность.
Существует несколько различных типов инструментов тестирования (или фреймворков) доступных
для PHP, которые используют различные подходы — все, пытаются избежать ручного тестирования
и нуждаются в больших командах проверки качества, чтобы убедиться, что изменения не сломают
существующую функциональность.
Тесто-ориентированная разработка
Из Википедии:
Разработка через тестирование (TDD) представляет собой процесс разработки программного обеспечения, который опирается на повторении очень короткого цикла разработки: сперва, разработчик пишет автоматизированные тесты, которые определяют желаемое улучшение или новую функцию, далее производит код, который успешно пройдет этот тест и наконец производит рефактор кода для соответствия стандартам. Kent Beck, человек которому приписывают статус разработчика или “переоткрывателя” техники, TDD предлагает простую конструкцию, а также вселяет уверенность.
Существует несколько различных типов тестирования, которые вы можете сделать для вашего приложения.
Модульное тестирование (Unit Testing)
Модульное тестирование — это подход к программированию, который позволяет удостовериться, что функции, классы и методы работают, как ожидается с момента начала и до конца разработки. Проверяя значения, которые приходят и выходят из различных функций и методов, вы можете быть уверены, что внутренняя логика работает правильно. Используя Внедрение Зависимостей и внедрение классов «макетов» и заглушек, вы можете убедиться, что зависимости используются правильно для большего покрытия тестами.
При создании класса или функции, вы должны создать модульный тест для каждого возможного поведения. На базовом уровне, вы должны убедиться, что ваш код выдаёт ошибку, если вы отсылаете неправильные аргументы и работает, если вы отсылаете правильные аргументы, соответственно. Это поможет убедиться в том, что изменения, которые вы сделаете относительно этого класса или функции позднее не помешают старым работать как ожидалось. Единственная альтернатива этому var_dump() в test.php, который не является способом создания приложений — больших или маленьких.
Ещё одно использование модульных тестов — вклад в open source. Если вы можете писать тесты, которые показывают сломанную функциональность, тогда почините её, и покажите, что тест пройден, патчи имеют больше шансов быть принятыми. Если вы запускаете проект, который допускает Pull Request, тогда вы должны указать это в качестве требования.
PHPUnit является фреймворком тестирования стандарта де-факто для написания модульных тестов в PHP приложениях, но также существует несколько альтернатив.
- SimpleTest
- Enhance PHP
- PUnit
- atoum
Интеграционное тестирование
Из Википедии:
Интеграционное тестирование (иногда называется Интеграция и Тестирование, с аббревиатурой “I&T”) это фаза в тестирование програмнного обеспечения, в котором отдельные модули, комбинируются и тестируются, как группа. Это происходит после модульного тестирования и перед валидационным тестированием. Integration testing takes as its input modules that have been unit tested, groups them in larger aggregates, applies tests defined in an integration test plan to those aggregates, and delivers as its output the integrated system ready for system testing.
Многие инструменты, которые могуть быть использованы для модульного тестирования, также могут быть использованы для интеграционного тестирования, поскольку используются схожие принципы.
Функциональное тестирование
Также известное, как подтверждающее тестирование, функциональное тестирование состоит из использования инструментов для создания автоматизированных тестов, которые по-настоящему используют ваше приложение, а не просто проверяют, что отдельные куски (модули) кода ведут себя и могут взаимодействовать правильно.
Эти инструменты обычно работают, используя реальные данные и симулируя реальных пользователей приложения.
Инструменты функционального тестирование
- Selenium
- Mink
- Codeception это фреймворк для тестирования (всё-в-одном), включающий инструменты подтверждающего тестирования
Поведенческо-ориентированная разработка
Существует две разновидности Поведенческо-ориентированной разработки (BDD): SpecBDD и StoryBDD. SpecBDD концентрируется на техническом поведении или коде, в то время как StoryBDD концентрируется на деле, будущем поведении или взаимодействии. PHP имеет фреймворки для обоих типов BDD.
Используя StoryBDD, вы пишите читаемые людьми истории, которые объясняют поведение вашего приложения. Эти истории могут быть запущены, как актуальные тесты для вашего приложения. Фреймворк, используемый в PHP приложениях для StoryBDD — Behat, который вдохновлён проектом для Ruby Cucumber и реализует Gherkin DSL для объяснения особенностей поведения.
Вместе со SpecBDD, вы пишите спецификацию, которая объясняет, как ваш код должен себя вести. Вместо тестирования функции или метода, вы объясняете, как эта функция или метод должен себя вести. PHP предлагает фреймворк PHPSpec для данных целей. Этот фреймворк вдохновлён проектом RSpec для Ruby.
Инструменты
- Behat, StoryBDD фреймворк для PHP, вдохновлённый проектом для Ruby Cucumber;
- PHPSpec, SpecBDD фреймворк для PHP, вдохновлённый проектом для Ruby RSpec;
- Codeception это фреймворк для тестирования (всё-в-одном), использующий принципы BDD;
Помимо индивидуального тестирования и поведенческо-ориентированных фрэймворков, существует ряд общих фреймворков и вспомогательных библиотек, полезных для любого предпочтительного подхода.
Инструменты
- Selenium автоматизационный инструмент для браузера интегрируемый с PHPUnit
- Mockery Mock Object Framework интегрируемый с PHPUnit или PHPSpec
Наверх
Сервера и развертывание
PHP приложения могут быть развернуты и запущены на продакшн веб-сервере рядом способов.
Платформа, как сервис (PaaS)
PaaS предоставляет системную и сетевую архитектуры, необходимые для запуска PHP приложений в веб. Это означает, как
минимум, отсутствие настройки для запуска PHP приложений или PHP фреймворков.
В недавнее время PaaS стал очень популярным методом для развертывания, хостирования и расширения PHP приложений
всех размеров. Вы можете найти список провайдеров PHP PaaS в нашей ресурсной секции.
Виртуальный или выделенный сервер
Если вы знакомы с администрированием системы, или заинтересованы в его изучении, виртуальный или выделенный сервер даст вам полный контроль над средой продакшна вашего приложения.
nginx и PHP-FPM
PHP, через встроенный в него менеджер процессов FastCGI (FPM), очень хорошо сочетается с nginx, который является легковесным и высокопроизводительным веб-сервером. Он использует меньше памяти, чем Apache и может лучше обрабатывать конкурентные запросы. Это особенно важно на виртуальном сервере, для которого может быть критичен объем используемой памяти.
- Подробнее о nginx
- Подробнее о PHP-FPM
- Подробнее о безопасной установке nginx и PHP-FPM
Apache и PHP
PHP и Apache имеют длинную совместную историю. Apache широконастраиваемый и имеет большое количество доступных модулей для расширения функциональности. Это очень популярный выбор для виртуальных хостингов и лёгкой установки PHP фреймворков и приложений с открытым исходным кодом, как WordPress. К сожалению, Apache использует больше ресурсов, чем nginx, и не может выдержать столько же посетителей одновременно.
Apache имеет несколько возможных конфигураций для запуска PHP. Самая популярная и лёгкая для установки prefork MPM вместе с mod_php5. Хотя это не самое эффективное в отношении памяти решение, оно очень просто для установки и использования. Наверное, это лучшее решение, если вы не хотите углубляться в серверное администратирование. Если вы хотите использовать mod_php5, вы обязаны использовать prefork MPM.
Если вы хотите получить больше производительности и стабильности с Apache, тогда вы можете взглянуть на ту же FPM систему, как в nginx и запустить worker MPM или event MPM, используя mod_fastcgi или mod_fcgid. Эта конфигурация позволит получить существенную экономию в памяти и будет намного быстрее, но потребует больше работы для установки.
- Подробнее на Apache
- Подробнее о Multi-Processing Modules
- Подробнее о mod_fastcgi
- Подробнее о mod_fcgid
PHP, благодаря своей популярности, установлен на большом количестве виртуальных хостингов. Очень трудно найти хостинг без установленного PHP, но очень важно убедиться в том, что установлена последняя версия. Виртуальные хостинги позволяют вам и другим разработчикам развертывать веб-сайты на одной машине. Достоинством виртуального хостинга является его низкая цена. Недостатком — то, что вы не знаете, чем будут заниматься ваши соседи; сильно загружая сервер или открывая бреши в безопасности. Если бюджет вашего проекта позволяет избежать использования Виртуальных хостингов, то рассмотрите другие варианты.
Построение и развёртывание вашего приложения
Если вы обновляете структуру базы данных вручную или запускаете вручную тесты перед обновлением ваших файлов, то подумайте дважды! С каждой дополнительной необходимой ручной задачей для развёртывания новой версии вашего приложения, потенциальный шанс возникновения фатальной ошибки возрастает. Делаете ли вы простое обновление, полный процесс сборки или стратегию непрерывной интеграции автоматизация сборки — ваш друг.
Среди задач, которые вы, возможно, захотите автоматизировать:
- Управление зависимостями
- Компиляция, минификация файлов (assets)
- Запуск тестов
- Создание документации
- Запаковка
- Развёртывание
Создание инструментов автоматизации
Инструменты построения — коллекция скриптов, которые обрабатывают общие задачи развёртки приложений. Инструменты постройки не являются частью вашего приложения, они взаимодействуют с вашим приложением «извне».
Существует большое количество инструментов с открытым исходным кодом, которые могут помочь вам автоматизировать процесс постройки, некоторые написаны на PHP, другие на других языках. Это не должно удерживать вас от их использования, если они лучше подходят под задачу. Вот несколько примеров:
Phing самый простой путь, чтобы начать автоматическую развёртку в мире PHP. С Phing вы можете контролировать ваш процесс запаковки, развёртки или тестирования с помощью простого построечного XML файла. Phing (который базируется на Apache Ant) предоставляет богатый набор задач, часто необходимых для установки или обновления веб приложения, и может быть расширен дополнительными нестандартными задачами, написанными на PHP.
Capistrano — система для начинающих-профессиональных разработчиков для исполнения команд в структуризованном, воспроизводимом пути на одной или многих удалённых машинах. Предварительно он настроен для развёртки приложений Ruby on Rails. Как бы то ни было люди успешно развёртывают и PHP приложения с ним. Успех использования Capistrano зависит на умении работы с Ruby и Rake.
Сообщение в блоге Dave Gardner PHP Deployment with Capistrano является хорошей отправной точкой для PHP разработчиков, заинтересованных в Capistrano.
Chef является нечто большим, чем просто фрэймворк развёртки. Это очень мощный интеграционный фрэймворк, основанный на Ruby, который не просто развёртывает ваше приложение, но и может построить всё серверное окружение или виртуальный сервер.
Ресурсы о Chef для PHP разработчиков:
- Серия из трёх сообщений в блоге о развёртке LAMP приложения с Chef, Vagrant и EC2
- Книга рецептов Chef который устанавливает и настраивает PHP 5.3 и менеджер пакетов PEAR
Для дальнейшего изучения:
- Автоматизация ваших проектов с Apache Ant
- Maven, построечный фрэймворк, основанный на Apache Ant; как использовать его с PHP
Непрерывная интеграция
Непрерывная интеграция — это практика разработки программного обеспечения, при которой члены команды объединяют их
работу очень часто, обычно каждый член команды объединяет как минимум ежедневно — что приводит к нескольким
объединениям в день. Многие команды считают, что данный подход позволяет значительно сократить интеграционные
проблемы и позволяет им разрабатывать совместный продукт быстрее.
— Martin Fowler
Существуют разные пути, для осуществления непрерывной интеграции для PHP. Недавно Travis CI закончил великолепную работу по созданию непрерывной интеграции, реально даже для маленьких проектов. Travis CI — сервис непрерывной интеграции для сообщества с открытым исходным кодом. Оно интегрируется с GitHub и предлагает первоклассную поддержку для многих языков, включая PHP.
Для дальнейшего изучения:
- Непрерывная интеграция с Jenkins
- Непрерывная интеграция с Teamcity
Наверх
Кэширование
PHP очень быстр сам по себе, но такие ресурсоёмкие операции, как установка удалённого подключения и, к примеру, загрузка файлов, могут привести к существенному падению скорости работы приложения. К счастью, есть различные инструменты, позволяющие поднять скорость определённых частей вашего приложения, или уменьшить количество запусков этих «тяжёлых» задач.
Кэширование байткода
Во время исполнения PHP файла, на низком уровне он сперва компилируется в байткод (или опкод) и только потом исполняется байткод. Если PHP файл не изменён, то байткод будет всегда одинаков. Это значит, что шаг компиляции — пустая трата процессорных ресурсов.
И тут настает время кэширования байткода. Оно предотвращает избыточные компиляции, сохраняя в памяти байткод и переиспользуя его в последовательных вызовах. Установка подобного кэширования — вопрос пары минут, а скорость вашего приложения поднимется существенно. Поэтому нет причин не использовать кэширование.
Начиная с PHP 5.5 появилось встроенное расширение для кэширования байткод — OPcache. Оно также доступно в виде отдельного расширения для ранних версий.
Популярные системы подобного кэширования:
- APC (PHP 5.4 и более ранние)
- XCache
- Zend Optimizer+ (часть Zend Server)
- WinCache (расширение для MS Windows Server)
Кэширование объектов
Бывают моменты, когда вам необходимо кэшировать определённые объекты в вашем коде, такие как данные, которые неразумно получать ещё раз из базы данных, когда результат вряд ли изменится. Вы можете использовать ПО для кэширования чтобы сохранить эти кусочки данных в памяти, что позволит чрезвычайно быстро обратиться к ним позже. Если вы сохраните эти объекты в хранилище данных и после получите их и выдадите напрямую из кэша для некоторых запросов, вы можете получить существенное улучшение производительности и уменьшение нагрузки на сервер базы данных.
Множество популярных решений для кэширования байткода также дают вам кэшировать данные, поэтому нет причин, чтобы не воспользоваться ими. APC, XCache и WinCache предоставляют API для сохранения данных из вашего PHP кода в свой кэш в памяти.
Самыми популярными системами кэширования объектов являются APC и memcached. APC — идеальный выбор для кэширования объектов, он включает простой API для добавления данных в кэш память и при этом очень просто устанавливается и используется. Единственное существующее ограничение APC состоит в том, что он привязан к серверу на котором установлен. Memcached, напротив, устанавливается как отдельный сервис, и к нему можно получить доступ по сети, что позволяет хранить объекты в очень быстром централизованном хранилище данных и множество других систем могут получать эти данные из него.
Учтите, если PHP запущен как (Fast-)CGI приложение внутри вашего веб-сервера, то каждый PHP процесс будет иметь собственный кэш, например, APC данные не будут расшарены между вашими процессами. В этом случае имеет смысл подумать об использовании вместо него memcached, так как он не ограничен процессом PHP.
В сетевой конфигурации APC зачастую выигрывает у memcached в плане скорости доступа, но memcached обладает возможностью масштабироваться быстрее и более широко. Если иметь несколько серверов для обслуживания приложения не входит в ваши планы или вам не нужны дополнительные возможности memcached, тогда APC будет лучшим выбором для кэширования объектов.
Пример использования APC:
<?php
// проверяем есть ли данные, сохраненные как 'expensive_data' в кэше
$data = apc_fetch('expensive_data');
if ($data === false) {
// данных нет в кэше; сохраняем результат вызова функции для дальнейшего использования
apc_add('expensive_data', $data = get_expensive_data());
}
print_r($data);
Подробнее о популярных системах кэширования объектов:
- Функции APC
- Memcached
- Redis
- XCache API
- Функции WinCache
Наверх
Фреймворки
Вместо того, чтобы заново изобретать колесо, многие PHP разработчики используют для построения веб-приложений фреймворки. Фреймворки позволяют абстрагироваться от низкоуровневой разработки и предоставляют удобный интерфейс для выполнения общих задач.
Не обязательно использовать фреймворк в каждом своём проекте. Иногда чистый PHP является оптимальным путём, но, если вам нужен фреймворк, то выберите наиболее подходящий вам тип:
- Микрофреймворки
- Фреймворки «всё-в-одном»
- Компонентные фреймворки
Микрофреймворки, в большинстве, предоставляют оболочку для маршрутизации HTTP запросов к контроллеру, методу и т.д., так быстро, как это возможно, и иногда поставляются с несколькими библиотеками для помощи разработчикам, как например, простая оболочка базы данных и подобного. Они часто используются для построения удалённых HTTP сервисов.
Многие фреймворки добавляют значительное количество возможностей поверх того, что доступно в микрофреймворках, такие известны, как Фреймворки «всё-в-одном». Они зачастую поставляются с ORM, пакетами Аутентификации и т.д.
Компонентно-ориентированные фреймворки являются коллекциями специализированных и узко-специализированных библиотек. Разрозненные компонентно-ориентированные фреймворки, могут быть использованы для создания микро- или «всё-в-одном» фреймворка.
- Популярные PHP фреймворки
Компоненты
Как упоминалось выше, «Компоненты» являются ещё одним подходом к общей цели создания, распространения и внедрения кода. Существуют различные репозитории для компонентов, основными из которых являются два:
- Packagist
- PEAR
Оба содержат инструменты командной строки для облегчения процедур установки и обновления, что более подробно объясняется в разделе Управление зависимостями.
Также существуют компонент-ориентированные фреймворки, которые позволяют вам использовать их компоненты с минимальными (или нет) требованиями. Например, вы можете использовать Валидационный пакет FuelPHP, без нужды в использовании фреймворка FuelPHP. Эти проекты по существу являются ещё одним репозиторием для повторно используемых компонентов:
- Aura
- FuelPHP (2.0 only)
- Laravel’s “Illuminate Components”
- Symfony Components
Наверх
Сообщество PHP так же разнообразно, как и велик сам язык. Члены сообщества готовы помочь начинающим PHP программистам. Подумайте о вступлении в вашу местную группу PHP пользователей (PUG — PHP User Group) или об участии в больших PHP конференциях для изучения лучших практик. Вы можете пообщаться в IRC в канале #phprc на irc.freenode.com и зафолловить твиттер аккаунт @phpc. Знакомьтесь с новыми разработчиками, изучайте новые темы и, помимо всего этого, заводите новых друзей! Также полезны сообщества Google+ PHP Сообщество разработчиков и StackOverflow.
Официальный календарь событий PHP
Если вы живёте в большом городе, есть шанс, что в нём существует группа PHP пользователей. Если же таковой группы нет в официальном списке PUG, вы можете легко найти её в поиске Google или Meetup.com. Если вы живёте в маленьком городе, в котором нет своей PUG, то создайте свою!
Подробнее о группах пользователей PHP на PHP Wiki
Конференции PHP
Сообщество PHP также поддерживает региональные и национальные конференции в разных странах мира. Широко известные члены сообщества PHP часто выступают на этих крупных событиях, так что это хорошая возможность непосредственного обучения от лидеров индустрии.
Найти конференцию PHP
Наверх
PHP (Hypertext Preprocessor) is a popular open-source programming language that is ideal for web development. It is frequently used in conjunction with other technologies to build dynamic and interactive webpages, such as HTML, CSS, and JavaScript.
This primer will cover the fundamentals of PHP and offer an overview of its essential features and capabilities. We will discuss subjects such as:
- Setting up a development environment
- Basic syntax and data types
- Variables and constants
- Control structures (if/else, loops, etc)
- Functions
- Arrays
- Working with forms and GET/POST data
- Connecting to databases
- Working with files and directories
- Error handling and debugging
- Best practices and security considerations
You will have a strong grasp of PHP and be able to construct simple scripts and web pages by the conclusion of this book. You will find more sophisticated features and capabilities as you continue to study and work with PHP, allowing you to construct more complex and dynamic web apps.
Before diving into PHP, it’s important to set up a development environment that will allow you to run PHP scripts. You can utilize a local development environment or a PHP-compatible hosting service. Following that, you may begin by studying PHP’s fundamental grammar, which includes variables, constants, data types, and control structures.
Next, you will learn about functions, which allow you to group related code together and make it easier to reuse and organize your code. Functions are a crucial element in every programming language for building manageable and reusable code.
Arrays are also an important topic to master when working with PHP. Arrays allow you to store and manipulate multiple values in a single variable. Arrays can be used to store and manipulate data, such as a list of items or a user’s personal information.
Another important aspect of web development is working with forms and GET/POST data. PHP provides several built-in functions that make it easy to access and process data submitted by forms. Connecting to databases and working with files and directories are other key concepts to grasp while working with PHP.
Finally, error handling and debugging are crucial skills to have when working with PHP. PHP provides several built-in functions and constructs that allow you to handle and debug errors and warnings that may occur during the execution of your code.
Furthermore, while dealing with PHP, security is a critical factor. PHP has a number of built-in functions and methods to assist you in securing your online application and protecting it from typical security risks.
To further deepen your understanding of PHP, it’s also important to explore and work with some popular PHP frameworks and libraries. Frameworks like Laravel, CodeIgniter, and Symfony give a set of pre-built methods and classes that can help you speed up development, enhance code organization, and make working with databases and other components simpler.
Additionally, it’s also a good idea to explore and learn how to use popular CMS (Content Management Systems) built on PHP such as WordPress, Joomla, and Drupal. These CMSs have a huge and active community, which means you can find a lot of resources, tutorials and plugins to improve your skills.
Finally, it’s also essential to keep up to date with the latest developments and trends in the PHP community. Follow blogs, forums, and social media accounts that focus on PHP development, and consider attending conferences and meetups to connect with other developers and learn about new tools and techniques.
Another important aspect of PHP development is the use of Object-Oriented Programming (OOP) concepts and design patterns. OOP allows you to represent real-world objects in your code, which can help with code structure and maintainability. It’s also a good idea to study and apply common design patterns like the Model-View-Controller (MVC) and Singleton patterns, which may help you arrange your code more logically and efficiently.
Furthermore, it’s important to understand the basics of web servers and how they work with PHP. Apache and Nginx are the most common web servers used with PHP, and understanding how they work can help you troubleshoot and optimize your PHP code. In order to quickly get started we recommend using XAMPP – which installs Apache, MySQL and PHP for you.
Another significant consideration while dealing with PHP is performance. Because PHP is an interpreted language, it can be slower than compiled languages such as C or C++. However, numerous approaches and technologies, such as caching, opcode caching, and profiling may be utilized to increase the efficiency of PHP code.
To summarize, PHP is a flexible and strong programming language commonly used in web development. This article gives a thorough introduction to PHP, including its essential features and capabilities. To master PHP, it is necessary to investigate frameworks and libraries, work with popular CMSs, stay current on the latest developments and trends in the PHP community, employ OOP concepts and design patterns, comprehend the fundamentals of web servers and how they interact with PHP, and consider performance optimization techniques. It’s also critical to practice and constantly enhance your abilities by constructing and working on projects. When it comes to PHP, whether you’re a newbie or an experienced developer, there’s always something new to learn and improve on.
Setting up a development environment
To set up a development environment for PHP, you will need to install a web server, a database management system, and a PHP runtime.
- Install a web server: The most commonly used web servers for PHP are Apache and Nginx. You can download and install either of these web servers on your local machine.
- Install a database management system: PHP works well with a variety of databases, but MySQL is the most commonly used. You can download and install MySQL on your local machine.
- Install a PHP runtime: PHP is a server-side scripting language, so it needs to be installed on your web server. You can download the latest version of PHP from the official website and install it on your web server.
- Configure the web server: After you have installed the web server, you will need to configure it to work with PHP. This will involve editing the server’s configuration files to add the PHP module and set the correct file associations.
- Test your setup: Once you have completed the above steps, you can test your setup by creating a PHP file with a simple script and accessing it through your web server. If everything is working correctly, you should see the output of the script in your browser.
- (optional) Developing Environment: Some developers prefer to use a development environment such as XAMPP, WAMP, or LAMP. These environments bundle Apache, MySQL, and PHP together and make it easy to set up and run a development server on your local machine.
It’s worth noting that the above steps may vary depending on the operating system and version you are using, you should follow the instructions for your specific system.
Instead of setting up the development environment yourself we recommend to use XAMPP.
Learn exactly how to set everything up by using our step-by-step development environment guide.
Basic syntax and data types
PHP has a syntax that is similar to that of many other programming languages, making it simple to learn for developers with prior familiarity with other languages.
- Basic Syntax:
<?php
// This is a single-line comment
/*
This is a
multi-line comment
*/
$x = 5; // this is a variable
echo "Hello World!"; // this is a statement
?>
- PHP code is surrounded by tags, which are intended to differentiate it from other languages such as HTML or JavaScript. The default tags are?php and?>, however if short tags are enabled in your php settings, you can use them instead.
- Comments in PHP are similar to comments in other languages, they start with a double forward slash (//) for single-line comments, or with /* and */ for multi-line comments.
- PHP statements are separated by semicolons (;) and the end of each statement.
- Variables in PHP are denoted by a dollar sign ($), and must start with a letter or underscore and only contain letters, numbers and underscores.
- Data Types:
- PHP supports several data types, including:
- Integers: Whole numbers, such as -5, 0, and 42.
- Floats: Numbers with decimal points, such as 3.14159.
- Strings: Sequences of characters, such as “Hello World!” or “123”.
- Booleans: True or false values.
- Arrays: A collection of values, which can be of any data type.
- Objects: A special data type that represents an instance of a class.
- Resources: A special data type that represents a external resources, like a database connection.
PHP automatically changes data types as needed, but it’s critical to understand and use the different data types effectively to avoid unexpected behavior. To determine the type of a variable, use the functions var dump() or print r().
<?php
$num = 5;
$str = "Hello";
$bool = true;
$arr = array(1,2,3);
var_dump($num); // int(5)
var_dump($str); // string(5) "Hello"
var_dump($bool); // bool(true)
var_dump($arr); // array(3) { [0]=> int(1) [1]=> int(2) [2]=> int(3) }
?>
It’s worth noting that strings in PHP may be expressed with single quotes (‘) or double quotes (“), with single quotes being somewhat quicker and requiring less memory. Single quotation marks will not parse escape sequences, however double quotation marks will.
<?php
$str1 = 'Hello World!';
$str2 = "Hello World!";
echo $str1; // Hello World!
echo $str2; // Hello World!
?>
To summarize, knowing the fundamental syntax and data types in PHP is critical for producing efficient and maintainable code. You can create variables, handle data, and implement fundamental control structures like as loops and conditional statements using this understanding.
Variables and constants
<?php
$x = 5; // variable x is assigned the value 5
$y = "Hello"; // variable y is assigned the value "Hello"
$x += 2; // variable x is now 7
$y .= " World"; // variable y is now "Hello World"
?>
In addition to variables, PHP supports constants, which are identical to variables but cannot be modified once a value is given to a constant. Constants are defined with the define() function, which takes two arguments: the name of the constant and its value.
<?php
define("PI", 3.14);
echo PI; // Outputs 3.14
define("MY_NAME", "John Doe");
echo MY_NAME; // Outputs John Doe
It’s worth noting that constants are case-sensitive by default, but you can make them case-insensitive by passing the third argument as true in the define function.
<?php
define("MY_NAME", "John Doe", true);
echo my_name; // Outputs John Doe
In conclusion, variables and constants are important notions in every programming language, and they are required for storing and manipulating data in PHP scripts. Variables can have their values reassigned, but constants retain the same value once defined. Constants allow you to declare values that you anticipate to remain constant during the life of your script, making your code more legible and manageable.
Control structures (if/else, loops, etc)
Control structures in PHP are used to control the flow of execution of your code, and include if/else statements, loops, and switch statements.
- If/Else Statements: The most basic control structure is the if statement, which allows you to execute a block of code if a certain condition is met. You can also use the else statement to execute another block of code if the condition is not met.
<?php
$x = 5;
if ($x > 0) {
echo "x is greater than 0";
} else {
echo "x is less than or equal to 0";
}
You can also use the elseif statement to chain multiple conditions together, and the ternary operator ( ?: ) as a shorthand for simple if/else statements.
<?php
$x = 5;
$y = 10;
if ($x > $y) {
echo "x is greater than y";
} elseif ($x < $y) {
echo "x is less than y";
} else {
echo "x is equal to y";
}
echo $x > 0 ? "x is positive" : "x is non-positive";
- Loops: There are several types of loops in PHP, including for loops, while loops, and do-while loops. These allow you to repeat a block of code a specific number of times, or until a certain condition is met.
<?php
for ($i = 0; $i < 5; $i++) {
echo $i;
}
$x = 0;
while ($x < 5) {
echo $x;
$x++;
}
$x = 0;
do {
echo $x;
$x++;
} while ($x < 5);
- Switch statements: A switch statement allows you to check the value of a variable against multiple cases. When a match is found, the code associated with that case is executed. If no match is found, the default case is executed if it exists.
<?php
$x = 2;
switch($x) {
case 0:
echo "x is 0";
break;
case 1:
echo "x is 1";
break;
case 2:
echo "x is 2";
break;
default:
echo "x is not 0, 1 or 2";
}
In summary, control structures in PHP are used to regulate the flow of your code’s execution. If/else statements are used to make conditional judgments, loops to repeat a block of code, and switch statements to compare the value of a variable against various situations. Understanding and appropriately using these control structures can help you build more efficient and maintainable code.
Functions
Functions are a crucial element in every programming language for building manageable and reusable code. In PHP, functions allow you to organize a block of code and name it, which may then be called many times throughout your script.
To define a function in PHP, you use the function keyword, followed by the name of the function, a set of parentheses, and a block of code enclosed in curly braces. The function name must start with a letter or underscore, and only contain letters, numbers, and underscores.
<?php
function myFunction() {
echo "Hello World!";
}
myFunction(); // Outputs "Hello World!"
Functions can also take one or more arguments as input, which are supplied to the function in parentheses when it is called. Within the function, these arguments can be utilized to do computations or make judgments.
<?php
function myFunction($x, $y) {
echo $x + $y;
}
myFunction(3, 5); // Outputs 8
Functions can also return a value using the return statement. This can be used to return the result of a calculation or the value of a variable.
<?php
function myFunction($x, $y) {
return $x + $y;
}
$result = myFunction(3, 5);
echo $result; // Outputs 8
In PHP, functions can be defined inside or outside of a class, when a function is defined inside a class it’s called a method, and it can access the properties of the class.
Functions can also be used to build a closure, also known as an anonymous function, which can be saved in a variable and then supplied as an argument to another function or returned as a value.
<?php
$my_closure = function($x) { return $x * 2; };
echo $my_closure(5); // Outputs 10
In summary, functions are a powerful tool in PHP that allow you to group a block of code together and name it, which can then be called multiple times throughout your script. Functions also allow you to take input parameters, return values, and create a closure, making it easier to write maintainable and reusable code. Functions can also be written as methods within a class, allowing you to encapsulate a class’s logic and attributes.
Learn more about functions our article Functions in PHP.
Arrays
An array is a data structure in PHP that allows you to store and organize a group of elements. These items can be of many sorts, such as integers, strings, or even other arrays. Each array element is given a unique index, which is used to access and manipulate the element. Arrays in PHP may be formed using the array() method or the square brackets [] syntax. They may also be modified using built-in methods like sort(), count(), and implode() (). Arrays are an integral aspect of every PHP developer’s arsenal for storing and manipulating vast amounts of data.
Read more about arrays in our Ultimate guide to PHP Arrays.
Working with forms and GET/POST data
When working with forms in PHP, the data submitted by the user is typically sent to the server using the GET or POST method. The GET method appends the form data to the end of the URL, while the POST method sends the data as part of the HTTP request body.
The $_GET global variable may be used to obtain data supplied by a form utilizing the GET technique. This variable is an associative array containing the form data’s key-value pairs. For example, if a form includes an input field called “name” and the user inputs “John Smith,” you may get the result by using $_GET[‘name’].
To access the data submitted by a form using the POST method, you can use the $_POST global variable. This variable works in the same way as $_GET, but it is used to access data submitted via the POST method.
It’s important to validate and sanitize the data before using it, to prevent security vulnerabilities such as SQL injection and cross-site scripting (XSS) attacks.
Additionally, you can use $_REQUEST variable to access data submitted by both GET and POST method.
Once you have access to the data, you can use it to perform various actions such as inserting the data into a database, sending an email, or displaying a message to the user.
In conclusion, forms and GET/POST data are critical in PHP web development. Understanding how to communicate with them is a critical component of developing dynamic and interactive online apps.
Connecting to databases
In PHP, there are several ways to connect to a database. One of the most popular ways is to use the MySQLi extension, which stands for MySQL Improved. The MySQLi extension provides an object-oriented interface for working with MySQL databases. To connect to a database using MySQLi, you will need to use the mysqli_connect()
function. This function takes three parameters: the hostname of the database server, the username, and the password. Once you have connected to the database, you can use other MySQLi functions to execute queries, fetch data, and so on.
Here is an example of how to connect to a MySQL database using MySQLi in PHP:
<?php
$hostname = "localhost";
$username = "root";
$password = "";
$conn = mysqli_connect($hostname, $username, $password);
if (!$conn) {
die("Connection failed: " . mysqli_connect_error());
}
echo "Connected successfully";
?>
The PDO (PHP Data Objects) extension is another common technique to connect to a database in PHP. PDO provides a consistent interface for interacting with several database types, such as MySQL, PostgreSQL, and SQLite. You must use the PDO() constructor to connect to a database using PDO. This constructor accepts three parameters: the database’s DSN (data source name), the username, and the password.
<?php
$dsn = "mysql:host=localhost;dbname=testdb";
$username = "root";
$password = "";
try {
$conn = new PDO($dsn, $username, $password);
// set the PDO error mode to exception
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
echo "Connected successfully";
}
catch(PDOException $e)
{
echo "Connection failed: " . $e->getMessage();
}
?>
It is important to keep in mind that security best practices such as using prepared statements and avoiding SQL injection should always be considered when working with databases in PHP.
Continue reading about MySQL in our Connect to a MySQL database guide.
Working with files and directories
There are various built-in functions in PHP that enable you to operate with files and directories.
To read the contents of a file, you can use the file_get_contents()
function. This function takes the path of the file as a parameter and returns the contents of the file as a string. Here is an example of how to read the contents of a file:
<?php
$file = 'example.txt';
$content = file_get_contents($file);
echo $content;
?>
The file put contents() method can be used to write to a file. This function accepts two parameters: the file’s path and the contents to be written to the file. Here’s an example of writing to a file:
<?php
$file = 'example.txt';
$data = "Hello World!";
file_put_contents($file, $data);
?>
To check if a file exists, you can use the file_exists()
function. This function takes the path of the file as a parameter and returns TRUE
if the file exists and FALSE
if it does not. Here is an example of how to check if a file exists:
<?php
$file = 'example.txt';
if (file_exists($file)) {
echo "The file exists.";
} else {
echo "The file does not exist.";
}
?>
The mkdir() method can be used to create a new directory. This method accepts the directory path as an argument and creates the directory with that path. Here’s an example of creating a new directory:
<?php
$dir = 'example_dir';
mkdir($dir);
?>
The rmdir() method can be used to delete a directory. This method accepts the directory’s path as an input and deletes the directory with the supplied path. Here’s an example of how to get rid of a directory:
<?php
$dir = 'example_dir';
rmdir($dir);
?>
When interacting with files and directories in PHP, it is critical to remember that suitable error handling should be established to manage any difficulties that may emerge, such as file not found, permission refused, and so on.
Error handling and debugging
The process of recording and dealing with problems that occur during the execution of a PHP script is referred to as error handling in PHP. PHP has various error-handling procedures and structures, such as the try and catch statements for managing exceptions and the trigger error() function for producing user-defined problems.
Debugging in PHP refers to the process of finding and fixing errors in a PHP script. PHP provides several tools for debugging, including the error_reporting()
function for controlling the level of error reporting, and the var_dump()
and print_r()
functions for displaying the contents of variables. Additionally, many integrated development environments (IDEs) and text editors have built-in debugging functionality that can be used to step through code, set breakpoints, and inspect variables.
It’s also worth noting that PHP includes a development web server that may be used to execute and test PHP programs without the need for a full web server. This is particularly handy for debugging since it displays any issues that occur in the browser.
In general, adequate error handling and debugging should be implemented in your PHP programs. This can help you detect and solve errors before they create major problems, as well as making maintaining and updating your code easier.
Best practices and security considerations
There are several best practices and security considerations to keep in mind when working with PHP. Some of the most important include:
- Input validation: It’s important to validate all user input to ensure that it meets the expected format and type. This can help prevent common vulnerabilities such as SQL injection and cross-site scripting (XSS).
- Use prepared statements: When working with databases, it’s important to use prepared statements to protect against SQL injection attacks. Prepared statements allow you to separate data from the SQL query, so that user input is not directly inserted into the query.
- Escape output: When displaying user input on a web page, it’s important to properly escape any special characters to prevent XSS attacks. This can be done using the
htmlspecialchars()
function or similar. - Use security functions: PHP has several built-in functions that can help improve security, such as
password_hash()
for storing hashed passwords, andrandom_bytes()
for generating cryptographically secure random numbers. - Keep software updated: It’s important to keep PHP and any other software used in your application up to date in order to take advantage of security fixes and patches.
- Avoid using global variables: Using global variables can lead to security issues and make the code difficult to understand and maintain. Instead, use function arguments, class properties, and other local variables to pass data around.
- Use a PHP framework: Using a well-established PHP framework can help you improve your code organization and also add more security features like CSRF protection and Input validation.
- Avoid using sensitive information in the codebase: It’s a bad practice to store sensitive information like database credentials and API keys in the codebase. It’s recommended to use environment variables to store them.
By following these best practices and security considerations, you can help protect your PHP application from common vulnerabilities and keep your code maintainable and secure.
Q&A
Q: What is PHP?
A: PHP is an abbreviation for Hypertext Preprocessor. It is a server-side scripting language that is used for creating dynamic web pages. It is often used in combination with HTML, CSS, and JavaScript to create interactive and responsive websites.
Q: What type of websites can be built using PHP?
A: PHP can be used to create a wide range of websites, including e-commerce websites, content management systems, social media platforms, and more. Some popular examples of websites built using PHP include WordPress, Facebook, and Wikipedia.
Q: How does PHP work?
A: PHP code is executed on the server, and the resulting HTML is sent to the client’s web browser to be displayed. When a user requests a page that contains PHP code, the PHP code is executed by the server before the page is sent to the client. This allows for dynamic content to be generated on the fly, based on user input or other conditions.
Q: What are the main features of PHP?
A: Some of the main features of PHP include:
- Support for multiple databases, including MySQL, SQLite, and PostgreSQL.
- Support for object-oriented programming.
- Built-in functions for working with strings, arrays, and other data types.
- Support for file handling, including the ability to read and write files on the server.
- Support for cookies and sessions, which can be used to store data on the client’s web browser.
- Support for sending and receiving email.
Q: How do I install PHP on my computer?
A: The installation process for PHP depends on your operating system. On Windows, you can download a pre-compiled binary version of PHP from the official website and install it like any other software. On Mac and Linux, you can install PHP using a package manager like Homebrew or apt-get. Additionally, you will also need a web server like Apache or Nginx and a database management system like MySQL to run PHP on your computer.
Q: How do I run a PHP script?
A: To run a PHP script, you will need to have a web server installed on your computer. Once you have a web server running, you can place your PHP script in the appropriate directory (usually the “htdocs” or “public_html” folder) and then navigate to the script in your web browser. The server will execute the PHP code and return the resulting HTML to your browser.
Q: How do I debug a PHP script?
A: There are several ways to debug a PHP script. One common method is to use the “echo” statement to print out the values of variables and the results of calculations at various points in the script. Additionally, you can use the “var_dump()” function to print out the contents of an array or object. Other tools for debugging PHP include Xdebug, which provides more advanced features like stack traces and code coverage, and the “error_log()” function, which writes error messages to a log file.
Q: What are the best practices for writing PHP code?
A: Some best practices for writing PHP code include:
- Using proper indentation and whitespace to make the code more readable.
- Using descriptive variable and function names.
- Using comments to explain the purpose of the code and any complex algorithms.
- Using functions to organize your code and make it more reusable.
- Using classes and objects to organize your code and take advantage of object-oriented programming.
- Sanitizing user input to prevent security vulnerabilities like SQL injection.
Q: What are the common mistakes made by PHP developers?
A: Some typical mistakes made by PHP developers are as follows:
- Not properly sanitizing user input, which can lead to security vulnerabilities like SQL injection.
- Not properly handling errors and exceptions, which can lead to unexpected behavior and bugs.
- Not properly closing database connections and file handles, which can lead to resource leaks.
- Not properly organizing code with functions and classes, which can make the code difficult to maintain and understand.
- Not properly testing the code, which can lead to bugs and compatibility issues.
- Not keeping up with the latest version of PHP, which can lead to missing out on new features and security updates.
- Not optimizing the code for performance, which can lead to slow loading times and high resource usage.
Exercises
- How do you set up a development environment for PHP on a Windows machine?
- What is the basic syntax for a PHP script?
- What are the data types available?
- How do you declare and initialize a variable?
- How do you declare a constant?
- How do you use control structures (if, for, while, etc.)?
- How do you create and call a function?
- How do you work with arrays?
- How do you handle GET and POST data?
- How do you connect to a MySQL database?
- How do you work with files and directories?
- How do you handle errors and debug?
Answers:
- To set up a development environment for PHP on a Windows machine, you need to install a web server (such as Apache or IIS), PHP, and a database (such as MySQL or MariaDB). You can use a package like XAMPP or WAMP to easily install all three components.
- The basic syntax for a PHP script is to start with <?php and end with ?>. PHP code is executed on the server and can be embedded within HTML code.
- The data types available in PHP include strings, integers, floats, booleans, arrays, and objects.
- To declare and initialize a variable in PHP, use the $ symbol followed by the variable name, and assign it a value using the assignment operator (=). Example: $name = “John”;
- To declare a constant in PHP, use the define() function. The first parameter is the name of the constant and the second parameter is the value. Example: define(“PI”, 3.14);
- In PHP, control structures include if, else, elseif, for, foreach, while, and do-while. They are used to control the flow of a program, and can include conditions and statements.
- To create a function in PHP, use the function keyword followed by the function name, and include the code to be executed within curly braces. To call a function, use the function name followed by parentheses. Example: function greet() { echo “Hello”; } greet();
- In PHP, arrays can be created using the array() function or by using the square bracket notation. Elements can be accessed using the array name and index number. Array functions such as sort(), count(), and implode() can be used to manipulate arrays.
- GET data is passed through the URL and can be accessed using the $_GET array, while POST data is passed through the request body and can be accessed using the $_POST array.
- To connect to a MySQL database in PHP, use the mysqli or PDO extension. The mysql_connect() function is deprecated as of PHP 7.0.
- To work with files in PHP, you can use functions such as fopen(), fread(), fwrite(), and fclose(). To work with directories, you can use functions such as opendir(), readdir(), and closedir().
- To handle errors in PHP, use the error_reporting() function to control the level of error reporting, and the try-catch block to handle exceptions. To debug your PHP code, use the error_log() function to log errors, and the var_dump() function to print variable information. Additionally, you can use the xdebug extension to get more detailed debugging information.