Язык PHP: насколько актуален сегодня
Что это? Язык PHP – высокоуровневый язык программирования. Используется в среде веб-разработки с середины 90-х годов прошлого века. До недавнего времени считался медленным и устаревшим, однако последние итерации всё изменили. Современный PHP по быстродействию не уступает другим высокоранговым языкам и может стать отличным стартом в карьере.
Где используется? PHP используется для сборки страниц из модулей, создания CMS движков для сайтов, разработки форм авторизации и запоминания пользователей. Больше о функциях и особенностях PHP читайте в нашем материале.
В статье рассказывается:
- Как и почему появился язык PHP
- Назначение и возможности языка PHP
- Описание и синтаксис языка PHP
- Преимущества языка PHP
- Стоит ли изучать язык PHP: ситуация на рынке труда
- Мифы про изучение языка PHP
Пройди тест и узнай, какая сфера тебе подходит:
айти, дизайн или маркетинг.
Бесплатно от Geekbrains
Как и почему появился язык PHP
PHP — это аббревиатура, изначально включающая в себя слова Personal Home Page Tools. Иначе говоря, язык на заре своего появления представлял собой набор инструментов для создания персональных веб-страниц. В то время для создания сайта чаще всего применялись языки C, Perl , а также скрипты CGI. Это был достаточно сложный процесс. Для выхода из этой ситуации и разработали язык программирования PHP, не требующий длительного изучения основ.
Встроенный инструмент верстки HTML не обладает достаточной гибкостью, чтобы обеспечить все потребности веб-разработчиков. PHP расширяет базовые возможности разработки сайтов. Более того, код на этом языке может быть встроен прямо в HTML для совместной работы. Встраивание осуществляется соответствующими операторами. Они имеют вид или просто .
Покажем это на примере:
Итогом выполнения этого кода станет вывод строки: «Перед вами php-код».
Помимо внедрения непосредственно в HTML допускается подключение отдельных файлов PHP. То есть, существуют 2 режима работы с этим языком. Можно писать PHP-код прямо внутри HTML-кода либо выносить его в отдельный файл.
Назначение и возможности языка PHP
Получить базовое представление об этом языке можно, усвоив его три основные характеристики.
- PHP фактически является препроцессором гипертекста.
- Код этого языка выполняется сервером.
- PHP — интерпретируемый язык, реализуемый в виде скриптов.
Далее разберем более подробно каждую особенность и параллельно выделим основные сферы применения языка.
Прежде всего через объединение языка PHP и HTML обеспечивается динамика элементов сайта. В простейшем случае страница имеет статичный вид. То есть, после загрузки браузером она для всех пользователей показывается одинаково — как это заложено в HTML-коде.
Однако в ряде случаев этого недостаточно. Сегодня посетители заходят на сайты, чтобы получать постоянно меняющуюся информацию в актуальном виде. К примеру, требуется увидеть:
- текущий курс валют;
- прогноз погоды на завтра;
- счетчик посещений страницы.
Средствами одного лишь HTML обеспечить эту потребность не получится. И на помощь приходят возможности PHP. Этот язык является серверным. То есть, код выполняется на сервере и возвращает результат в виде HTML-кода, который уже отправляется на пользовательский браузер. Таким образом, пользователь может видеть самую актуальную интересующую его информацию.
В основе языка PHP, как мы уже выяснили, лежит способность менять содержимое страницы непосредственно перед отправкой браузеру. Разберемся в механизме этого процесса более подробно. Код меняется так называемыми сценариями, выполнение которых динамически модифицирует существующий HTML-код или создает новый. Далее сервер в ответ на запрос браузера отправляет именно этот код. При этом для пользователя не имеет значения, каким образам была создана полученная страница — вручную или динамически при помощи сценария. Браузеру важно лишь получить запрошенный код от веб-сервера.
Здесь следует определиться, что сценарием мы будем называть программу на языке PHP, выполняемую на стороне сервера и запускаемую в ответ на запрос браузера. Теперь становится понятным, почему PHP иначе именуют препроцессором гипертекста. Запрос браузером страницы, адрес которой оканчивается на .php, приводит к выполнению (интерпретации) сценария из указанного файла средствами PHP. Сам язык в таком случае является интерпретатором.
Узнай, какие ИТ — профессии
входят в ТОП-30 с доходом
от 210 000 ₽/мес
Павел Симонов
Исполнительный директор Geekbrains
Команда GeekBrains совместно с международными специалистами по развитию карьеры подготовили материалы, которые помогут вам начать путь к профессии мечты.
Подборка содержит только самые востребованные и высокооплачиваемые специальности и направления в IT-сфере. 86% наших учеников с помощью данных материалов определились с карьерной целью на ближайшее будущее!
Скачивайте и используйте уже сегодня:

Павел Симонов
Исполнительный директор Geekbrains
Топ-30 самых востребованных и высокооплачиваемых профессий 2023
Поможет разобраться в актуальной ситуации на рынке труда
Подборка 50+ бесплатных нейросетей для упрощения работы и увеличения заработка
Только проверенные нейросети с доступом из России и свободным использованием
ТОП-100 площадок для поиска работы от GeekBrains
Список проверенных ресурсов реальных вакансий с доходом от 210 000 ₽
Получить подборку бесплатно
Уже скачали 24089
Как и PHP, языки веб-программирования ориентированы прежде всего на разработку сайтов, которые пользователи посещают через браузеры. Но помимо веба Интернет состоит из файлообменных сервисов, электронной почты, сетевых игр, мессенджеров и многого другого.
Любой действующий сегодня динамический сайт разрабатывался с использованием сценариев PHP. Например, возможности языка в полной мере реализуются в:
- социальных сетях;
- блогах;
- форумах;
- интернет-магазинах;
- браузерных играх.
Описание и синтаксис языка PHP
Как мы уже выяснили, основное предназначение PHP — это веб-программирование. В синтаксисе языка сочетаются достоинства C и Perl. При этом PHP более прост в изучении.
Если говорить о синтаксисе PHP, очевидное сходство прослеживается с Си. Местами PHP похож на Java и Perl. Для программиста на Си не составит никакого труда освоить этот язык и в дальнейшем продуктивно его применять.
Здесь присутствуют характерные для классического C операторы и функции (например, циклы while и for, операторы выбора if и switch, функции ввода-вывода и др.).
Использование PHP в коде HTML
Разберем простейший скрипт:
echo «Перед вами PHP-скрипт»;
Нужно прежде всего отметить корректную обработку HTML-кода интерпретатором. У новичка, тем не менее, при взгляде на начало этой программы может возникнуть вопрос: для чего здесь нужны тэги и , характерные для языка верстки. Дело в том, что внешне PHP-скрипт может напоминать стандартный HTML-документ. В этом заключается особенность данного языка.
Далее видно, что блок команд сценария ограничивается тегами . Все, что внутри, сервер воспринимает как скрипт, не попадающий в документ HTML и требующий интерпретации. Затем мы видим оператор вывода текста на экран echo.
Итак, любой текст, расположенный за пределами программного блока между , будет выведен в браузер. Этой особенностью PHP отличается от упомянутых C и Perl, где для вывода используются стандартные операторы.
Разделение команд в PHP
Инструкции PHP разделяются друг от друга символом точки с запятой (;). Закрывающий тег ?> одновременно закрывает и инструкцию. Поэтому данный фрагмент:
будет эквивалентен следующему:
Комментирование кода
Язык скриптов PHP подобно другим языкам программирования поддерживает комментарии. Покажем это на примере:
echo «Привет»; // Комментарий на одной строке
на нескольких строках */
echo «Конец программы»; # Альтернативный вид комментария
Вот чуть более сложный пример:
Курсы по программированию
Заголовок отобразит текст «Курсы по программированию».
Переменные
Для обозначения переменных в PHP используется символ $. Например, фрагмент кода, приведенный выше, можно записать так:
Типы данных
Язык разработки PHP поддерживает 8 простых типов данных, из которых 4 типа — скалярные (boolean, float или double, integer, string), 2 типа — смешанные (object, array), 2 типа — специальные (NULL, resource).
Отдельно отметим так называемые псевдотипы. В PHP таковыми являются number, mixed, callback.
Выражения
Выражения могут представляться в виде констант и переменных. Рассмотрим для примера следующую запись:
Для вас подарок! В свободном доступе до 26.11 —>
Скачайте ТОП-10
бесплатных нейросетей
для программирования
Помогут писать код быстрее на 25%
Чтобы получить подарок, заполните информацию в открывшемся окне
Здесь переменной $x присваивается значение 10. Оператором присваивания служит символ «равно». В таком случае выражением будет являться значение переменной. Выражаться подобным образом может любая переменная при сопоставлении ей определенного значения:
В первом операторе выражением служит константа 9, а во втором — переменная $x, поскольку до этого ей было присвоено значение 9.
Операторы
Оператор языка PHP одновременно сам является выражением и может состоять из одного либо нескольких выражений (значений), в результате определенных операций, с которым (или которыми) мы получаем новое значение. Для наглядности разберем пример с оператором присваивания.
$a = ($b = 1) + 3; // В ходе этой операции $b присваивается значение 1, к этому значению добавляется 3, результат 4 присваивается переменной $a.
Несколько операторов в PHP могут комбинироваться в один.
$a += 5; // Этот комбинированный оператор аналогичен конструкции $a = $a + 5; и дает результат 7.
$b .= «всем!»; // Переменной $b в итоге присваивается строковое значение «Привет всем!», поскольку выполняется операция $b = $b .
Отдельно остановимся на присваивании строк.
$b = $a . » коллеги!»; // $b теперь содержит строковое значение «Привет, коллеги!»
$a .= » коллеги!»; // Здесь строка «Привет, коллеги!» присваивается переменной $a
Другие операторы правильнее разбирать с точки зрения управляющих конструкций.
Управляющие конструкции языка PHP
Таковыми принято считать циклы (while, for, foreach, do-while, break, continue), а также операторы условия (if, else), выбора (switch), возврата значений (return), объявления (declare) и включений (require, include).
Вновь продемонстрируем эти элементы на примерах.
if ($a > $b) echo «a больше, чем b»;
Здесь работает условная конструкция if совместно с оператором сравнения.
В сценарии ниже значение переменной $a сравнивается с нулем. Если равенства нет, программа выводит на экран текст: «Значение переменной истинно». Причем проверка на истинность осуществляется простым указанием имени переменной. Фактически мы наблюдаем взаимодействие условного оператора if с логическим оператором.
if ($a) echo «Значение переменной истинно»;
Далее покажем работу конструкции (цикла) while.
В результате пользователь увидит на экране последовательность идущих друг за другом цифр от 1 до 10.
PHP и ООП
Некоторые элементы языка PHP вполне совместимы с принципами объектно-ориентированного программирования. К примеру, здесь существует возможность создания классов и объектов, а также последующей их гибкой настройки.
class MyNewClass // Создание класса
var $name; // Определение свойств
function Getname() // Определение методов
echo «
Bob
»;
$object = new MyNewClass; // Создание объекта класса MyNewClass
$object->name = «Tom»; // Получение доступа к членам класса
echo $object->name; // Вывод на экран имени ‘Tom’
$object->Getname(); /* Получение доступа к методу класса (а именно, к функции языка PHP созданного класса) */
Преимущества языка PHP
Превосходная производительность
Этого достигла команда разработчиков ядра языка в ходе выполнения огромной работы по оптимизации PHP. Широко известный в узких кругах Дмитрий Стогов написал статью, где приведен бенчмарк для версии 7.0, наглядно демонстрирующий выигрыш по производительности относительно Python и Ruby. Даже Java с неактивным JIT лишь ненамного производительнее PHP.
В 8 версии языка PHP разработчики реализовали собственный JIT, позволяющий повысить производительность языка до уровня передовых языков программирования. Безусловно, когда-то PHP работал гораздо медленнее. Но те времена прошли. Теперь язык оказывается едва ли не производительнее конкурентов.
Эффективный синтаксис
Несмотря на частую критику в адрес PHP в связи с отступлением от академических основ, данный язык обладает очевидным преимуществом — наличием универсальных и эффективных конструкций, подходящих для решения большинства задач. Программистам не нужно тратить время на поиск требуемой структуры данных. Благодаря этому повышается скорость разработки программ, что безусловно влияет на успех проектов. Данный, во многом определяющий фактор выводит PHP в лидеры среди других языков.
Последние по некоторым критериям, конечно, выигрывают. Например, работа со строковыми переменными реализована лучше в Python, а конструкция switch/case предоставляет больше возможностей в Swift. Но отметим, что PHP активно развивается в этих направлениях. Тем более, что на данный момент эти функции избыточны для решения текущих задач в лаконичной форме.
А если возникает необходимость в оптимизации некоего участка кода, на помощь приходят инструменты SPL, позволяющие сконцентрироваться на конкретных моментах, требующих реализации.
Современные фреймворки
Были времена, когда любой школьник мог написать и выпустить свою программу на PHP. Качество кода было сомнительным. Теперь же требования к разработчикам на PHP повысились. Сформирован минимальный стек технологий, знать который необходимо для разработки качественных продуктов. Например, в малых и средних проектах используется Laravel.
Крупные корпоративные системы принято разрабатывать с применением Symfony. Базовые же проекты сегодня реализуются с использованием стека Doctrine, являющимся аналогом Hibernate в Java. Все перечисленные фреймворки вобрали в себя современные актуальные решения, позволяющие сообществам разработчиков эффективно развиваться.
Только до 23.11
Скачай подборку материалов, чтобы гарантированно найти работу в IT за 14 дней
Список документов:

ТОП-100 площадок для поиска работы от GeekBrains

20 профессий 2023 года, с доходом от 150 000 рублей

Чек-лист «Как успешно пройти собеседование»
Чтобы зарегистрироваться на бесплатный интенсив и получить в подарок подборку файлов от GeekBrains, заполните информацию в открывшемся окне
Безусловно, продолжается активное развитие и CMS-систем, для поддержки работоспособности которых также нужны специалисты. Более того, с такой работы можно начинать карьеру в IT. Однако эпоха standalone-сайтов подходит к концу. Любому бизнесу достаточно иметь страницу в соцсетях или ресурс, построенный с помощью конструктора типа Tilda, Wix и т. д. Следует отметить, что сами конструкторы сайтов разрабатывались на PHP.
Удобный набор инструментов
Один из объективных плюсов языка PHP заключается в наличии инструментария, подходящего не только для написания кода, но также для обеспечения нормального состояния этого кода. Здесь стоит отметить дебаггинг (xdebug), оптимизацию кода (blackFire), тестирование (phpUnit), автоматическое форматирование кода под различные стандарты (code_sniffer), статические анализаторы (PHPStan) и миграцию на новые версии (rector).
Дарим скидку от 60%
на обучение «Инженер-программист» до 26 ноября
Уже через 9 месяцев сможете устроиться на работу с доходом от 150 000 рублей

Программисту предоставляется все необходимое для комфортного написания максимально надежного кода в кратчайшие сроки. Благодаря такому туллингу качество выполняемых на PHP проектов неуклонно повышается даже по сравнению с проектами на Python и Ruby. Фактически язык эволюционирует в своеобразную «Java на батарейках».
Направленная специализация
Сообщество разработчиков самого языка и программ, написанных на нем, концентрируется на обеспечении максимального удобства и максимальной эффективности бэкенд-разработки. Как результат, на свет появляются фреймворки PHP, качество которых выше, чем у аналогов на других ЯП. Четкий и направленный фокус развития позволяет экономить ресурсы на второстепенные задачи.
С этим связана довольно узкая специализация PHP. В основном она распространяется только на бэкенд. Программист, рассматривая PHP в качестве своего основного средства разработки, должен решить, что для него важнее — универсальность или максимальная эффективность. При этом нужно учесть, что сегодня в приоритете именно специализация.
Обилие учебной и профессиональной литературы
С переходом на версию 7.0 язык действительно стал цениться профессиональными разработчиками, которые взялись за создание многочисленных обучающих материалов. В сети сегодня представлено много качественных курсов по PHP.
Некоторая часть представленных материалов до сих пор доступна лишь на английском языке, хотя рано или поздно все будет переведено на русский.
Развитое сообщество программистов
Развитием и продвижением PHP занимается большая и сплоченная группа разработчиков, которые по-настоящему увлечены этим языком и делают его с каждой версией лучше и популярнее. Примечательно, что в сообществе много русскоязычных программистов, открытых к диалогу и обсуждениям.
Существует также организация The PHP Foundation, готовая оказывать материальную поддержку начинающим разработчикам, подающим надежды в деле расширения возможностей языка.
При желании каждый может вступить в сообщество и в дальнейшем влиять на развитие PHP в лучшую сторону.
Стоит ли изучать язык PHP: ситуация на рынке труда
Итак, PHP действительно заслуживает внимания в профессиональном программировании. Теперь выясним, насколько рынок нуждается в PHP-программистах. Это важный фактор, ведь карьера будущего специалиста во многом зависит от количества проектов, разрабатываемых на этом языке.
Возможность быстро начать карьеру
Рассмотрим для сравнения ситуацию с Python или Ruby. Здесь к специалистам предъявляются достаточно высокие требования по навыкам программирования на этих языках. Дело в том, что и Python, и Ruby в простых и стандартных проектах практически не используются. Любая разработка фактически уникальна. Новичку без опыта (если он не выпускник элитного вуза) попасть в такой проект в качестве разработчика будет очень трудно.
Иначе ситуация выглядит с PHP. Тип языка сам по себе предполагает наличие множества стандартных проектов, доступных для начинающих разработчиков. Это отличный вариант для старта карьеры PHP-программиста. Проекты могут быть весьма простыми, однако они позволят начать новичку развиваться в профессиональном плане. В дальнейшем потребуется лишь получение дополнительных навыков и опыта, чтобы перейти на кастомные фреймворки (Symfony или Laravel).
Достигать успеха в программировании гораздо легче, находясь уже в рабочей индустрии и получая первый коммерческий опыт. Самостоятельно развиваться новичку в любой отрасли (в том числе в PHP-разработке) будет достаточно сложно.
Множество доступных компаний
Если проанализировать рынок вакансий, выяснится, что на позицию Django всего требуется 60 тысяч специалистов, а на Laravel — лишь 11 тысяч. Эта статистика, однако, не учитывает географию. Так, например, для начинающего разработчика из страны СНГ, не обладающего опытом, более доступными окажутся вакансии на Laravel. Соответственно, шансы развиваться в этом направлении выше, чем в Django.
Пишем GraphQL API сервер на Yii2 с клиентом на Polymer + Apollo. Часть 1. Сервер
Статья рассчитана на широкий круг читателей и требует лишь базовых знаний PHP и Javascript. Если вы занимались программированием и вам знакома аббревиатура API, то вы по адресу.
Изначально статья предполагала лишь описание отличительных особенностей GraphQL и RESTful API, с которыми мы столкнулись на практике, но в итоге она вылилась в объемный туториал на несколько частей.
И сразу же хочу добавить, что не считаю GraphQL панацеей от всех бед и киллером RESTful API.
Кто мы?
Мы — компания, которая разрабатывает мобильные приложения, причем, как правило, у этих приложений существует клиент на iOS (ну понятное дело), Android и Web. Лично я в этой компании занимаюсь написанием серверной части на PHP.
Предыстория
Все началось с того что мы закончили разработку одного приложения (ну как закончили, закончить разработку приложения невозможно, просто его финансирование было безвременно приостановлено), и нам тут же зашел новый проект. Благо, компания не ограничивает разработчиков в выборе технологий (конечно же в разумных пределах), и было принято решение внести определенные изменения, дабы попытаться избежать проблем, возникавших в прошлом. Ведь, как известно, если продолжать делать то, что делаешь, то и продолжаешь получать то, что получаешь.
Проблемы RESTful API
Не то чтобы у REST’а были большие проблемы, но с одной из них я сталкивался весьма регулярно. Дело в том, что разработчики на наших проектах весьма высоко квалифицированы, и это, в свою очередь, причина того, что каждый из них считает себя на определенном уровне экспертом в своей области. API это та тонкая ниточка среди технологий которая связывает backend и frontend специалистов и является причиной многочисленных споров о том, как именно его нужно разрабатывать.
Структура проекта
Для примера рассмотрим типичную структуру данных:

Тут нужно понимать, что в реальной жизни такие таблицы могут иметь по 20+ полей, что делает использование GraphQL еще более привлекательным и оправданным. Почему именно, я попытаюсь объяснить в статье.
Какие API методы хочет создавать backend разработчик?
Разработчик серверной части конечно же хочет писать API методы таким образом, чтобы они максимально соответствовали целостным исчерпывающим объектам. Например:
GET /api/user/:id
GET /api/address/:id
GET /api/city/:id
… и т.д. Написание подобной архитектуры не только проще и быстрее (если не говорить о том, что это все делает за нас какой-нибудь скаффолдинг), но и архитектурно и эстетически красивее и правильнее (по крайней мере так считает сам разработчик). В лучшем случае backend соглашается на вложенные объекты, чтобы вместо addressId в респонсе возвращался вложенный объект адреса или (в случае связки “один ко многим”) массив адресов.
Какие API методы хочет вызывать разработчик UI?
Разработчик клиента немногим более приближен к живым людям (пользователям приложения) и их потребностям, в результате чего в приложении существует несколько (нужно читать много) мест, где необходимы разные наборы одних и тех же данных. Таким образом он хочет для каждого функционального элемента иметь по методу:
GET /api/listOfUsersForMainScreen
… и так далее в том же духе. Конечно же, такое желание вполне оправдано не только желанием сократить себе работу, но и улучшить производительность приложения. Во-первых UI делает один вызов вместо трёх (сначала user, затем address, а потом и city). Во вторых, такой метод избавит от получения множества (зачастую немалого) избыточных данных. При этом очень желательно чтобы dateCreated возвращалась в человеческом формате, а не в первозданном, взятом из поля в БД (а то ведь еще придется и unix time конвертировать).
На этой почве и рождаются конфликты, коих я был свидетелем, а иногда и участником. Хорошие разработчики ищут и, конечно же, находят компромиссы, чтобы частично удовлетворить потребности друг друга. Но если у вас, к примеру, один frontend и два backend, то тут одиночке придется включить свою харизму на максимум и задействовать все дипломатические навыки, дабы продавить написание своих бессмысленных методов, которые будут вызываться один раз за весь жизненный цикл приложения.
Что такое GraphQL и почему он должен решать мои проблемы?
Для тех, кто не знаком с GraphQL, советую потратить не более, чем 5-10 минут и посетить эту страницу, чтобы понять с чем его едят.
Почему он решает вышеописанную проблему? Потому что при использовании GraphQL, серверный разработчик описывает атомарные сущности и связи так, как ему это нравится, а UI строит кастомные запросы в зависимости от потребностей конкретного элемента. И вроде бы и овцы сыты и волки целы, но, к счастью, мы не живем в идеальном мире и подстраиваться все равно приходится. Но обо всем по-порядку.
Покажите мне код
На Хабре уже была хорошая статья о том, как подружить PHP и GraphQL, из которой я вынес много полезного, и заранее извиняюсь за повторения, ведь основной поинт статьи не обучить основам, а показать преимущества и недостатки.
Готовый демо проект серверной части можно посмотреть тут.
Собственно, приступим к написанию сервера. Чтобы пропустить настройку фреймворка и окружения, которая не содержит никакой информации о самом GraphQL, можете сразу переходить к созданию структуры (шаг 2).
Шаг 1. Установка и настройка Yii2
Данный шаг никак не связан с GraphQL, но он необходим для наших дальнейших действий.
Установка и настройка Yii2
Я просто оставлю это здесь (обязательно к выполнению).
После всего проделанного поднимем базочку. Команда
$> yii migrate
… создаст в БД таблицу для истории миграций, а…
$> yii migrate/create init
… создаст новый файл для миграции в директории migrations (init — название миграции, может быть любым). В созданный файл положим следующий исходный код:
execute("CREATE TABLE IF NOT EXISTS `user` ( `id` INT NOT NULL, `firstname` VARCHAR(45) NULL, `lastname` VARCHAR(45) NULL, `createDate` DATETIME NULL, `modityDate` DATETIME NULL, `lastVisitDate` DATETIME NULL, `status` INT NULL, PRIMARY KEY (`id`)) ENGINE = InnoDB;"); $this->execute("CREATE TABLE IF NOT EXISTS `city` ( `id` INT NOT NULL, `name` VARCHAR(45) NULL, PRIMARY KEY (`id`)) ENGINE = InnoDB;"); $this->execute("CREATE TABLE IF NOT EXISTS `address` ( `id` INT NOT NULL, `street` VARCHAR(45) NULL, `zip` VARCHAR(45) NULL, `createDate` DATETIME NULL, `modifyDate` DATETIME NULL, `status` INT NULL, `userId` INT NOT NULL, `cityId` INT NOT NULL, PRIMARY KEY (`id`), INDEX `fk_address_user_idx` (`userId` ASC), INDEX `fk_address_city1_idx` (`cityId` ASC), CONSTRAINT `fk_address_user` FOREIGN KEY (`userId`) REFERENCES `user` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION, CONSTRAINT `fk_address_city1` FOREIGN KEY (`cityId`) REFERENCES `city` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION) ENGINE = InnoDB;"); > public function safeDown() < echo "m170828_175739_init cannot be reverted.\n"; return false; >>
… и запустим миграцию:
$> yii migrate
Примечание. Сам считаю дурным тоном создавать структуру базы данных в обход средств, предоставляемых фреймворком и на практике никогда так не делаю. В данном примере это лишь сэкономило мне время. Это же касается пренебрежительно оставленной мной пустой функции для ролл-бэка safeDown().
Примечание. Для теста нам понадобится немного тестовых данных в нашей базе. Вы можете сами ее наполнить или взять миграцию с тестового репозитория.
На основе созданной структуры данных сгенерируем модели (ActiveRecord) с помощью встроенного во фреймворк генератора Gii:
$> yii gii/model --tableName=user --modelClass=User $> yii gii/model --tableName=city --modelClass=City $> yii gii/model --tableName=address --modelClass=Address
Наконец-то вся скучная работа позади, и теперь пора заняться тем, ради чего мы это всё затеяли.
Шаг 2. Установка расширения для GraphQL
Для нашего проекта будем использовать базовое расширение webonyx/graphql-php (https://github.com/webonyx/graphql-php).
$> composer require webonyx/graphql-php
Также на github можно найти уже заточенное расширение под Yii2, но на первый взгляд оно меня не вдохновило. Если же вы с ним знакомы, поделитесь своим опытом в комментариях.
Шаг 3. Создаем структуру проекта.
Основные элементы структуры, задействованные в реализации GraphQL сервера:
schema — директория в корне фреймворка, которая будет хранить сущности для GraphQL сервера: типы и мутации. Название директории и расположение не принципиально, можете назвать как угодно и расположить в другом неймспейсе (например api/ или components/).
schema/QueryType.php, schema/MutationType.php — “корневые” типы.
schema/Types.php — некий агрегатор для инициализации наших кастомных типов.
schema/mutations — мутации предпочтительно хранить в отдельной директории для удобства.
Ну и собственно controllers/api/GraphqlController.php — точка входа. Все запросы к GraphQL серверу идут через одну точку входа — /api/graphql. Таким образом ничего не мешает вам параллельно содержать RESTful API (если уж на то пошло, то, грубо говоря, GraphQL сервер это один API-метод, принимающий на вход параметрами GraphQL-запросы).
Шаг 3.1. Создадим типы для наших моделей.
Создадим новую директорию schema и в ней классы для наших моделей.
/schema/CityType.php:
function() < return [ 'name' =>[ 'type' => Type::string(), ], ]; > ]; parent::__construct($config); > >
В описании поля участвуют следующие параметры:
type — GraphQL-тип поля (Type::string(), Type::int(), т.д).
description — описание (просто текст; будет использоваться в схеме, придает удобство при отладке запросов).
args — принимаемые аргументы (ассоциативные массив, где ключ — имя аргумента, значение — GraphQL-тип).
resolve($root, $args) — функция, которая возвращает значение поля. Аргументы: $root — объект соответствующего ActiveRecord (в данном случае в него будет приходить объект models\City); $args — ассоциативный массив аргументов (описанных в $args).
Все поля кроме type — опциональны.
/schema/UserType.php:
function() < return [ 'firstname' =>[ 'type' => Type::string(), ], 'lastname' => [ 'type' => Type::string(), ], 'createDate' => [ 'type' => Type::string(), // текстовое описание, поясняющее // что именно хранит поле // немного позже вы увидите в чем его удобство // (оно еще больше сократит ваше общение с юайщиком) 'description' => 'Date when user was created', // чтобы можно было форматировать дату, добавим // дополнительный аргумент format 'args' => [ 'format' => Type::string(), ], // и собственно опишем что с этим аргументом // делать 'resolve' => function(User $user, $args) < if (isset($args['format'])) < return date($args['format'], strtotime($user->createDate)); > // коли ничего в format не пришло, // оставляем как есть return $user->createDate; >, ], // при необходимости с остальными датами можно // произвести те же действия, но мы // сейчас этого делать, конечно же, не будем 'modityDate' => [ 'type' => Type::string(), ], 'lastVisitDate' => [ 'type' => Type::string(), ], 'status' => [ 'type' => Type::int(), ], // теперь самая интересная часть схемы - // связи 'addresses' => [ // так как адресов у нас много, // то нам необходимо применить // модификатор Type::listOf, который // указывает на то, что поле должно вернуть // массив объектов типа, указанного // в скобках 'type' => Type::listOf(Types::address()), 'resolve' => function(User $user) < // примечательно то, что мы можем сразу же // обращаться к переменной $user без дополнительных проверок // вроде, не пустой ли он, и т.п. // так как если бы он был пустой, до текущего // уровня вложенности мы бы просто не дошли return $user->addresses; >, ], ]; > ]; parent::__construct($config); > >
/schema/AddressType.php:
function() < return [ 'user' =>[ 'type' => Types::user(), ], 'city' => [ 'type' => Types::city(), ], // остальные поля не столь интересны // посему оставляю их вам на // личное растерзание ]; > ]; parent::__construct($config); > >
Для AddressType.php нам необходим вспомогательный класс Types.php, который описан ниже.
Шаг 3.2. schema/Types.php
Дело в том, что GraphQL схема не может иметь несколько одинаковых (одноименных) типов. Именно за этим призван следить агрегатор Types.php. Название нарочно было выбрано именно Types, чтобы было похоже, и, в тоже время, отличалось от стандартного класса библиотеки GraphQL — Type. Таким образом обратиться к стандартному типу можно через Type::int(), Type::string(), а к кастомному — Types::query(), Types::user(), и т.д.
schema/Types.php:
public static function user() < return self::$user ?: (self::$user = new UserType()); >public static function address() < return self::$address ?: (self::$address = new AddressType()); >public static function city() < return self::$city ?: (self::$city = new CityType()); >>
Шаг 3.3. schema/QueryType.php
function() < return [ 'user' =>[ 'type' => Types::user(), // добавим сюда аргументов, дабы // выбрать необходимого нам юзера 'args' => [ // чтобы агрумент сделать обязательным // применим модификатор Type::nonNull() 'id' => Type::nonNull(Type::int()), ], 'resolve' => function($root, $args) < // таким образом тут мы уверены в том // что в $args обязательно присутствет элемент с индексом // `id`, и он обязательно целочисленный, иначе мы бы сюда не попали // так же мы не боимся, что юзера с этим `id` // в базе у нас не существует // библиотека корректно это обработает return User::find()->where(['id' => $args['id']])->one(); > ], // в принципе на поле user можно остановиться, в случае // если нам нужно обращаться к данным лиш конкретного пользователя // но если нам нужны данные с другими привязками добавим // для примера еще полей 'addresses' => [ // без дополтинельных параметров // просто вернет нам списох всех // адресов 'type' => Type::listOf(Types::address()), // добавим фильтров для интереса 'args' => [ 'zip' => Type::string(), 'street' => Type::string(), ], 'resolve' => function($root, $args) < $query = Address::find(); if (!empty($args)) < $query->where($args); > return $query->all(); > ], ]; > ]; parent::__construct($config); > >
C MutationType.php разберемся немного позже.
Шаг 3.4. Создаем controllers/api/GraphqlController.php
Теперь доделаем последнюю часть, чтобы к нашим новосозданным типам можно было достучаться.
GraphqlController.php:
['POST'], ]; > public function actions() < return []; >public function actionIndex() < // сразу заложим возможность принимать параметры // как через MULTIPART, так и через POST/GET $query = \Yii::$app->request->get('query', \Yii::$app->request->post('query')); $variables = \Yii::$app->request->get('variables', \Yii::$app->request->post('variables')); $operation = \Yii::$app->request->get('operation', \Yii::$app->request->post('operation', null)); if (empty($query)) < $rawInput = file_get_contents('php://input'); $input = json_decode($rawInput, true); $query = $input['query']; $variables = isset($input['variables']) ? $input['variables'] : []; $operation = isset($input['operation']) ? $input['operation'] : null; >// библиотека принимает в variables либо null, либо ассоциативный массив // на строку будет ругаться if (!empty($variables) && !is_array($variables)) < try < $variables = Json::decode($variables); >catch (InvalidParamException $e) < $variables = null; >> // создаем схему и подключаем к ней наши корневые типы $schema = new Schema([ 'query' => Types::query(), ]); // огонь! $result = GraphQL::execute( $schema, $query, null, null, empty($variables) ? null : $variables, empty($operation) ? null : $operation ); return $result; > >
Также стоит отметить, что обертывание в try-catch GraphQL::execute() для форматирования вывода ошибок ничего не даст, т.к. он уже внутри перехватывает всё возможное, а что делать с ошибками, я опишу немного позже.
Шаг 4. Тестируем.
Собственно, настало время осознать, увидеть и потрогать то, что у нас получилось.
Проверим наш запрос в расширении для Chome — GraphiQL. Лично я больше предпочитаю «GraphiQL Feen», которое имеет более расширенный функционал (сохраненные запросы, кастомные хедеры). Правда последнее иногда имеет проблемы с выводом ошибок, а точнее просто ничего не выводит в случае ошибки на сервере.
Вводим в поля необходимые данные и радуемся результату:

Таким образом, после всего имеем:
- автокомплит по полям и аргументам (с подчеркиванием неверных параметров, конечно же)
- вывод дескрипшна подсвеченного поля
- автоматическая справка с серфингом в правой части
- моментальное получение результата

Полностью кастомный запрос с полностью кастомным результатом — мечта frontend разработчика:

Могли ли вы об этом всем мечтать разрабатывая свой RESTful, при том что вы для этого ничего и не делали? Конечно же нет.
Также важно обратить внимание на то, что для того, чтобы вытащить адреса и пользователя, нам не нужно делать два отдельных запроса, а можно (и нужно) всё сделать сразу:

Возможность дебага запросов лично я считаю одним из весомых преимуществ GraphQL. Дело в том, что он автоматически генерирует схему, которую втягивает расширение, и у вас включается валидация и автокомплит. Таким образом имея лишь адрес точки входа в GraphQL сервер, вы можете полностью изучить его возможности. Несекьюрно? Как по мне, секьюрность реализуется немного на другом уровне. Имея доступ к документации любого API, мы точно так же имеем полную его схему. Некоторые RESTful API имеют подобные JSON или XML схемы, к сожалению не многие, а для GraphQL это стандарт, к тому они же активно используются клиентами.
To be continued…
В следующей(их) части(ях) статьи я опишу как это всё по-красивому использовать в UI, и конечно же мы затронем еще одну тему без которой API не API — это мутации.
Какое значение сейчас имеет аббревиатура php
Mira_L » Пн апр 08, 2013 21:56
Уважаемые коллеги, перевожу циркуляр подписей, прошу вашего совета вот по какому вопросу. В циркуляре имеется заверка нотариуса, в табличке, кто переводил, тот знает (свидетельствую, что подпись, проставленная в настоящем документе, принадлежит ХХХ и далее по тексту), затем идет дата, а после даты стоит незнакомая мне аббревиатура ÖŞ. Единственная подсказка, которую выдает гугль – ÖŞÜR VERGİSİ, но это вроде как к делу отношения не имеет. Или имеет? Кто знает, что может означать эта аббревиатура?
И еще, как вы переводите слово DAYANAK там же, в тексте заверки? Я всегда переводила как «обоснование», но сейчас что-то сомнения одолели, все-таки мне кажется, что «обоснование» не передает полностью значение слова.
Заранее всем спасибо.
Если бы в одно прекрасное утро мы обнаружили, что отныне все люди — одной нации, одной веры и одной расы, то еще до обеда мы бы изобрели новые предубеждения.
(c) Джордж Эйкен
Mira_L
Сообщения: 2674 Зарегистрирован: Чт июн 12, 2008 15:39 Откуда: АР Язык(-и): az/tr/es>ru
Re: Помогите расшифровать аббревиатуру
Олжас Сулейменов » Пн апр 08, 2013 22:12
У меня было написано B.Ç., что означает Büyükçekmece.
А Dayanak я переводил как основание.
«Я обращаюсь ко всем, кто учит английский язык. Ну вы сначала русский-то выучите!» © Сергей Светлаков
Re: Помогите расшифровать аббревиатуру
Бусля » Пн апр 08, 2013 22:39
Mira_L , DAYANAK я бы тоже перевела как основание, а вот про сокращение не знаю.
Бусля
Сообщения: 594 Зарегистрирован: Вс фев 11, 2007 13:44 Откуда: Турция Язык(-и): tur-eng-ru
Re: Помогите расшифровать аббревиатуру
Олжас Сулейменов » Пн апр 08, 2013 22:49

Открыть картинку в новой вкладке:
А что такое ÖŞ, я даже не знаю. Может, Ödemiş?
«Я обращаюсь ко всем, кто учит английский язык. Ну вы сначала русский-то выучите!» © Сергей Светлаков
Re: Помогите расшифровать аббревиатуру
Mira_L » Пн апр 08, 2013 23:47
Олжас Сулейменов писал(а): А что такое ÖŞ, я даже не знаю. Может, Ödemiş?
Никаких идей, абсолютно.
Насчет DAYANAK
Я тоже переводила как основание, вернее, обоснование (это в принципе, одно и то же, но мне почему-то больше нравилось обоснование).
Но сейчас меня гложут сомнения. Вот посмотрите на текст внизу, это перевод того самого DAYANAK
ОБОСНОВАНИЕ
В связи с избранием членов Совета директоров (имена-фамилии), представляющих компанию (наименование компании), на внеочередном общем собрании, сведения о котором опубликованы в Торговой газете Турции на страницах (номер, дата), к настоящему документу прилагается решение Совета директоров (номер, дата), опубликованное в том же номере той же газеты.
Настоящее обоснование прилагается в соответствии со статьей 79. Нотариального кодекса.
Если это основание, что тут на чем основывается? Если обоснование — что оно обосновывает? Мне кажется, тут просто констатация, подтверждение. Вот и думаю, может перевести его как сопровождающий документ или подтверждающий документ , или удостоверение .
Если бы в одно прекрасное утро мы обнаружили, что отныне все люди — одной нации, одной веры и одной расы, то еще до обеда мы бы изобрели новые предубеждения.
(c) Джордж Эйкен
Mira_L
Сообщения: 2674 Зарегистрирован: Чт июн 12, 2008 15:39 Откуда: АР Язык(-и): az/tr/es>ru
Re: Помогите расшифровать аббревиатуру
arzu » Пн апр 08, 2013 23:57
Маркировка ЕАС
Торговля между различными государствами всегда сопровождается впечатляющим объёмом бюрократических процедур и формальностей. В своё время страны, входящие в Таможенный Союз (Россия, Казахстан, Белоруссия, Армения и Киргизия), приняли ряд документов, облегчающих товарооборот между этими государствами. Обобщающим законодательным актом этого сообщества стал Таможенный кодекс Евразийского экономического союза, который является правоустанавливающим документом на территории всех перечисленных государств. Для универсальной маркировки товаров, имеющих сертификаты или декларации о соответствии, был учреждён специальный знак обращения на рынке Таможенного Союза – ЕАС.
Что означает знак ЕАС
Для обозначения товаров, соответствующих требованиям технических регламентов Евразийского Экономического Союза, используется аббревиатура ЕАС (Евразийское соответствие — Eurasian Conformity).
Маркировка продукции знаком ЕАС свидетельствует о том, что продукт прошёл сертификацию или декларирование соответствия, а также все необходимые лабораторные испытания, подтвердившие соответствие требованиям технических регламентов Евразийского Экономического Союза (ранее Таможенного Союза).
Какие товары маркируются знаком ЕАС
В обязательном порядке должна быть промаркирована продукция, которая попадает под действие одного или нескольких технических регламентов Евразийского Экономического Союза. Например, это пищевые продукты, продукция легкой промышленности, детские товары и так далее.
Данный инструмент технического регулирования определяется постановлением Таможенного Союза №711 от 15.07.2011 и Положением о применении единого знака на территории РФ. Знак ЕАС ставится исключительно на товары, которые имеют сертификат или декларацию соответствия ТС. Просто промаркировать продукцию — это не значит, выполнить требования законодательства. В первую очередь, необходимо получить разрешительную документацию на продукцию (декларацию или сертификат).
Правила маркировки продукции знаком ЕАС
- Буквы сокращения выполняются без закруглённых углов строгими прямыми линиями;
- Все три буквы должны быть одинакового размера, а общая конфигурация товарного знака должна вписываться в квадрат;
- Аббревиатура ЕАС наносится на упаковку контрастными броскими цветами;
- Этот товарный знак должен чётко читаться невооружённым глазом;
- Другие знаки и изображения упаковки не должны препятствовать прочтению данного сокращения;
- Изображение должно сохранять детализацию на протяжении всего срока годности маркированного товара;
- Минимальный размер знака – не менее 5 мм, а верхние границы длины и ширины не ограничены;
Единый знак обращения на рынке Таможенного Союза стал наглядным свидетельством долгосрочных планов государств, входящих в это политико-экономическое объединение. Маркировка ЕАС сегодня высоко котируется как на внутреннем, так и на международном рынке.
Сегодня любая продукция, реализуемая на территории России или экспортируемая в другие страны, может иметь сертификаты следующих двух типов:
• Сертификат соответствия ГОСТ Р – свидетельство надлежащего качества товаров или услуг, выдаваемое в рамках государственных российских стандартов. Различают два вида – обязательная и добровольная сертификация;
• Сертификат ТС – удостоверение соответствия характеристик продукции техническому регламенту Таможенного Союза. В этом случае процесс сертификации носит строго обязательный характер и продукция должна маркироваться знаком ЕАС.
Обе системы сертификации являются равноправными и не пересекаются в перечне требований к изделиям одной товарной группы. Это означает, что если вы имеете сертификат ГОСТ Р, то сертифицированная продукция не описана в регламенте ТС. В данном случае предусмотрена так называемая маркировка РСТ.