Веб-страница, сформированная сервером, должна быть корректной. Задача серверного языка - сформировать страницу, но его роль вторична. PHP-код - это вставки в страницу, но не сама страница. В идеале, можно обеспечить создание страницы на лету. Веб-ресурс основывается на идее, реализованной в виде организованной, определенным образом, информации. Только в небольшой части - это описания данных, которые обрабатывают конкретные алгоритмы.
HTML + JavaScript и CSS = страница
Все, что получает браузер - поток систематизированной и организованной, строго определенным образом информации. Можно именовать передачу от сервера браузеру потоком данных, но эти данные несут в себе конкретный смысл и являются результатом работы не только программиста.
В результат, сформированный сервером, входит труд дизайнера, аналитика, менеджера проекта. Это смысл, то есть организованная информация по веб-ресурсу. Ошибка в этом потоке по любому основанию нанесет урон общему делу.
Характерная черта современного интернет-программирования - молчание и тишина по любому непредвиденному поводу. Ошибка легко может остаться незамеченной и привести к неожиданным последствиям, даже если после загрузки браузер отобразил полученный поток информации таким образом, который желали увидеть его создатели.
Существенны:
- данные, а это не только и не столько переменные PHP;
- код, а это совсем не только PHP.
PHP - это язык вставок, но использование глобальных данных в локальных функциях важно. Оценивая роль любого серверного языка, трудно получается поднимать его значение выше места, который он занимает, но часто это реально необходимо. Место PHP - вставка внутри страницы даже в предельном случае, когда страница создана исключительно силами самого языка в полном объеме. Страница никогда не бывает одинокой и однородной:
- в ней есть HTML;
- элементам назначены обработчики JavaScript;
- теги описаны посредством CSS;
- имеются: код JavaScript, JSON, иные вставки.
Все это пестрое сообщество должно определять, что следует разобрать браузеру и как построить дерево DOM, которое определит внешний вид и функционал страницы.
Вставки PHP: описания и алгоритмы
Есть две принципиально различные идеи, которые реализует PHP. Первая позволяет включать/выключать блоки HTML-текста от участия в потоке вывода. Вторая - непосредственный код: описания переменных, алгоритмы и масса локальных функций, нуждающихся в глобальных данных.
В любом случае могут быть использованы глобальные переменные PHP. Во вставках первого типа переменные только используются. Во вставках второго типа они могут быть изменены.
Любая переменная, описанная во вставке, относится к глобальной области видимости. Локальной переменную делает ее описание внутри функции, объекта или метода объекта. Общепринято, что каждый объект целесообразно записывать отдельным файлом.
При просмотре HTML-текста PHP исполняет код последовательно - общее правило интерпретатора, которого программисту не следует придерживаться во избежание непредвиденных ошибок. Важно представлять: все вставки обрабатываются последовательно.
В примере (1) выполнена вставка описания только одной переменной $cPageName. В примере (2) в том же месте (блок «HEAD») производится инициализация множества глобальных переменных PHP из массива данных GET и POST - $_REQUEST.
Во втором примере выполняется вставка PHP-кода из файлов: scQS.php и save-visit-to-page.php, при этом первый файл загружает и инициализирует систему объектов приложения, второй файл выполняет регистрацию посещения данной страницы.
Оба файла также создают глобальные переменные классов. PHP не систематизирует объявление и использование переменных. Управление всеми объявлениями выполняет программист.
Одно кардинально отличное обстоятельство
Массивы глобальных данных $_GET, $_POST, $_REQUEST, $_SERVER доступны всегда, но не всегда содержат нужные данные. На данные сессии и куки тоже можно рассчитывать. Можно считать все это оригинальным способом объявления глобальной переменной. PHP сам занимается управлением данных, помещенных в эти массивы.
Манипулируя значениями в ходе передачи (GET, POST), в куках, в сессиях, можно передавать данные между страницами или странице самой себе совершенно безопасно: ничего не пропадет, это несложно, хотя выглядит странно и громоздко.
Но важно понимать и знать одно крайне важное обстоятельство. Глобальные переменные PHP и SERVER «живут» только один раз: в момент обращения! Когда браузер открывает или обновляет страницу: начинается «жизнь». Как только страница улетает в браузер, «жизнь» прекращается.
Обращений будет один миллион значит «жизней». Ровно столько раз SERVER даст возможность PHP создать и использовать все то, что описал программист и именно по алгоритмам этого программиста.
Никакой связи между «жизнями» нет!
Кардинальные, но эффективные хитрости
Программисту на PHP глобальная переменная нужна всегда, а не только тогда, когда браузер зашел на веб-ресурс или посетитель решил обновить страницу. Программист вообще может желать, чтобы вся созданная им система объектов существовала не от случая к случаю, а постоянно.
Веб-ресурс разработан, создан. Значит, все его страницы должны «жить», если не вечно, то хотя бы в контролируемом диапазоне времени. Между визитами посетителей тоже.
Есть только один верный способ изменить ход вещей: объявить глобальную переменную PHP в браузере. Это противоречит здравому смыслу и может нанести ущерб вопросам безопасности, но это классная и интересная идея.
Что касается безопасности, это забота программиста. Задача простая и решаемая. Что касается абсурдности, это не так. Используя JSON, механизм AJAX и собственное воображение, можно перенести центр тяжести с сервера в браузер и создать там тот вариант отображения данных на то количество глобальных переменных PHP, которое необходимо.
Вложение областей видимости
Все, что объявлено вне пределов тел функции, объекта или метода объекта, принадлежит всем. Но для использования общих (глобальных) переменных в нужном месте следует применить ключевое слово global.
В этом примере в конструкторе и функции объекта scStartView() доступны все переменные, которые перечислены за ключевым словом global. Какое именно они несут в себе значение, как именно их можно использовать, знает только программист. На PHP глобальные переменные в функцию приходят только по именам. Иное определяет программист.
Под телом функции, объекта или метода объекта следует понимать все то, что находится внутри «{ ... }». Фигурные скобки - это границы локальной области видимости. Функция, описанная внутри другой функции, имеет свою область видимости. Никакой код не может проникнуть в локальную область видимости.
Транзит данных внутри кода
Вопрос - как сделать глобальную переменную PHP, переводит на момент времени вызова кода. В остальном PHP не ограничивает программиста. Можно использовать куки, сессии и глобальные массивы. Оптимальны - JSON & AJAX и недра браузера. Последний вариант подходит лучше всего, но требует хорошего знания JavaScript.
Принципиально нет и никогда не было разделения программирования на браузерное (frontend) и серверное (backend). Хотя с позиций рекламы, имиджа и способа объяснить заказчику, что работа на копейку стоит аж два рубля это имеет реальный смысл.
Всякий PHP-программист обязан иметь прочные знания о том, что такое HTML и как строится DOM, следовательно, начальное знание по JavaScript должно быть в порядке вещей. Программист JavaScript и только - нонсенс, хотя бывает реальная потребность в исключительно узкой квалификации. Полные знания и клиентской части, и серверной - нормальное положение вещей.
Время жизни страницы, пока она формируется на сервере, создает реальную потребность в передаче информации между страницами и в пределах одной страницы в течение всего времени нахождения посетителя на сайте.
Часто важно управлять данными между различными (множественными) посетителями. Хранить и осуществлять передачу (транзит) данных в течение времени - очень ответственная и важная процедура. Транзит данных внутри кода во времени расширяет возможности программирования.
Самый простой пример решения PHP: создать глобальную переменную можно банально в текстовом файле. Это не сложно. Это делается в момент посещения страницы (как пример). Читается при открытии страницы (все вставки берутся из файлов). Ничто не мешает изменять файлы в процессе посещения одним посетителем, в ожидании посещения вторым.
Вопросы безопасности и сохранности данных
Любая глобальная переменная - потенциальная угроза. Украсть переменную PHP - сложно, если невозможно. Посмотреть переменную JavaScript можно почти всегда. Если в браузере и на сервере все кодируется, для злоумышленника создается преграда, которая оказывает отрицательное влияние и на разработчика.
Кодированный текст скрипта, где бы он ни находился, для разработчика - лишние трудности. Все хранить в текстовых файлах или базе данных тоже не аргумент.
Хороший выход предлагает использование объектно-ориентированного программирования, когда создается такая система объектов, которая сама определяет необходимые в данный момент времени переменные.
Такая система объектов существует в браузере наряду с DOM страницы в текущем состоянии и меняет свое состояние соответственно изменению DOM. Отследить динамику сложнее, чем статику, а реализовав трансформацию системы объектов JavaScript в адекватный вариант на PHP, то есть на сервере, можно обеспечить как сохранность данных, так и решить вопросы безопасности.
Место PHP и его переменных
Формировать страницу - главная задача PHP. Использование систем управления сайтами (CMS) ограничивает программиста и навязывает ему определенную концепцию управления глобальными переменными. Любая CMS - это масса ее собственных переменных, причем 99 % из них не требуются для создания конкретного сайта.
В чистом варианте серверная часть сайта - это база данных и файлы. Место, где хранится информация, которую браузер «распознает» как веб-ресурс. На самом деле ему в этом помогает программист, кодирующий что-то на PHP, уточняющий что-то на JavaScript. К этому прикладывается верстка HTML/CSS.
Но в любом случае сервер - это возможность сохранить, прочитать, изменить. В таком контексте, если последовать классической человеческой логике вещей: клиент всегда прав, то можно сместить центр тяжести в браузер и «передать» клиенту бразды «правления». На самом деле клиент ничего не получит, но по его действиям можно планировать поведение сервера.
При таком подходе визит на веб-ресурс инициирует сессию работы, формирует начальные значения переменных, и сформированная страница улетает в браузер, инициируя работу конкретного клиента. Действия этого клиента приводят к изменениям, которые транслируются на сервер, отвечающий надлежащим образом. Содержимое в браузере изменяется адекватно. Следующая инициатива клиента - иные изменения.
Перенос центра тяжести с сервера на клиента позволяет посмотреть на веб-ресурс с другой стороны и уделить больше внимания процессам формирования контента сайта от реального потребителя.
Фантазии разработчика
Времена, когда сайты создавались по шаблонам, уверенно уходят в историю. Времена власти системы управления сайтами еще продолжаются, что создает реальные ограничения как в использовании переменных, так и в создании прогрессивных алгоритмов.
По сути, CMS - это перенос центра тяжести от программиста к заказчику. Первый устанавливает и настраивает CMS, второй наполняет ее информацией и использует. Часто программиста просят написать код для автоматического парсинга и наполнения базы данных информацией, но это не совсем то, чего требует жизнь.
Приходит время динамичных сайтов. Появляется реальная потребность управлять данными, быстро реагировать на угрозы и обеспечивать адаптивное существование веб-ресурса. Фантазии разработчика в варианте «специалист по динамичным данным и алгоритмам» - это сначала фундаментальный опыт управления переменными и кодом внутри браузера и на сервере, а уж затем - эффективный и динамичный сайт нового поколения идей.