Как расшифровывается php
6 сентября 2023
Скопировано
PHP (Hypertext PreProcessor, «препроцессор гипертекста») — это скриптовый язык программирования. Имеет открытый исходный код. Изначально создавался для разработки веб-приложений, но в процессе обновлений стал языком общего назначения.

Освойте профессию «Backend-разработчик на PHP»
Где и для чего используется PHP
Язык программирования PHP спроектировал датский программист Расмус Лердорф в 1995 году как инструмент для создания интерактивных и динамических веб-сайтов. Расшифровывается как «Hypertext Preprocessor» (гипертекстовый предобработчик). Сейчас PHP активно используют веб-разработчики для создания сайтов и веб-приложений. Это наименее конкурентный язык для работы. Его использует большинство сервисов, и, скорее всего, ситуация не изменится в ближайшие 10 лет. Поэтому специалисты очень востребованы.
Основная область применения — разработка скриптов, которые работают на стороне сервера. Также можно создавать скрипты командной строки и GUI-приложения (приложения с графическим интерфейсом пользователя).
PHP используется в проектах разных масштабов: от браузерной игры и социальной сети до крупных веб-приложений в интернете, таких как Facebook, ВКонтакте, Google, W3C, Yahoo, NASA. На PHP написаны многие системы управления контентом (CMS), например Drupal, WordPress, Joomla. Также он использовался при разработке популярных фреймворков для создания сайтов, например Yii2, Laravel, Symfony.
PHP.net — это официальный веб-сайт языка программирования PHP, который широко используется для создания веб-сайтов и веб-приложений. Этот веб-сайт предоставляет обширную документацию, ресурсы, и информацию о PHP, включая официальную документацию по языку, загрузки последних версий, новости, сообщество пользователей и разработчиков, а также форумы для обсуждения вопросов и проблем, связанных с этим языком программирования.
12 месяцев
Backend-разработчик на PHP
Изучайте язык, на котором написано абсолютное большинство сайтов

Свойства PHP
PHP — язык с динамической типизацией. Это означает, что переменная не определяется жестко и заранее (если число, то int, если строка — string). Динамическая типизация позволяет присваивать одной и той же переменной несколько значений: она может быть массивом, строкой, числом, объектом и т. д. Динамическая типизация удобная и гибкая, но приводит к потреблению большого количества оперативной памяти и уменьшает скорость работы.
Также PHP — интерпретируемый язык. Это означает, что код, который написан на PHP, не компилируется (преобразуется в машинный), а выполняется строка за строкой с помощью программы-интерпретатора, которая читает каждую из них и выполняет то, что там указано.
Возможности
Вот некоторые из ключевых возможностей PHP:
- Динамические веб-страницы: PHP позволяет создавать динамические веб-страницы, которые могут адаптироваться к пользовательскому вводу и предоставлять интерактивные функции.
- Обработка форм: PHP легко интегрируется с HTML-формами, что делает его идеальным для обработки данных, отправляемых с веб-страниц.
- Работа с базами данных: PHP имеет широкую поддержку для множества систем управления базами данных (например, MySQL, PostgreSQL, SQLite), что делает его отличным выбором для создания веб-приложений с базами данных.
- Работа с файлами: PHP предоставляет функции для чтения, записи и обработки файлов на сервере, что полезно для управления содержимым сайта.
- Создание сессий: PHP может создавать и управлять сессиями пользователей, что полезно для отслеживания состояния пользователя между запросами.
- Работа с изображениями: PHP позволяет манипулировать изображениями, изменять их размеры, форматы и многое другое.
- Создание API: PHP может использоваться для создания веб-сервисов и API, что делает его полезным для разработки клиент-серверных приложений.
- Интеграция с другими технологиями: PHP может легко интегрироваться с другими технологиями, такими как HTML, CSS, JavaScript, что позволяет создавать полноценные веб-приложения.
- Множество библиотек и фреймворков: Существует множество библиотек и фреймворков на PHP, которые упрощают разработку и предоставляют готовые решения для различных задач.
- Кросс-платформенность: PHP поддерживается на различных операционных системах (Windows, Linux, macOS) и работает с различными веб-серверами (Apache, Nginx).
Чем PHP отличается от других языков программирования
CSS- и НТМL-файлы, как и файлы изображений, сервер отправляет сразу клиенту (браузеру), независимо от содержания. В отличие от них PHP-файлы содержат код, который интерпретируется на сервере. Клиент (браузер) получает не сам PHP-код, а результат его исполнения, который, как правило, является чистым CSS и HTML. Пользователь не может увидеть исходный код программы. Это хорошо с точки зрения безопасности, так как в этом случае трудно понять логику сайта.
Читайте также Что выбрать: PHP или Python?
PHP хранит состояние, созданное в текущий момент времени. В отличие от классических компилируемых языков программирования, которые работают все время от запуска до остановки программы, PHP-скрипт начинает выполняться с момента обращения веб-сервера и заканчивает (забывает все, что знал), когда возвращает сгенерированный пакет данных обратно веб-серверу.

- Входящее соединение принимает и анализирует веб-сервер. Происходит интерпретация и формируется ответ.
- Как правило, результат работы PHP-интерпретатора (программы, выполняющей PHP-код) — HTML-код. На этом этапе PHP-скрипт преобразуется в статический HTML-код, который может читать браузер. В процессе работы PHP может использовать MySQL — свободную систему управления базами данных (БД). Она выполняет обмен информацией с сервером базы данных на согласованном языке (SQL). Сервер базы данных и веб-сервер образуют тандем, читающий и записывающий информацию и данные, предоставляя их посетителям сайта.
- БД отправляет данные PHP-скрипту, который расставляет их по нужным местам страницы или пакета данных и формирует окончательный ответ. Ответ отправляется обратно веб-серверу, который и возвращает клиенту страницу или пакет данных.
Возможность комбинировать PHP- и HTML-код позволяет создавать динамические страницы, которые показывают каждый раз разную информацию в зависимости от полученных от пользователя данных или настроек.

Станьте РНР-программистом — эта профессия идеально подходит
для входа в IT
| Параметр | PHP | HTML | Python |
|---|---|---|---|
| Тип | Язык программирования | Язык разметки | Язык программирования |
| Применение | Создание динамических веб-сайтов и приложений, обработка данных на сервере | Создание структуры и содержания веб-страниц | Разработка веб-приложений, анализ данных, научные вычисления |
| Дата создания | 1995 год | 1989 год | 1991 год |
| Синтаксис | Программный синтаксис | Разметочный синтаксис | Программный синтаксис |
| Для чего нужен | Обработка данных и логики на сервере | Определение структуры веб-страницы | Разработка общего назначения, научные и аналитические задачи |
| Базовая библиотека | Встроенные функции и классы для работы с веб-серверами, базами данных и другими задачами | Отсутствует | Обширная стандартная библиотека, включая модули для различных задач |
| Примечание | PHP выполняет серверный код и генерирует HTML для клиента | HTML определяет структуру и контент веб-страницы, но не имеет логики | Python используется как универсальный язык программирования с множеством приложений |
Таблица сравнения PHP, HTML и Python
Особенности синтаксиса
Синтаксис языка берет начало из C, Java и Perl. Классический PHP-сценарий представляет собой набор выражений. Каждое из них начинается с новой строки и заканчивается точкой с запятой. Выражение — это инструкция, по которой PHP-интерпретатор выполняет одно действие, например умножает числа, выводит информацию на экран.
Вот так выглядит самый простой сценарий, который выводит на экран строку «Hello world!»:
Коды PHP и HTML могут встраиваться вместе в файле с расширением PHP, например в index.php. Вот тот же пример, но расположенный внутри HTML:
Фрагмент ?> сообщает серверу, где заканчивается PHP-сценарий. Если после кода в документе ничего не следует, фрагмент ?> не обязателен.
Версии PHP и их различия
PHP 3.0. Первая версия, напоминающая современный интерпретатор, вышла в 1997 году. Главное преимущество — возможность расширения ядра и добавления дополнительных модулей сторонними разработчиками. В версии 3.0 появилась поддержка ООП-синтаксиса. Также был усилен и сам синтаксис языка.
PHP 4.0. Появилась в 2000 году и получила обновленный движок Zend Engine (название сложилось из имен его создателей — владельцев Zend Technologies). Значительно улучшилась производительность. Версия стала поддерживать больше серверов и HTTP-сессий. Обработка вводимой пользователем информации стала безопаснее. Были созданы несколько новых языковых конструкций.
PHP 5.0. Вышла в 2004 году. Появлению предшествовали серия пререлизов и долгая разработка. Язык управляется обновленным ядром Zend Engine 2.0 с принципиально новой объектной моделью и прочими дополнениями.
PHP 7.0. Вышла в 2015 году. Увеличилась производительность: появилась возможность обрабатывать больший объем трафика теми же ресурсами веб-сервера. В новой версии стало доступно указывать тип возвращаемых из функции данных, добавился контроль передаваемых типов для данных и новые операторы.
PHP 8.0. Это последний вариант, который был выпущен в конце 2020 года. Язык получил поддержку union-типов (структур данных или значений, которые могут иметь несколько различных представлений), аннотации (атрибуты), а также компиляцию байт-кода в машинный код во время работы программы (JIT-компиляцию). Microsoft решили не поддерживать версию 8.0 для Windows, поэтому теперь эту работу проводят участники из сообщества, заинтересованные в работе PHP на операционной системе.
Плюсы и минусы
PHP, как и любой язык программирования, имеет свои преимущества и недостатки:
Плюсы
- Для PHP есть множество баз данных, фреймворков и библиотек.
- Язык бесплатный, код находится в открытом доступе.
- Язык гибкий и предоставляет много свободы.
- PHP совместим практически со всеми современными серверами.
- Простой синтаксис.
- PHP подходит новичкам, ему легко научиться и практиковать полученные знания можно почти сразу.
- Язык имеет простую систему объектов и классов.
Минусы
- Для работы с PHP желательно знание HTML и CSS.
- Из-за простоты и гибкости PHP сложно поддерживать. Написать плохой код очень легко, найти ошибку — тяжело.
- PHP — не очень производительный язык. Его конкурент JavaScript быстрее.
- Из-за смеси PHP и HTML на многостраничных сайтах может быть затруднительно найти необходимую часть кода.
- В названиях функций стандартной библиотеки отсутствует четкая система: одни имеют сокращения и подчеркивания, другие — нет. Иногда в названиях функций для работы со строками встречаются обозначения str, а иногда их не бывает.
Для устранения недостатков PHP многие разработчики используют фреймворки, такие как Laravel, Symfony или Yii, которые предоставляют инструменты и структуру для более структурированной и безопасной разработки.
Backend-разработчик на PHP
Освойте backend-разработку с нуля и получите работу в IT. Изучите backend SQL и работу с базами данных, освойте основы администрирования и фреймворк Laravel
Простейшая программа на PHP

Итак, без лирического вступления сразу перейдём к программе. Вообще, как я уже говорил, сценарии на PHP выполняются на стороне сервера. Поэтому просто так взять и проверить их работу на локальном компьютере не получится. Но есть несколько путей:
- Если у вас есть свой сайт, который поддерживает РНР, то вы можете создать там проверочную страницу и отрабатывать на ней все свои программы.
- Можно установить PHP-сервер на свой компьютер, даже если у вас Windows, и тогда вы сможете проверять свои программы на РНР непосредственно на своём компьютере.
- Третий путь — самый простой. Можно воспользоваться онлайн-интерпретатором. И хотя там вы не сможете опробовать совершенно все возможности РНР, для изучения основ языка этого более чем достаточно. Именно этот способ я и буду использовать в большинстве своих примеров. Вот ссылка на онлайн-интерпретатор PHP.
Итак, вот наша первая программа на PHP — традиционный Hello World:
Скрипт PHP встраивается в HTML-документ с помощью открывающего тега . Между ними пишется программа:
Инструкция (именно инструкция, а не функция) echo выводит одну или несколько строк. Если вы хотите вывести несколько переменных или констант, то их надо разделять запятыми. Выводить можно не только строковые значения, но и данные других типов. При этом интерпретатор будет пытаться преобразовать их в строки:
echo «10 + 15 color:blue;»>10 + 15;
Здесь мы передаём на вывод два аргумента — строку и число. Причём в качестве второго аргумента мы передаём выражение, которое будет вычислено и на экран будет выведен уже результат. То есть при выполнении этого кода мы увидим:
10 + 15 = 25
Кроме описанной выше инструкции в РНР есть ещё инструкция (тоже инструкция, а не функция) print . В отличие от echo она может принимать только один аргумент и возвращает значение (всегда 1). Пример:
Круглые скобки также необязательны.
Вот так примерно будет это выглядеть:
Чтобы выполнить вашу программу в интерпретаторе, нажмите зелёную кнопку с белым треугольником и надписью Run. В нижней части в области вывода данных на чёрном фоне вы увидите нашу вожделенную строку «Hello, WORLD. » .
Это и есть ваша первая простейшая программа на PHP, которую вы только что написали и выполнили. С чем вас и поздравляю!
PHP: неправильный путь

В мире PHP-программирования существует набор трендов. Некоторые люди активно продвигают их (в книгах и на сайтах) как «современный PHP», а другие подходы выставляют как устаревшие, глупые или просто неверные.
Похоже, все эти люди без устали стараются заставить каждого программировать так, как они считают нужным. Эта статья написана, чтобы поделиться прагматичным взглядом на PHP-программирование. Взглядом, продиктованным опытом и практическими последствиями, а не популярными тенденциями, теориями или академическими догмами. Материалы, представленные на сайте PHP — The Wrong Way, будут обновляться по мере появления новой информации. Приглашаем всех поучаствовать в этом.
Опасность экстремизма
С правилами и руководствами по программированию есть одна проблема: они часто имеют смысл только в конкретных условиях. Если выйти за рамки этих условий, то хорошее правило превращается в ужасное. По сути, любое хорошее правило, доведенное до крайности, становится плохим.
Важно понимать это, потому что экстремисты от программирования часто неверно использовали многие принципы и правила разработки ПО, которые появлялись время от времени и предлагались разными людьми.
Опыт подсказывает, что неверное использование основных руководств и правил всегда усложняет проекты, снижает их безопасность и приводит к ошибочным, а иногда и к катастрофическим результатам.
Принцип KISS, который некоторые расшифровывают как «Keep It Simple, Stupid», — чрезвычайно мудрый и правильный, опытные люди призывают следовать ему. Но даже KISS может стать угрозой для проекта, если довести его до абсурда. Есть такое понятие, как излишняя простота, что в нашем случае приводит к недостатку функциональности.

Неправильный путь: религиозное следование правилам и руководствам.
Постоянное использование фреймворков
Все PHP-фреймворки общего назначения — отстой!
Расмус Лердорф
В PHP-сообществе по-настоящему плохая тенденция превратилась в де-факто стандарт при разработке веб-приложений. Речь идёт об использовании популярных фреймворков общего назначения.
Это явление широко распространилось. Причина тому — не улучшение результатов разработки и не правильность выполнения каких-то операций с точки зрения технологий и архитектуры. Просто некоторые авторы фреймворков увлекли за собой сообщество разработчиков с помощью полемики, направленной против создания приложений с нуля. Характерными лозунгами стали «Не изобретайте колесо!» и «Не надо всё делать самостоятельно, об этом уже позаботились более опытные».
Многие из современных программистов полностью игнорируют фундаментальные принципы нормального программирования и тратят кучу времени, фантазируя о новых слоях и уровнях сложности, чтобы стать умнее и круче тех, кого они считают своими сверстниками.
Этим людям настолько нравится увлекать других за собой, становиться своеобразными лидерами мнений в PHP-сообществе, убеждать всех использовать свежие и «модные» open source инструменты, что они забывают удостовериться в осмысленности и толковости своих советов. Фреймворк общего назначения можно сравнить с собранным на фабрике домом. Строительство приложения с помощью такого фреймворка сделает вас кодером или программистом в той же степени, как возведение заранее собранных домов превратит вас в плотника.
В этой статье мы различаем фреймворки и библиотеки по следующим признакам:
- Библиотека — это набор многократно используемого кода. Например, стандартные библиотеки С или Go. Код библиотеки можно легко и без ограничений внедрить в проект. Она состоит из маленьких фрагментов, у каждого из них есть конкретная функциональность.
- Фреймворк — это не просто набор многократно используемого кода: вы не сможете вырезать кусок из фреймворка и вставить его в проект. Эта система помогает создавать ПО, но в то же время накладывает на вас ограничения, присущие самому фреймворку. Кроме того, во фреймворке немало взаимозависимой функциональности: одна часть не сможет работать без других.
А PHP Расмус Лердорф изначально создавал как набор инструментов, написанных на С, позволяющих легко и быстро разрабатывать динамический HTML. PHP таким задумывался и таким остался, он сам и есть фреймворк.
Всё время своего существования PHP активно развивался, и сегодня он может использоваться для гораздо более разнообразных задач, нежели строительство HTML и веб-сайтов. Но неправильно относиться к PHP как к фреймворку. По своей природе он является уровнем абстракции для разработки веб-приложений, который целиком написан на процедурном С.
Использовать библиотеки в проектах совершенно естественно. В комплекте поставки PHP идёт набор библиотек, которые могут расширить ваш код. Например, PDO — маленькая библиотека, предоставляющая согласованный интерфейс для обращения к базам данных в PHP.
А вот использование фреймворка поверх PHP — совсем другое дело.
В этом случае вы добавляете уровень абстракции поверх другого уровня абстракции, который изначально создавался как базовая точка отсчёта. Добавочный уровень, обеспечиваемый фреймворком, может просто организовывать ваш код в заранее заготовленные наборы шаблонов. Или может увеличивать сложность с помощью переплетения сотен или тысяч классов и методов в адскую кашу зависимостей. Но в любом случае вы добавляете в код новый уровень сложности, который совершенно не нужен!
Обретение опыта начинается с интерфейса. Интерфейс — это результат базовых технологий и определённого количества уровней абстракции. Чем больше абстракции вы используете, тем менее эффективным становится интерфейс, тем больше ошибок вы закладываете в приложение. Чем выше абстракция, тем больше деталей и эффективности вы теряете.
Чётко уясните: строк кода в любом проекте должно быть как можно меньше, чтобы код стал как можно чище и читабельнее!
Людям не нужны фреймворки общего назначения. Ни у кого нет общих проблем, каждый пытается решать очень специфические проблемы.
Расмус Лердорф
Некоторые компании тоже проникаются суетой вокруг PHP-фреймворков и начинают использовать их в своих проектах, что в результате приводит к катастрофе. Компании сталкиваются с тем, что фреймворки общего назначения плохо помогают решать конкретные задачи, к тому же очень медленно работают. Фреймворки невозможно масштабировать, и многие компании пытаются выдрать из них куски в отчаянной надежде заставить работать то, что изначально не требовалось.
Всегда используйте прагматичный подход, при котором:
Действие или политика продиктованы рассмотрением прямых практических последствий, а не теорией или догмой.
Словарь английского языка Collins, полная версия, 12-е издание, 2014

Неправильный путь: всегда использовать фреймворк поверх PHP.
Постоянное использование шаблонов проектирования
У меня сильная аллергия на оторванные от жизни проекты и шаблоны проектирования. Питер Норвиг написал хорошую статью о том, что шаблоны проектирования — это лишь недостатки вашего языка программирования. Перейдите на язык получше. И он абсолютно прав. Все поклоняются шаблонам и только и думают: «Ага, я воспользуюсь шаблоном Х».
Брендан Айх. Coders at work — Reflections on the Craft of Programming
Шаблоны проектирования — это многократно используемые решения часто возникающих проблем в архитектуре приложения. Шаблоны — это не законченный проект, который может быть напрямую преобразован в код. Это лишь описание, идея того, как решить проблему, для использования во многих разных ситуациях. Объектно ориентированные шаблоны обычно демонстрируют связи и взаимодействия между классами или объектами без определения финальных классов или объектов приложения.
PHP поддерживает императивные, объектно ориентированные, процедурные и рефлективные парадигмы. PHP — это огромный ящик с инструментами, позволяющий решать самые разные задачи самыми разными способами, а не только одним. PHP — это свобода, быстрые и масштабируемые решения.
Пытаясь улучшить себя и в особенности свой код, мы иногда зацикливаемся на философии конкретных шаблонов или идей, при этом забывая мыслить практично.
Когда я вижу в своей программе шаблоны, для меня это сигнал о неприятностях. Структура программы должна отражать только решаемую проблему. Любые другие закономерности в коде говорят (по крайней мере, мне) о том, что я использую недостаточно сильные абстракции. Например, что я вручную генерирую расширения макросов, которые нужно написать.
Пол Грэм
Нельзя попадать в ловушку философии или идеи, стоящей за конкретным шаблоном или решением. Наша главная задача — сделать код как можно более лёгким для понимания, а значит, безопасным и простым в сопровождении.
Также нельзя забывать о существовании антишаблонов. Эти шаблоны могут часто использоваться, но они неэффективны или даже контрпродуктивны.
Я думаю, изначально шаблоны были некими узнаваемыми лучшими решениями частых проблем. Но спустя некоторое время мы обнаружили, что приложения стали в десять раз сложнее, чем нужно, потому что люди пытаются запихнуть туда все шаблоны, о которых они читали («Моё приложение хорошо продумано, потому что по горло нагружено шаблонами»). Так что моё представление о ценности шаблонов изменилось.
Пол Уитон. Evil Design Patterns
Всегда используйте прагматичный подход, при котором:
Действие или политика продиктованы рассмотрением прямых практических последствий, а не теорией или догмой.
Словарь английского языка Collins, полная версия, 12-е издание, 2014

Неправильный путь: искать шаблон для решения проблемы.
Постоянное использование объектно ориентированного программирования
Проблема ОО-языков в том, что они тащат за собой всё своё неявное окружение. Вы хотели банан, но при этом получили гориллу, которая держит банан, и все джунгли в придачу.
Джо Армстронг. Coders at work. Reflections on the Craft of Programming
Абстракция — это сила. А что меня действительно отвращает и о чём я говорил ещё в 1990-е, так это CORBA, COM, DCOM, объектно ориентированная чушь. В то время каждый стартап предлагал какую-нибудь безумную вещь, которая при запуске вызывала 200 тысяч методов и выводила «Hello world». Это же пародия! Вам, как программистам, не нужно ассоциировать себя с такими вещами.
Брендан Айх. Coders at work. Reflections on the Craft of Programming
Многие разработчики и компании сегодня считают, что ООП — единственный оправданный способ разработки. А те, кто с этим спорят, немедленно осознают, что идут против «общепринятого мнения» индустрии.
Блоги и форумы, посвящённые программированию, полны защитников ООП, уверенных в том, что они понимают, о чём говорят, хотя какого-либо стандартного определения не существует.
Но дело в том, что так называемое объектно ориентированное программирование очень часто бывает излишне сложным!
Мы, специалисты по информатике и программисты, должны оставлять предрассудки в стороне и искать лучшее решение для конкретной проблемы.
Сегодня одно из главных преимуществ PHP — поддержка императивной, функциональной, объектно ориентированной, процедурной и рефлективной парадигм. PHP — это огромный ящик с инструментами, позволяющий решать самые разные задачи самыми разными способами, а не только одним.
Когда мы пытаемся решать разные проблемы в рамках приложения с помощью одной конкретной парадигмы программирования, мы перестаём творчески мыслить и эффективно работать.
Маленький исторический урок
Один из лучших способов понять парадигму программирования — посмотреть, как она возникла. В чём причина? Из-за каких проблем в других парадигмах понадобился новый подход? Была ли проблема практическая или академическая? И сколько времени прошло с момента создания парадигмы?
Неважно, что говорит человек Х или какое определение даёт человек Y. Важны исторические предпосылки возникновения парадигм.
Есть два пути разработки архитектуры приложения. Первый — сделать её настолько простой, чтобы, очевидно, недостатков не было. Второй — сделать её настолько сложной, чтобы очевидных недостатков не было.
Чарльз Энтони Ричард Хоар
Раньше, ещё до пришествия ООП, примерно в конце 1950-х, для создания многих программ использовали языки с упором на неструктурированное программирование. Их иногда называют языками первого и второго поколений. Неструктурированное программирование исторически стало первой парадигмой. Её активно критиковали за спагетти-код.
Есть и высоко-, и низкоуровневые языки, использующие неструктурированное программирование. Например, BASIC, COBOL, MUMPS, JOSS, FOCAL, TELCOMP, машинный код, ранние системы ассемблера (без процедурных метаоператоров), ряд скриптовых языков. Программа на неструктурированном языке обычно состоит из последовательно расположенных команд или выражений, обычно по одной на строку. Строки либо нумеруются, либо могут содержать метки, позволяющие потоку выполнения переходить к любой из строк (вроде непопулярного выражения GOTO). В 1960-х появилось структурное программирование, во многом благодаря известному письму Эдсгера Дейкстра Go To statements considered harmful.
Структурное программирование — это парадигма, улучшающая чистоту, качество и процесс разработки с помощью подпрограмм, блочных структур и циклов. Это в противовес простому перепрыгиванию выражения GOTO.
Затем из структурированного программирования возникло процедурное. В его основе лежит концепция «вызова процедуры». Это ещё одно название для «вызова функции». Процедуры также известны вам как подпрограммы или методы. По сути, это серия вычислений, которые необходимо выполнить. Любая процедура может быть вызвана другими процедурами или самостоятельно в любое время в ходе исполнения программы.
Сначала все процедуры были доступны в любой части программы как глобальные данные. В маленьких программах это не проблема, но по мере усложнения и увеличения программ небольшие изменения в одной части начинали сильно влиять на многие другие части. Одно маленькое изменение процедуры могло привести к каскаду ошибок в куче других процедур, зависящих от неё.
Возникла новая методика, позволяющая разделять данные на разные области видимости: «объекты». К одним и тем же данным могли обратиться только конкретные процедуры, принадлежащие к той же области видимости. Это называется скрытием данных, или инкапсуляцией. В результате удалось гораздо лучше организовать коды.
Вначале объекты не назывались объектами, они просто рассматривались как отдельные области. Позднее, когда уменьшились зависимости и связи между переменными внутри этих областей, их стали рассматривать как изолированные сегменты, и в конце концов возникли концепции «объектов» и «объектно ориентированного программирования».
Затем, в основном из-за появления Java, появились новые модные термины, а «процедуру», или «функцию», переименовали в «метод», когда он принадлежит отдельной области видимости. Переменные переименовали в «атрибуты», когда они принадлежат отдельной области видимости.
Так что объект, по сути, — это просто набор функций и переменных, которые теперь называют методами и атрибутами.
Методы и атрибуты изолируются внутри отдельной области видимости с помощью «класса». А когда создаётся экземпляр класса, он называется объектом.
Объекты могут ссылаться друг на друга, и благодаря этому методы (функции) внутри них тоже «взаимодействуют» друг с другом. Также объекты могут «наследовать» методы от других объектов, тем самым расширяя их, это называется «наследование». Это способ многократного использования кода, позволяющий создавать независимые расширения приложений через публичные классы и интерфейсы. Взаимосвязи между объектами породили иерархию. Наследование было создано в 1967 году для языка Simula 67.
Объекты также могут наследовать методы от других объектов и «переопределять» их с помощью дополнительной или изменённой функциональности, это называется «полиморфизм».
В разных языках эти идеи реализованы очень по-разному.
Объектно ориентированное программирование — это иной способ организации кода. Это расширение процедурного программирования, связанное с сокрытием данных (инкапсуляцией) и избеганием глобальных областей видимости. Это расширение функций посредством «заимствования» их чертежей без влияния на оригинальный код (наследование). И это переопределение функций без влияния на оригинальный код (полиморфизм).
Модель ООП позволяет легко создавать программы путём аккреции (наращивания). На практике это зачастую означает, что это структурированный способ написания спагетти-кода.
Пол Грэм. Ansi Common Lisp

Неправильный путь: всегда использовать объектно ориентированное программирование.
Бояться чужого кода
Один из частых аргументов, оправдывающих применение фреймворков, — нежелание людей иметь дело с кодовыми базами, сделанными из фрагментов кода, написанного другими.
Это довольно странное мышление, в основном характерное для веб-разработчиков, говорит о недостатке профессионализма и опыта.
Совершенно нормально создавать приложение и работать с кодом, написанным другими. Это часть повседневной работы профессионального программиста, и не нужно её бояться.
Профессионал не будет ныть, что его работа теперь полностью зависит от кода сотрудника, который, вероятно, больше не имеет отношения к компании или проекту, а вот если бы этот сотрудник использовал фреймворк А или фреймворк Б, то это сэкономило бы вам день работы.
Профессионалы так не думают. Ни один.
Возможно, свою роль в распространённости такого мышления играет низкий порог входа в веб-разработку на PHP. Но в любом случае это говорит о том, что человек идёт по неверному пути.
Программирование во многом подразумевает взаимодействие с людьми, использующими чужой код. Это часть работы: пытаться улучшить существующую кодовую базу, и иногда приходится её полностью переписывать. Почитайте, что говорят мастера программирования в книге Coders at work. Reflections on the Craft of Programming.
Некоторые из крупнейших и наиболее успешных кодовых баз в мире разработали сотни людей, которые никогда не встречались друг с другом. Эти базы созданы без использования фреймворков, исключительно на процедурных языках программирования с применением одной лишь процедурной парадигмы. И никто даже не мечтал сделать по-другому.
Ядро Linux содержит более 20 миллионов строк кода, написанных исключительно с помощью процедурного программирования. В его создании участвовали 14 тысяч человек — и никаких фреймворков. Разные возможности BSD и большая часть Linux GNU userland также написаны только с помощью процедурного программирования без применения фреймворков.
То же самое можно сказать о сотнях open source проектов по всему миру, заброшенных авторами только для того, чтобы их подхватили другие опытные программисты. По многим из этих проектов очень мало документации (или её вообще нет), нет комментариев в коде, нет руководств или иных видов помощи.
Да чего уж там — вся кодовая база PHP написана на С, процедурном языке, без фреймворков.
Когда вы определяете класс в PHP или когда вы запускаете свой любимый PHP-фреймворк, вы выполняете чью-то процедурную работу!
Конечно, бывает и ужасный код, который, вероятно, изначально никак не проектировался или который разросся во много раз, но клиент не захотел его переписывать. Кодовая база настолько ужасна, что вы не можете найти концов. Но ни один фреймворк не защитит вас от такой ситуации. Зачастую это стадия нормального роста программы. В конце концов, любой фреймворк просто порвётся на куски.
Безусловно, существует кошмарный спагетти-код, но никто не пишет его намеренно. Иногда это результат нехватки опыта, зачастую — вина клиентов, много раз меняющих спецификации посреди разработки. Но в обоих случаях вы бы всё равно получили спагетти-код, даже при использовании фреймворка. И неважно, насколько интенсивно вы станете применять объектно ориентированную парадигму: результат окажется тем же.
Как программисты, мы должны предотвращать такие ситуации, но это нормально, в этом заключается искусство программирования, это часть того, что называется быть программистом!

Неправильный путь: бояться кода, написанного другими.
Следование стандартам PHP-FIG
FIG расшифровывается как Framework Interoperability Group (Группа по совместимости фреймворков).
PHP-FIG была создана разработчиками фреймворков на конференции php|tek в 2009 году. С тех пор её состав увеличился с 5 до 20 участников.
С PHP-FIG связано много споров. Одни считают это лучшим начинанием PHP-сообщества со времён возникновения самого PHP. Другие уверены, что стоит вообще поскорее забыть о существовании этой группы.
Одна из проблем заключается в том, как PHP-FIG позиционирует себя в своём FAQ:
Задача нашей группы — дать возможность участникам говорить об общности между нашими проектами и постараться найти пути совместной работы. Наша аудитория — это мы сами, но мы прекрасно понимаем, что на нас смотрит всё остальное PHP-сообщество. Мы будем рады, если другие захотят принять то, что мы делаем, но это не самоцель. Никто в нашей группе не указывает вам, как создавать приложения.
Однако если мы посмотрим на работу нескольких участников группы, становится очевидно, что реальная цель полностью противоречит заявленному. Группа всячески старается превратить PHP-FIG в «группу PHP-стандартов», что было их первоначальным названием. В книгах участников группы, на их сайтах, в блогах, на форумах и т. д. работу PHP-FIG именуют современным PHP, а все остальные подходы объявляют устаревшими.
Проблема PHP-FIG в том, что, хотя многие фреймворки и open source-проекты внедрили у себя ряд стандартов группы, сами эти стандарты в основном призваны решать проблемы «с точки зрения фреймворка», что делает их бесполезными во многих практических ситуациях.
Немало разработчиков создают ПО, которое должно быть крайне эффективным, безопасным, выгодным, чтобы его хотели купить и использовать. Их нельзя отвлекать стандартами, которые должны соответствовать потребностям фанатиков фреймворков. Это будет катастрофой для бизнеса.
Если и нужна какая-то группа, то её стандарты должны отражать интересы всего PHP-сообщества, а не одних лишь разработчиков фреймворков и open source CMS проектов. Такая группа должна представлять разработчиков самого языка PHP, с гораздо большим количеством участников, причём с правом голоса.
Если вы решили следовать стандартам PHP-FIG, то вы должны понимать, что некоторые из них — например, стандарты автозагрузчика PSR-0 и PSR-4 и ряд других — напрямую влияют на то, как вы пишете код ПО.
Во многих сферах требуется высокомасштабируемое, критичное ко времени выполнения, экономически выгодное ПО, которое просто невозможно создать, если следовать стандартам PHP-FIG.

Неправильный путь: следовать стандартам PHP-FIG, за исключением PSR-1 и PSR-2.
Пренебрежение безопасностью
С программистами есть одна проблема: вы никогда не знаете, что делает программист, пока не становится слишком поздно.
Сеймур Крей. defprogramming.com
Безопасный код — это способ написания программ, устойчивых к атакам злоумышленников и забавляющихся, а также других программ. Безопасный код защищает данные от кражи или повреждения. Небезопасный код может предоставить атакующим контроль над сервером или идентификационными данными пользователей. Последствия — любые, вплоть до выхода сервиса из строя и взлома систем тысяч пользователей.
Каждая программа — потенциальная цель для атаки. Нападающие попытаются найти в ваших приложениях уязвимости и использовать их, чтобы похитить важную информацию, нарушить целостность программ и данных, получить контроль над серверами и сетями. На кону собственность ваших клиентов и ваша репутация.
Нельзя просто добавить безопасность в приложение!
Чтобы сделать небезопасное приложение безопасным, возможно, придётся существенно перепроектировать его. Вы должны определять происхождение угроз для вашего ПО и внедрять методики безопасного кода с самого начала, придерживаясь их в течение всего планирования и разработки приложения.
Безопасность критических программных ресурсов сегодня важна как никогда, поскольку основной вектор атак неуклонно перемещается на уровень приложения. По итогам исследования SANS 2009 года, атаки против веб-приложений составили более 60 % всех атак, зарегистрированных в интернете.
Особенность PHP в том, что и это язык программирования, и веб-фреймворк. В язык встроено много веб-функций, из-за которых очень легко написать небезопасный код.
Безопасность по умолчанию
Сложность убивает. Она высасывает жизнь из разработчиков, затрудняет планирование продуктов, их создание и тестирование, ставит перед нами вызовы в сфере безопасности и утомляет конечных пользователей и администраторов.
Рей Оззи
Чтобы разрабатывать приложения с внедрением правильных требований по безопасности, необходимо использовать методики написания безопасного кода и уделять внимание рискам в ежедневных операциях, своих мыслях и процессе возможных вторжений злоумышленников.

Неправильный путь: не разрабатывать приложение безопасным по умолчанию.
Всё вышеописанное легко понять неправильно — давайте кое-что проясним.
В чём цель вашего сайта и почему вы плывёте против течения?
Цель — начать дискуссию о современных методиках и крайних точках зрения.
Так вы говорите, что объектно ориентированное программирование это плохо или хорошо?
Нет, конечно, нет! Речь о том, чтобы вы понимали: не стоит решать все проблемы исключительно посредством ОО-парадигмы. Нельзя делить всё на чёрное и белое, это ошибка. В рамках одного приложения могут существовать самые разные проблемы, и иногда лучший выход — использовать разные парадигмы в зависимости от конкретной ситуации. А если вы решаете проблему с помощью неподходящего способа, то ни к чему хорошему это не приведёт.
Вы говорите, что фреймворки — зло?
Мы не осуждаем конкретно фреймворки. Мы осуждаем лишь их постоянное использование поверх PHP.
Если фреймворк помогает мне быстро начать и продолжить работать, что в этом плохого?
Если вы проанализируете ситуацию и долгосрочные последствия и поймёте, что «быстро начать и продолжить работать» — единственная проблема, которую вы когда-либо решали, то в этом нет ничего плохого. Но тогда мы говорим не о программировании или разработке ПО, а об использовании point-and-click решений.
Быстро начать и продолжить работать — это не создание приложения; это означает, что вы не анализировали проблему и не осознали долгосрочных последствий своего выбора.
Вы хотите сказать, что сторонние пакеты — это плохо?
Нет. Мы рекомендуем использовать сторонние библиотеки. Код, который вы можете легко и без ограничений внедрять в свои проекты. Это отличная возможность!
Кто вы?
Наш сайт посвящён идее борьбы с экстремизмом в PHP-сообществе, а не личному продвижению или обретению известности. Если мы раскроем имена — это лишь отвлечёт внимание от поднятых на сайте проблем. Давайте не будем отвлекаться.
Каков ваш опыт в разработке ПО?
Чтобы прийти к идеям, мыслям и решениям, отражённым на нашем сайте, не требуется большого опыта, если вы всегда делаете то, что говорят другие.
Рекомендуемая литература
-
PHP: Неправильный путь — на Hacker News. Когда мы запустили наш сайт, на Hacker News появилось много комментариев, в которых отражено немало ценных аргументов.
Основы языка программирования PHP
![]()
Основы языка программирования PHP
PHP — расшифровывается как язык гипертекстовой обработки.
Основными функциями языка PHP являются:
— Реализация серверной части сайтов (хранение, анализ и обработка
данных) — back-end приложения;
— Автоматическая генерация текстов веб-страниц на сервере;
— Обработка запросов веб-страниц;
— Загрузка и анализ веб-страниц других сайтов;
— Создание скриптов для выполнения в командной строке.
В отличие от JavaScript это практически полноценный язык
программирования с возможностью работы с файлами и с операционной
системой. В то же время это интерпретатор (как и JavaScript), а не
компилятор.
Как видно, для автоматического генерирования веб-страниц можно
использовать и JavaScript и PHP.
Преимуществом PHP является то, что он исполняется на сервере и
имеет доступ к файлам, хранящимся на сервере. Кроме того,
пользователь после загрузки веб-страницы может посмотреть текст
JavaScript в браузере, а текст PHP удаляется сервером из кода страницы
после исполнения.
1
2.
2
Если для запуска программ, написанных на JavaScript, достаточно лишь веббраузера, то для запуска программ, написанных на языке PHP, понадобиться вебсервер.
Например, можно использовать для отладки PHP-программ бесплатный набор
программного обеспечения Denver, который включает в себя веб-сервер Appache,
PHP, MySQL и все необходимое:
1. Скачиваем Denver с сайта http://www.denver.ru и при установке Denver-а
соглашайтесь на все предлагаемые по умолчанию настройки.
2. Для запуска Denver-а нужно кликнуть по иконке “Start Denver”. При этом он
загрузится в память, но никаких окон на экране не останется, кроме иконки в
панели задач. Для выгрузки Denver-а из памяти, нужно нажать на иконку “Stop
Denver”.
3. Denver создаст на компьютере виртуальный диск (обычно это диск Z). Это
делается для нашего удобства (физически файлы лежат на диске C в папке
“C:\WebServers”). На этом диске в папку “Z:\home\localhost\www\” мы будем
помещать разрабатываемые PHP-программы и оттуда их запускать на исполнение.
3.
Настройка Appache
По умолчанию в Denver PHP-код в файлах с расширением “.html” не
исполняется.
Поэтому
необходимо
будет
выполнить небольшую (и
единственную)
правку
файла
конфигурации
‘Z:\usr\local\apache\conf\httpd.conf”:
1) Находим в файле конфигурации строку, начинающуюся на “AddType
application/x-httpd-php” и дописываем в ее конец “ .html” и “ .htm” (с
пробелами впереди).
2) Перед этой строкой вставляем строку: “RemoveHandler .html .htm”
3) Удостоверяемся, что в директиве “AddHandler server-parsed” (если
такая строка есть) нет расширений “.html” и “.htm” (если есть — удаляем их).
Для запуска веб-страницы необходимо предварительно положить её в папку
“Z:\home\localhost\www\”,
а
в
браузере
написать
не
просто
“программа.html”, а “http://localhost/программа.html”.
3
4.
4
Программа на языке PHP может либо находиться в текстовом файле с
расширением *.php, либо быть интегрированной прямо в текст HTML-страницы
(файл с расширением *.html). Редактировать PHP-программу можно в любом текстовом
редакторе, например в notepad++.
PHP-код на HTML-странице помещается внутри специального HTML-тега
“ ?>”. Между знаками вопроса здесь нужно вставлять текст PHPпрограммы, которая будет выполнена на сервере. При этом результат выполнения
программы (весь текст, что программа выводит с помощью команды echo) сервер
помещает прямо в текст веб-страницы в то место, где была эта программа.
5.
5
В данной программе нет ничего, кроме вывода на экран (в тексте HTML-страницы)
строки “Hello, world!” командой echo. Текстовые строки на языке PHP нужно брать в
кавычки (в одинарные или в двойные — все равно).
Пример экрана браузера при просмотре в нем исходного текста веб-страницы.
На рисунке мы действительно видим исходный текст страницы, однако вместо
текста вставленной в эту страницу PHP-программы мы видим лишь результат ее
выполнения — надпись “Hello, world!”.
6.
6
Этот пример иллюстрирует одно из наиболее важных свойств PHPпрограммы. Сервер НИКОГДА НЕ ПЕРЕДАЕТ текст PHP-кода браузеру.
Сервер исполняет PHP-код, удаляет его из страницы, а на его место
вставляет результат всех команд echo кода.
Таким образом, можно не опасаться, что текст PHP-программы будет
кем-либо похищен — она никогда не покидает сервера. В то же время текст
программы на языке JavaScript, на котором пишут клиентские приложения
(front-end), доступен для просмотра в браузере и его можно похитить
(воровство кода программ можно лишь затруднить с помощью обфускации
текста программы).
7.
Эта же страница, только оформленная в виде файла с расширением *.php
Здесь приведен текст этой же страницы (в браузере выглядит точно так же),
но оформленной в виде файла с расширением *.php. Браузеры понимают
расширение *.php и интерпретируют такие веб-страницы так же, как и HTMLстраницы.
Здесь уже нельзя просто вставлять HTML-текст. Все, что будет содержать
веб-страница, нужно выводить на нее командами echo, а текст обязательно брать в
кавычки.
Так же видно, что в данном случае теги , не обязательны (но,
при желании и их можно добавить на страницу с помощью команды echo).
7
8.
8
Попытка увидеть PHP-код данной
программы при просмотре исходного
текста веб-страницы в браузере
Видно, что в браузер передаются только результаты работы команды echo
PHP-программы.
Оба способа написания PHP-программ (в отдельных PHP-файлах или внутри
HTML-страницы) эквивалентны друг другу. Но написание PHP-кода в файле с
расширением *.php позволяет нам проверить текст программы на наличие ошибок.
Например, с помощью файла php.exe, находящийся в Denverа.
Если в программе есть ошибки, то php.exe сообщит нам об этом с указанием
номеров строк, в которых содержатся ошибки.
9.
Автоматическое генерирование текста страницы
Программы, которая выведет на
экран все целые числа с 1 до 200,
выделив красным цветом простые числа.
9
10.
10
Здесь мы уже видим пример программы, в которой есть функция, циклы,
условные операторы, переменные.
Особенности синтаксиса PHP-програм:
Во-первых, все имена переменных в PHP-программах должны начинаться
со знака доллара “$”.
Во-вторых, типы переменных не обязательно объявлять — PHP сам поймет,
что это за переменная по тому значению, которое мы в нее записываем.
Еще одной особенностью языка PHP по сравнению с C/C++ является
требование, чтобы все условия в условных операторах обязательно брались в
скобки. Нельзя написать так:
if $k>5 < $k=$k-3;$x=$x*2; >
Нужно обязательно писать так:
if ($k>5) < $k=$k-3;$x=$x*2; >
В данном примере функция “prost” возвращает 0, если число не простое, и
1, если число простое (ни на что не делится, кроме единицы и самого себя).
Оператор “%” в выражении “$n % $i” означает “остаток от деления числа $n на
число $i”.
11.
Результат выполнения данной PHP-программы
11
12.
Работа с файлами
Пример программы, которая выводит на экран
список ПГТ Харьковской области, хранящийся
на сервере в файле “kh.txt”.
Некоторые функции PHP для работы с
файлами:
fopen открывает файл,
fgets читает из файла одну строку,
fclose закрывает файл,
feof возвращает значение “истина”,
если все строки из файла уже прочитаны).
12
Восклицательный
знак
перед
условием на PHP означает отрицание.
Если у условия значение “истина”, то
после отрицания оно изменится на
“ложь”. И наоборот, если у условия
значение “ложь”, то после отрицания
оно изменится на “истина”.
13.
Программа, которая выводит на экран только поселки, начинающиеся с буквы “Б”
13
Переменная $s содержит текстовую строку. Текстовая строка на языке PHP — это массив
букв. У массива есть длина (ее можно получить функцией strlen($s)). Индексы любого массива
на языке PHP начинаются с нуля. Поэтому, чтобы обратиться к первой букве строки $s, нужно
написать $s[0]. Чтобы обратиться к второй букве строки $s, нужно написать $s[1] и т.д. Чтобы
обратиться к последней букве строки $s, нужно написать $s[strlen($s)]. Если в программе
нужно последовательно перебрать все буквы строки $s и что-то с ними сделать, то можно
организовать цикл от 0 до strlen($s)-1, примерно вот так:
for ($n=0;$n
В примере мы просто проверяем, равна ли первая буква строки $s букве “Б”. Здесь
“==” — логический оператор, который возвращает “истина”, если $s[0] равно “Б” (точно так
же равенство проверяется и в языке C/С++).
14.
Программа, которая выводит на веб-страницу название текущего дня недели
14
Вначале объявлен массив с именем $myday, содержащий 7 строк:
$myday=array(«воскресенье», «понедельник», «вторник», «среда», «четверг»,
«пятница», «суббота»);
Нумерация элементов массивов, как и строк, начинается с нуля. Чтобы обратиться к
элементу массива, нужно написать его имя, а затем в квадратных скобках — значение
индекса (номера элемента). Если написать $s = $myday[0], то в $s будет записано
слово “воскресенье”. Если же написать, например, $s=$myday[3], то в $s будет
записано слово “среда”. Если в переменной $k находится число 6, и, если написать
$s=$myday[$k], то в $s будет записано слово “суббота”.
Далее в тексте программы в переменную, названную $today, заносится
результат выполнения функции getdate(). Функция getdate() является стандартной
функцией PHP (пустые скобки свидетельствуют о том, что у этой функции нет
входных параметров), а результатом ее работы является ассоциативный массив данных о
текущей дате.
15.
15
Ассоциативный массив отличается от обычного тем, что в качестве индексов
массива используются не цифры, а ключевые слова, заданные при объявлении
массива. Например, ассоциативный массив можно объявить вот так:
$a[«imya»]=»Nikolay»;
$a[«familiya»]=»Ponomarenko»;
$a[«gorod»]=»Kharkov»;
$a[«denxr»]=1970;
В данном случае в массиве $a есть четыре ячейки. В первые три ячейки с
именами imya, familiya и gorod мы занесли строки текста, а в четвертую ячейку с именем
denxr мы занесли число. На PHP так можно делать.
Есть и чуть более компактный способ объявить этот массив:
$a=array(«imya»=>»Nikolay», «familiya»=>»Ponomarenko», «gorod»=>»Kharkov»,
«denxr»=>1970);
Результат будет таким же. Вообще же PHP, как правило, предоставляет несколько
альтернативных возможностей добиться нужного результата.
Теперь, обратиться к полям объявленного массива $a можно, например, вот так:
echo $a[“familiya”], » «, $a[“denxr”];
На веб-страницу будет выведена надпись “Ponomarenko 1970”. А можно и так
(без кавычек в именах индекса):
echo $a[familiya], » «, $a[denxr];
Результат будет тем же самым.
16.
Согласно свойствам ассоциативных массивов в
приведенном примере
программы строка “$day=$today[wday];” означает, что в переменную $day мы
заносим значение ячейки массива $today с индексом “wday”. Это номер дня
недели, число с возможными значениями от 0 до 6 (см. описание функции
getdate() в справочнике).
В последней строке программы командой echo выводится на веб-страницу
значение ячейки массива $myday (туда мы занесли названия всех дней недели) с
номером ячейки, равным $day (там у нас номер дня недели).
16
17.
17
В языке PHP есть функция print_r, которая
позволяет вывести на экран заданный массив
с названиями и значениями его ячеек. Данная
программа выводит на экран значения массивов
$myday и $today из предыдущего примера.
Как видно, у простого массива $myday,
PHP автоматически пронумеровал индексы от 0
до 6. Видны также все названия индексов
(имен
ячеек)
массива $today,
который
содержит результат работы функции getdate().
Обращаться из программы к ячейкам
ассоциативного массива $today можно как с
использованием кавычек: $today[“year”], так и
без использования кавычек:
$today[year].
18.
18
Обработка запросов к серверу на PHP
Одно из основных назначений PHP — обработка запросов к серверу, поступающих от
веб-страниц или других серверов.
19.
19
Тег
обрамляет те данные, которые будут отправлены на сервер.
В атрибуте action указывается адрес в Интернете той программы, которая будет
обрабатывать эти данные. В данном случае это “primer.php”. В атрибуте method
указывается метод отправки (это может быть “POST” или “GET”). В данном
примере указан метод POST. Методы POST и GET отличаются тем, что для метода
POST данные отправляются в теле HTTP-запроса (их не видно пользователю), а в
методе GET данные отправляются в строке URL (их видно в адресной строке в
браузере).
Внутри тега
мы видим несколько тегов (элемент
формы), отличающихся разным значением атрибута type. Именно значение атрибута
type определяет внешний вид элемента формы и его назначение.
Значение type=”text” задает текстовую строку ввода. В этом случае атрибут
size=”50” означает, что в строке будет максимум 50 букв. Атрибут name понадобится
нам при обработке данных на сервере. Значение type=”password” также задает
строку ввода. Однако буквы, которые пользователь будет вводить, будут
отображаться на экране звездочками (символами *).
Значение type=”checkbox” задает элементы с “галочками”, которые можно
устанавливать независимо друг от друга. При этом наличие атрибута checked (без
значения) указывает браузеру, что “галочка” должна стоять в элементе уже при
загрузке веб-страницы. И type=”submit” задает кнопку, при нажатии на которую
данные формы (значения ее элементов) будут отправлены на сервер. Значение
type=”radio” задает элемент переключатель (кружочек с точечкой или без). Среди
всех элементов типа radio с одинаковыми атрибутами name только один может
быть установлен.
20.
Программа primer.php, которая будет обрабатывать данные формы
Эта программа проверяет данные формы, анализирует их, выводит сообщения
на веб-страницу и сохраняет данные формы в текстовом файле.
20
21.
21
На PHP для обработки данных форм все, что можно, делается автоматически и все
полученные методом POST от веб-страницы данные помещаются в специальный
ассоциативный массив с именем $_POST.
Названия индексов этого массива соответствуют именам тегов (атрибут
name). Чтобы проверить, что передано из веб-страницы в элементе формы с
значением тега name=”oleg” нужно просто обратиться к ячейке $_POST[‘oleg’].
Точно так же и со всеми остальными элементами формы.
В приведенном примере на экран командами echo выводятся ФИО и пароль.
Затем проверяется, была ли установлена галочка в элементе формы с именем ‘cofe’
и, если да, то выводится надпись “Извините, кофе нет!”.
Далее проверяется, был ли выбран элемент radio со значением “var1” и, если
да, то выводится надпись “Оплата наличными”.
22.
Все данные, полученные от веб-страницы, сохраняются в текстовом файле 22
zakazy.txt. Параметр ‘a’ в функции fopen(‘zakazy.txt’,’a’) означает, что файл
открывается для дозаписи (добавления информации к уже записанной ранее в этот
файл). Можно было бы сохранить каждое данное отдельно, но для красоты и
краткости текста программы здесь использована функция print_r. Второй
параметр этой функции, равный TRUE, сообщает ей, что нужно не выводить
текст на веб-страницу, а передать его на выход функции (в данном случае в
пременную $st).
Содержимое файла zakazy.txt для данной
заполненной формы
23.
23
На этом примере видно, что для текстовых элементов формы и паролей на
сервер передаются текстовые строки, для элементов типа “checkbox” — текстовая
строка “on” (для случая, если галочка установлена), для элементов типа “radio” значение того элемента, который был выбран.
Если данные с веб-страницы по какой-то причине не были переданы, то
массив $_POST окажется пустым.
Проверить, не пустая ли та или иная ячейка массива $_POST можно с
помощью функции isset($s), которая возвращает TRUE, если переменная $s
существует. Чтобы проверить, например, были ли переданы на сервер данные с
именем “oleg”, нужно проверить isset($_POST[‘oleg’]).
24.
Пример отправки данных на сервер методом GET.
24
Чтобы отправить данные на сервер методом GET, можно точно так же использовать
элементы формы, только в теге присвоить атрибуту method значение “GET”.
Пример простой веб-страницы, использующей метод GET, и ее внешний вид в
окне браузера после ввода данных.
Пока все выглядит точно так же, как и в предыдущем примере. Существенное
отличие будет лишь в PHP-коде и том, как выглядит в браузере ответ сервера.
25.
Текст программы pr.php, которая обрабатывает запрос
25
В этом случае данные веб-страницы для метода GET нужно читать из
ассоциативного массива $_GET. Однако в адресной строке в браузере в этом случае
значится “localhost/pr.php?nam=Nikolay&year=1970”. Все, что находится после
знака “?” и есть данные, переданные от веб-страницы серверу методом GET.
Данные для метода GET передаются на сервер прямо в строке URL и разделяются
символом “&”. При этом русские буквы могут кодироваться в кодировке UTF8 и
быть нечитаемыми, однако PHP делает извлечение этих данных легкой задачей
благодаря массиву $_GET.
Недостатком метода GET по сравнению с методом POST является меньший объем
данных, которые можно передать на сервер. Однако, иногда метод GET является
более удобным, так как позволяет формировать запросы на сервер даже без
использования элементов формы.
26.
Пример веб-страницы, которая отправляет на сервер данные
методом GET без использования форм.
26
В данном примере используются просто ссылки с интегрированными в них
запросами к серверу. Данные здесь помещены в значения атрибутов href тега ..
через символ “?” после пути к файлу PHP-программы.
Программа prim.php и результат ее работы
В данном примере обе ссылки ведут к одному и тому же PHP-коду (или “PHPскрипт”). Но результат работы этого PHP-кода будет разным в зависимости от того,
какая из двух ссылок нажата.
Такого же эффекта можно добиться и при отправке данных методом POST,
но придется задействовать JavaScript и текст веб-страницы будет более сложным.
27.
27
NOTE. В предыдущих примерах пользователю предлагалось заполнить форму, но
не указано, а что будет, если два пользователя почти одновременно отправят данные
на сервер? Запустится два экземпляра этого PHP-кода и они могут одновременно
пытаться что-то записать в файл ‘zakazy.txt’, что может привести к сбою и потере
данных. Для решения этой проблемы в PHP имеется функция flock(), на логическом
уровне запирающая файл. Если кто-то уже запер этот файл, функция flock() ждет,
пока файл освободится и только тогда запирает его.
Можно завести вспомогательный служебный файл, (например, ‘flag.txt’) и
использовать как семафор. Перед записью в файл ‘zakazy.txt’ нужно запереть файл
‘flag.txt’ вот так:
$q=fopen(‘flag.txt’,’r’);
flock($q, LOCK_EX);
После того, как запись в файл ‘zakazy.txt’ завершена и он закрыт, нужно отпереть
файл ‘flag.txt’ вот так:
flock($q, LOCK_UN);
fclose($q);
Почему нельзя запереть и потом отпереть непосредственно файл ‘zakazy.txt’?
28.
28
Дело в том, что чтобы выполнить функцию flock(), нужно сначала открыть
файл. Если две PHP-программы открывают файл для чтения (параметр ‘r’), то
ничего страшного не происходит — это допустимо. Затем одна из программ
выполняет flock(), а вторая ждет, пока файл освободится. Если же две
программы попытаются одновременно открыть файл для записи или дозаписи (а
именно для этого открывается файл ‘zakazy.txt’), то может произойти сбой и до
вызова функции flock() просто не дойдет дело. Именно поэтому в данном примере
в качестве семафора используется еще один файл (‘flag.txt’), который открывается
для чтения. И, видя, что он закрыт, вторая программа знает, что кто-то в это
время пишет в файл ‘zakazy.txt’. Когда же файл ‘flag.txt’ откроется, вторая
программа закрывает его и начинает запись в файл ‘zakazy.txt’.
Кроме массивов $_POST и $_GET, содержащих данные, переданные с вебстраницы, в PHP есть еще ассоциативный массив $_SERVER, содержащий
данные о компьютере пользователя (например, IP-адрес).
29.
PHP и MySQL
29
Базовые действия PHP-программы при работе с MySQL
Любая программа на языке PHP, которая собирается работать с
MySQL базой данных, должна состоять из следующих обязательных
базовых шагов:
1. Установить связь с MySQL сервером.
2. Выбрать базу данных для работы.
3. Посылать команды MySQL серверу и получать ответы.
4. Закрыть связь с MySQL сервером.
30.
30
Веб-страница, которая устанавливает и закрывает соединение с MySQL сервером
Функция mysql_connect устанавливает связь с сервером. Первый параметр
функции — имя сервера (в нашем случае — “localhost”). Второй параметр – логин
пользователя (“vladimir”). Третий параметр – пароль пользователя (“vladimir2013”).
Если соединение не установлено (например, сервер не разрешает этому
пользователю доступ к базам данных), то PHP выполнит функцию die() (завершение
программы).
Если соединение успешно установлено, то в служебной переменной $link (имя
этой переменной можно задать любое) возвращаются параметры соединения с сервером,
которые в дальнейшем нам потребуются.
После этого программа выдает на веб-страницу надпись “Соединение
установлено” и закрывает соединение с сервером командой mysql_close($link).
31.
Создание таблицы MySQL
Веб-страница, которая таблицу в
базе MySQLВеб-страница,
которая таблицу в базе MySQL
Команда mysql_select_db это выбор
базы данных и mysql_query — запрос к
серверу.
Команда mysql_connect() соединяет
нас (пользователя) с сервером. Однако на
сервере может лежать несколько баз данных
и пользователю может быть разрешен
доступ к нескольким из них. Поэтому
необходимо уточнить, с какой же базой
данных мы хотим работать, что и делает
команда
mysql_select_db().
Первым
параметром выступает
название
базы
данных (“lection5”). Вторым параметром
нужно указать переменную, которую мы
получили
в
результате
выполнения
mysql_connect() — $link.
31
32.
32
Как только мы выбрали базу данных, можно создавать в ней таблицу. Заметим,
что все действия над базой данных (создание таблиц, занесение в них
данных, изменение данных, поиск данных, удаление данных и т.д.)
выполняются в виде запросов к MySQL серверу. Сначала формируется текстовая
переменная, в которую помещается текст запроса. Затем содержимое этой
текстовой переменной отправляется на сервер командой mysql_query().
Запросом в данном случае является строка:
CREATE TABLE studata (god int, grup char(7), fio char(50));
Здесь “CREATE TABLE” — ключевые слова, по которым сервер поймет, что
нужно создать таблицу. “Studata” — название для таблицы. Далее в круглых
скобках через запятую перечисляются столбцы, которые должны быть у
таблицы. Для каждого столбца обязательно через пробел указывается его
название и тип. В данном случае мы указываем серверу, что в таблице должно
быть 3 столбца с названиями “god”, “grup” и “fio”. Столбец “god” будет содержать
данные типа “int”, то есть целые числа. Столбец “grup” будет содержать строки с
максимально возможной длиной в 7 букв каждая. Столбец “fio” будет содержать
строки с максимально возможной длиной в 50 букв каждая. Точка с запятой в
конце строки запроса – обязательный элемент синтаксиса.
33.
Результат добавления в базу “lection5” таблицы “studata”
33
34.
Добавление строки в таблицу
34
Программа, которая добавляет в
таблицу “studata” строчку, в которой
god=1996, grup=”519-Б”, а fio=“Иванов
Иван Петрович”.
Строки в таблицу добавляются
такими же запросами-командами к
серверу
с
помощью
функции
mysql_query(), только с другим
текстом запроса.
Здесь запросом является строка:
INSERT INTO studata VALUES (1996, ‘519-Б’, ‘Иванов Иван Петрович’);
“INSERT INTO” — ключевые слова, которые говорят серверу, что нужно добавить
строку в таблицу. “Studata” — название таблицы, в которую нужно добавлять
данные. После ключевого слова “VALUES” в круглых скобках через запятую
перечисляются значения столбцов. Заканчивается запрос точкой с запятой.
35.
Алгоритм действий остается одним и тем же:
1. Установили связь с сервером.
2. Выбрали базу данных.
3. Послали команду серверу.
4. Закрыли сеанс связи.
Если ошибки проверять
упростить, например, до такого
не нужно, то текст программы можно
35
36.
Создание веб-страницы с вводом данных, которые затем передадутся в
PHP-программу на сервере, которая добавит эти данные в базу MySQL
36
Эта веб-страница при нажатии на кнопку методом POST отправляет данные
про группу, фамилию и год рождения студента на сервер программе
“ex5_06.php”.
37.
Программа “ex5_06.php” и результат ее работы
Данная программа получает пришедшие от веб-страницы данные из
стандартного массива $_POST и затем формирует из них запрос для MySQL
сервера на вставку в таблицу новой строки.
NOTE. Логин и пароль пользователя для доступа к MySQL серверу и базе
данных находится в PHP-программе “ex5_06.php”, которая лежит на сервере.
Пользователь может видеть только результат выполнения этой программы
(результат команд echo), но не ее исходный текст. Поэтому пароль и логин
находятся в полной безопасности, хотя и используются в программе.
37
38.
Поиск и извлечение данных из таблицы
Проще всего извлечь из базы данных всю таблицу целиком
38
В данном примере запросом к серверу является строка
SELECT * FROM studata;
Здесь ключевое слово “SELECT” сообщает серверу, что необходимо искать данные
в таблице, а служебный символ “*” означает, что искать нужно во всех столбцах.
Результат запроса поступает в переменную $r. Если ничего не найдено (например,
такой таблицы нет или она пуста), то в $r будет записан ноль. Иначе же там будет
двумерный массив, содержащий найденные строки таблицы.
Для работы с
результатами поиска данных в таблице в PHP есть несколько похожих функций.
Например, $q=mysql_fetch_row($r). Она последовательно извлекает из результатов
поиска $r по одной строке и заносит их в переменную $q.
Когда строки закончатся, в $q будет занесен ноль и цикл while в примере
остановится. $q представляет собой массив, чьи индексы являются номерами,
начинающимися с нуля. Поэтому, чтобы обратиться к элементу из первого столбца
таблицы, нужно написать $q[0] (год рождения) и т.д.
39.
Поиск с условиями
39
Чтобы программа выводила не всю таблицу, а лишь тех, кто родился в 1996м году, нужно в запрос добавить ключевое слово “WHERE” и условие поиска, вот
так:
SELECT * FROM studata WHERE god=1996;
40.
Поиск по шаблону
Вместе с ключевым словом “WHERE” можно использовать,
модификатор “LIKE”. Здесь строка запроса:
40
например,
SELECT * FROM studata WHERE fio LIKE ‘%Сергей%’;
Модификатор “LIKE” задает шаблон для столбца “fio”. Символ “%” в начале
и конце шаблона означает, что перед именем “Сергей” может быть что угодно и
после имени “Сергей” может быть, что угодно. Если бы мы хотели, чтобы имя
Сергей обязательно завершало текст, то шаблон выглядел бы так: ‘%Сергей’.
Условия при поиске могут быть сколь угодно сложными (можно использовать
логические связки “or”, “and”). Можно извлекать из таблицы не все столбцы, а
лишь указанные нами.
41.
Изменение и удаление данных в таблице
41
Здесь запросом является:
UPDATE studata SET god=1994, grup=’529‘ WHERE god Ключевое слово “UPDATE” говорит серверу, что нужно изменить данные,
после ключевого слова “SET” через запятую перечисляются названия столбцов,
которым нужно изменить данные и их новые значения. После ключевого слова
“WHERE” следует условие. Данные будут изменены для ВСЕХ строк таблицы
“studata”, для которых это условие выполняется.
Удаление данных происходит по запросам, похожим на запросы поиска, только
ключевым словом является “DELETE”. Например, следующий запрос удалит из
таблицы строку, где столбец “fio” содержит строку “Нос Олег”:
DELETE FROM studata WHERE fio=’Нос Олег’;
Будьте осторожны. Если криво задать условие WHERE, то можно одной командой
удалить из таблицы все строки.
42.
Кодировки русского текста при работе с MySQL
42
Мы можем указать серверу в какой кодировке будут присылаться данные, в
какой кодировке их хранить, в какой кодировке возвращать ответы сервера.
Пусть мы хотим, чтобы сервер принимал, хранил и возвращал данные в
кодировке “Windows-1251”. Тогда при создании таблицы вместо, например, запроса
CREATE TABLE stuff (fi char(10), tel char(10));
пишите:
CREATE TABLE stuff (fi char(10), tel char(10)) DEFAULT CHARACTER SET
cp1251 COLLATE cp1251_general_ci;
Это заставит сервер сохранять и возвращать данные в кодировке “Windows1251”.
Еще в тексте программы, которая будет посылать запросы к серверу,
нужно после выбора базы данных командой mysql_select_db() добавить запрос:
mysql_query(«SET NAMES ‘cp1251′»);
После этого мы можем быть уверены, что вся работа с базой данных
MySQL осуществляется с использованием кодировки “Windows-1251”.
43.
Проверка существования таблицы
Как узнать, существует ли таблица, например, с именем “olga” в базе данных
MySQL? Например, можно отправить запрос на сервер командой mysql_query():
SHOW TABLES LIKE «olga»;
Здесь “SHOW TABLES” говорит серверу, что нужно вернуть названия
таблиц, а после “LIKE” нужно указать имя таблицы. Если таблица не
существует, то сервер вернет в ответ ноль.
43
44.
Первичный и внешний ключи и некоторые другие тонкости
44
При создании таблиц кроме имени и типа столбцов для них можно указывать еще и
модификаторы:
NOT NULL — поле не может быть пустым;
PRIMARY KEY — поле будет первичным ключом (иметь уникальное значение);
AUTO_INCREMENT — при вставке новой записи значение этого поля будет
автоматически увеличено на единицу;
DEFAULT — задает значение, которое будет использовано по умолчанию.
Если мы скажем MySQL, что столбец с именем “fio” является первичным
ключом, то это приведет к тому, что сервер не будет нам позволять записывать
две полностью одинаковые фамилии в две разные строки таблицы. Это может
быть полезно, ведь в этом случае при удалении и модификации строк с
указанием в WHERE конкретной фамилии, мы можем быть уверены, что изменим
лишь одну строку таблицы.
В MySQL предусмотрены еще внешние ключи для связи таблиц между собой.
Если столбец назначен внешним ключом (FOREIGN KEY), то указывается
связанный с ним столбец другой таблицы, и сервер не будет разрешать добавлять в
таблицу данные со значениями, которых нет в том связанном столбце.
45.
PhP и JQuery:
Отправка запросов к серверу без перезагрузки страницы
Традиционное взаимодействие браузера и сервера подразумевает отправку
браузером запроса на сервер (например, в результате нажатия пользователем на
кнопку), после чего сервер возвращает ответ в виде новой веб-страницы и
браузер выводит эту страницу на экран.
Однако часто мы сталкиваемся с ситуацией, когда браузер вроде бы не
перегружал страницу, но информация с сервера на нее явно попадает. При этом
веб-страница посылает запросы на сервер и получает ответы с сервера без
перегрузки браузером текста страницы.
Это может быть реализовано несколькими способами, например, с
использованием тега , к тому же для разных браузеров это могут быть
разные способы. В общем, эта технология носит название Ajax и в Jquery она
реализована так, что пользоваться ей легко и удобно.
45
46.
46
Достоинствами использования Ajax являются:
— Экономия трафика, уменьшение нагрузки на сервер;
— Ускорение реакции интерфейса на действия пользователя,
что, безусловно, нравится всем пользователям;
-Повышение функциональных возможностей программы, так
как не нужно заставлять пользователя нажать на что-то,
если нужно отправить запрос к серверу.
Недостатки Ajax:
— Ухудшение индексации содержимого сайта поисковыми
системами;
— Сложнее учитывать статистику.
47.
В JQuery существует функция (или
метод), serialize(), который собирает
данные формы в некое подобие GET
запроса
47
Команда $(‘#nik’).serialize() подготовила
данные формы с к отправке на
сервер. Т.е. преобразовала содержимое
строк “Nikolay Ponomarenko” и “1970” к
виду, используемому в GET запросах:
“nam=Nikolay+Ponomarenko&year=1970.
Здесь “nam” и “year” — значения атрибута
“name” тегов формы, данные
которой сериализуются.
48.
Отправить данные на сервер технологией Ajax и получить ответ можно, используя 48
метод POST:
$.post(адрес, данные, обработчик_ответа)
Пример
Есть
PHP-программа,
которая
проверяет, совпадает ли присланная с
веб-страницы строка с названием одного
из поселков Харьковской области.
Текстовая
строка
поступает
в
программу методом POST. Переменная,
содержащая эту строку, должна иметь
название “nam”.
Допустим,
эта
переменная содержит строку “Васищево”.
Программа функцией echo возвращает
либо строку “Есть такой поселок в
Харьковской области: Васищево”, либо
строку “Такого поселка нет в Харьковской
области: Васищево” в зависимости от
того, найдет ли она такое название в
файле kh.txt.
49.
Для создания веб-страницы, которая будет запрашивать от пользователя 49
название, посылать Ajax запрос серверу и выводить полученный результат на этой же
странице без ее перезагрузки, понадобится форма со строкой ввода.
Далее назначается функция на какоелибо событие, связанное с изменением этой
строки, например, keyup. В функции,
которая это событие обрабатывает, будут
сериализироваться
данные
формы,
отправляться с помощью технологии Ajax на
сервер, получать ответ и вставлять этот ответ
на веб-страницу, опять же используя JQuery.
50.
50
На строку ввода с назначена обработка события keyup следующим образом:
$(‘#ira’).keyup(lena).
Здесь “lena” — название функции, которая будет запускаться, если событие
произошло. В функции lena() мы сериализируем (подготавливаем к отправке) данные
формы. Так как форме мы назначили то выглядит это следующим образом:
data = $(‘#nik’).serialize
Теперь переменная data содержит строку, которую нужно отправить на сервер.
Отправляем запрос на сервер следующей командой:
$.post(‘ex8_14.php’, data, obrabotka)
Здесь ex8_14.php’ — адрес PHP-программы, которая будет обрабатывать запрос,
data – отправляемые данные, obrabotka — название функции, которая примет ответ
сервера.
У функции obrabotka две входных переменных. В переменной otklik сервер
возвращает текст веб-страницы (то, что в программе выводится функцией echo). В
переменной status JQuery возвращает нам ‘success’, если с запросом все прошло
нормально.
Поэтому в функции obrabotka для начала проверяется, содержит ли переменная
status значение ‘success’. Если да, то присланный сервером текст страницы
(переменная otklik) выводится на веб-страницу:
$(‘#otvet’).html(otklik)
Здесь метод html используется для того, чтобы записать строку otklik в тег ,
которому мы дали .
Данные формы не обязательно должны быть видимыми на экране (можно
использовать тип “hidden”).
51.
Работа с cookies на JQuery
51
Механизм cookies позволяет сайту хранить информацию на компьютере
пользователя, в браузере (браузер сохраняет эту информацию на жестком диске,
поэтому она не теряется с выключением компьютера).
Механизм сookies предусматривает, что сайт может хранить в браузере
сколько угодно (в разумных пределах) переменных и их значений, где для каждой
переменной хранятся:
имя значение время_хранения
Когда время хранения переменной заканчивается (а устанавливает его наш сайт),
то браузер удаляет ее из своей памяти.
Сайт может проверять значения только тех переменных в cookies, которые сам же
ранее установил. Проверить значение чужих переменных нельзя.
52.
В этой программе используется специальный плагин к JQuery, называющийся 52
“JQuery.Cookie”. Его текст нужно подключить к программе точно так же, как и текст
самого JQuery:
Команда
$.cookie(‘fio’,’Пономаренко Николай Николаевич’, < expires: 7 >);
добавляет в cookies переменную fio, присваивает ей значение ‘Пономаренко
Николай Николаевич’ и задает срок хранения для этой переменной в 7 дней.
Таким образом, программа в этом
примере ничего не делает, а только
записывает в cookies эту переменную
53.
Как прочитать значение переменной из cookies.
53
Чтобы прочитать информацию из cookies, нужно написать:
pa=$.cookie(‘fio’)
и информация из переменной fio cookies будет записана в переменную pa JavaScript.
Чтобы досрочно удалить переменную fio из cookies, нужно написать:
$.cookie(‘fio’,»)
