Співбесіда на позицію WordPress розробник (full stack)

03.06.2022 | Написав

Зараз активно проходжу співбесіди у різні компанії на різні як фронтові, так і фулстекові посади. Питання реальної співбесіди зі мною на позицію розробника WordPress.

HTTP — широко поширений протокол передачі даних, спочатку призначений передачі гіпертекстових документів. Розшифровується як HyperText Transfer Protocol.

Завдання, яке традиційно вирішується за допомогою протоколу HTTP — обмін даними між додатком користувача, що здійснює доступ до веб-ресурсів (зазвичай це веб-браузер) і веб-сервером. На даний момент саме завдяки протоколу HTTP забезпечується робота Всесвітнього павутиння.

HTTP не передбачає шифрування передачі інформації. Для HTTP є поширене розширення, яке реалізує упаковку даних, що передаються в криптографічний протокол SSL або TLS – HTTPS (HyperText Transfer Protocol Secure).

HTTP запит складається з трьох основних частин: строка запиту (request line), заголовок (message header) та тіло повідомлення (entity body).

Для того, щоб вказати серверу на те, яку дію ми хочемо зробити з ресурсом, використовується HTTP методи. Існує кілька методів HTTP. Найчастіше використовуються GET і POST.

Крім методів GET та POST використовуються інші методи:
HEAD – aналогічний метод GET, однак у відповіді сервера міститься тільки заголовок, без тіла. Зазвичай застосовується для того, щоб перевірити, чи існує ресурс за вказаною адресою, а також чи не змінився з моменту останнього звернення;
PUT – завантажує вміст запиту на вказаний у запиті URI. Якщо за заданим URI ресурсу немає, сервер створює його, повертаючи статус 201 (Created);
DELETE – видаляє вказаний ресурс;
OPTIONS – використовується для опису параметрів зв’язку між клієнтом та сервером;
CONNECT – перетворює з’єднання запиту на прозорий TCP/IP-тунель.

Код стану HTTP – частина першого рядка відповіді сервера, який інформує клієнта про результат запиту. Складається він із трьох цифр, перша з яких вказує на клас стану. За цифрами іде фраза, яка пояснює причину відповіді.

1xx: Інформація

Статус кода Повідомлення Опис
100 Continue Продовжуй
Сервер задоволений початковими відомостями про запит і клієнт може продовжувати.
101 Switching Protocols Перемикання протоколів
Клієнт, який надіслав запит, пропонує перейти на більш відповідний для зазначеного ресурсу протокол.
103 Checkpoint Контрольна точка
Використовується у запитах з можливістю продовження для відновлення після переривання запитів POST або PUT.

2xx: Успіх

Статус кода Повідомлення Опис
200 OK OK — успішний запит
HTTP запит успішно оброблений.
201 Created Створено
В результаті успішного виконання запиту було створено новий ресурс
202 Accepted Прийнято
Запит був прийнятий в обробку, але обробка ще не завершена.
203 Non-Authoritative Information Не авторитетна інформація
Запит був успішно оброблений (аналогічно відповіді 200), але в цьому випадку інформація, що передається, була взята не з первинного джерела (наприклад, з резервної копії або іншого сервера) і може бути неактуальною.
204 No Content Немає контента
Запит був успішно оброблений, але не повернув ниякого контента.
205 Reset Content Сброс контента
Запит був опрацьований, але не повернув контент. При цьому потрібне скидання введених даних клієнтом.
206 Partial Content Частина контента
Сервер успішно обробив лише частину запиту.

3xx: Перенаправлення

Статус кода Повідомлення Опис
300 Multiple Choices Выбор из нескольких вариантов
Сервер передаёт с сообщением список из нескольких возможных вариантов перенаправления альтернатив (максимум 5 вариантов). Клиент может выбрать один из них.
301 Moved Permanently Окончательно перемещено
Страница окончательно перемещена на другой URL.
302 Found Найдено /временно перемещено
Запрашиваемая страница была найдена / временно перенесена на другой URL
303 See Other Смотрите другое
Запрашиваемая страница не найдена по другому URL
304 Not Modified Без изменений
Запрашиваемый документ не был изменен с момента последнего запроса
306 Switch Proxy Использовавшийся раньше код ответа, в настоящий момент зарезервирован
307 Temporary Redirect Временный редирект
Запрашиваемый ресурс на короткое время доступен по другому URL.
308 Resume Incomplete Перемещено навсегда / возобновление после прерывания
Запрашиваемая страница была перенесена на новый URL на постоянной основе (редирект 308 сохраняет HTTP метод, в отличии от 301-го, где возможно его изменение), либо предлагается возобновить прерванный PUT или POST запрос

4xx: Помилки клиента

Статус кода Повідомлення Опис
400 Bad Request Некорректный запрос
Запрос не может быть обработан, поскольку содержит синтаксическую ошибку.
401 Unauthorized Не авторизован
Запрос обрабатывается, но доступ к запрашиваемому ресурсу не предоставляется, поскольку клиент не авторизован
402 Payment Required Не используется
Зарезервирован для использования в будущем.
403 Forbidden Запрещено
Сервер понял запрос, но он не выполняет его из-за ограничений прав доступа к указанному ресурсу
404 Not Found Не найдено
Запрашиваемая страница не найдена. Сервер понял запрос, но не нашёл соответствующего ресурса по указанному URL (Самая распространенная ошибка в Интернете, возникает из-за неправильно указанного URL).
405 Method Not Allowed Mетод не поддерживается
Запрос был сделан методом, который не поддерживается данным ресурсом.
406 Not Acceptable Не принимается
Сервер может сгенерировать только такой ответ, который клиент не принимает. (например, на другом языке).
407 Proxy Authentication Required Требуется аутентификация прокси
Ответ аналогичен коду 401 за исключением того, что аутентификация производится для прокси-сервера
408 Request Timeout Время ожидания истекло
Запрос клиента к серверу занял слишком много времени.
409 Conflict Конфликт
Запрос не может быть обработан по причине конфликта с другим запросом или конфигурацией сервера
410 Gone Недоступен
Доступный по указанному URL раньше был доступен, но был удалён или недоступен.
411 Length Required Нужна длина
Длина контента не определена, и сервер не принимает запрос без этого. Повторный запрос должен содержать заголовок “Content-Length”.
412 Precondition Failed Не выполнено предварительное условие
Предварительное условие, указанное в запросе, не было выполнено.
413 Request Entity Too Large Слишком большой запрос
Размер запроса превышает максимальный размер запроса, принимаемого сервером.
414 Request-URI Too Long Слишком длинный URI
Серверу не удается обработать запрос по причине длинного URI. Такая ошибка может возникнуть, когда клиент пытается передать длинные параметры через метод GET, а не POST.
415 Unsupported Media Type Неподдерживаемый формат
Формат не поддерживается, и сервер не может принять запрос.
416 Requested Range Not Satisfiable Недопустимый диапазон
Диапазон байтов, запрошенный клиентом, находится за пределами ресурса
417 Expectation Failed Ожидания не оправдались
Сервер не может удовлетворить требования заголовка Expect, так как поле заголовка не соответствует ожиданиям.

5xx: Помилки сервера

Статус кода Сообщение Описание
500 Internal Server Error Внутренняя ошибка сервера
Любая внутренняя ошибка сервера, которую сервер не может конкретизировать.
501 Not Implemented Не реализовано
Сервер не распознает указанного в запросе метода и не может обработать запрос.
502 Bad Gateway Ошибка шлюза
Сервер, выступая в роли шлюза или прокси-сервера, получил недействительное ответное сообщение от вышестоящего сервера
503 Service Unavailable Сервис недоступен
Сервер не доступен в данный момент (перегружен, отключен, на техническом обслуживании).
504 Gateway Timeout Время ожидания ответа шлюзом истекло
Сервер, выступая в роли шлюза или прокси-сервера, не получил ответа от вышестоящего сервера в отведенное время.
505 HTTP Version Not Supported Версия HTTP не поддерживается
Версия протокола HTTP, используемая в запросе, не поддерживается сервером
511 Network Authentication Required Требуется аутентификация
Для получения доступа к сети, клиент должен пройти аутентификацию. Ошибка генерируется сервером-посредником, к примеру, сервером интернет-провайдера, если нужно ввести пароль для получения доступа к сети через платную точку доступа.

Метод GET

Метод GET запрашивает информацию из указанного источника и не влияет на его содержимое. Запрос доступен для кеширования данных и добавления в закладки. Длина запроса ограничена (макс. длина URL – 2048). Строка запроса (имя/значение) отправляется в URL. GET запрос не имеет BODY. Все данные, которые необходимо передать в GET запросе нужно передавать как параметризированную часть URL.

Метод POST

Метод POST используется для отправки данных, что может оказывать влияние на содержимое ресурса. В отличие от метода GET запросы POST не могут быть кешированы, они не остаются в истории браузера и их нельзя добавить в закладки. Запросы POST не ограничиваются в объеме. Отправляемые данные содержатся в теле запроса.

Сравнение методов GET и POST

Название GET POST
Кнопка “назад” / Перезагрузка Безопасно Данные будут отправлены вновь. Браузер должен предупредить, что произойдет повторная отправка данных.
Добавление в закладки Да Нет
Кеширование Да Нет
Тип кодировки application/x-www-form-urlencoded application/x-www-form-urlencoded or multipart/form-data
История Остается в истории браузера. Не остается в истории браузера.
Ограничение в длине запроса Есть ограничения. Так как данные передаются в URL, то запрос должен ограничиваться 2048 символами (максимальная длина URL). Нет ограничений.
Ограничение по типу данных Допускается использование только символов ASCII. Не имеет ограничение. Допускаются также двоичные данные.
Безопасность Менее безопасный метод передачи, поскольку передаваемые в URL данные видны пользователю. POST более безопасный, так как данные не отображаются напрямую в web-клиенте пользователя, кроме того запрос не кешируется и не сохраняется в истории.
Видимость Данные в URL визуально доступны всем. Данные не видны в URL.

GET

Фильтры в интернет-магазинах
Передача параметров через ссылку
Другие безопасные запросы

POST

Любые формы с паролями или банковскими картами
Формы заявок с персональными данными
Отправка файлов

Чи можна передати данні через GET – так, в URL.

Чи можна отримати данні через POST – так, в реквесті.

API (Application Programming Interface) представляє набір правил і функцій, що дозволяють двом різним програмам взаємодіяти один з одним. Подібні інтерфейси полегшують інтеграцію додатків, даючи можливість розробникам створювати потужні діджитал рішення.

API є посередником між програмами, надсилаючи запити та відповіді. Наприклад, реєстрація в додатку через існуючий обліковий запис у Twitter користувача відбувається через API Twitter, який розробники інтегрували в програму.

Існує безліч різних типів API для програм, вебсайтів та операційних систем.

Найвідоміші типи API:

Видалений виклик процедур (Remote Procedure Call – RPC)

Простий протокол доступу до об’єктів (Simple Object Access Protocol – SOAP)

Передача стану подання (Representational State Transfer – REST)

Що таке REST API

REST або Representational state transfer, що перекладається як передача стану уявлення – це архітектурний стиль проектування API з використанням протоколу HTTP. Головна перевага REST – велика гнучкість.

REST API застосовується скрізь, де є необхідність надання даних із сервера користувачеві веб-програми або сайту.

Як працює REST API

REST API взаємодіє з допомогою HTTP запитів, виконуючи стандартні функції: створення, оновлення, читання, видалення записів у ресурсі. Існує чотири методи, що описують, що потрібно робити з ресурсом:

POST – створення ресурсу;

GET – отримання ресурсу;

PUT – оновлення ресурсу;

DELETE – видалення ресурсу.

Головними компонентами REST API є:

Client – клієнт або програма, яка запущена на стороні користувача (на його девайсі) та ініціює комунікацію.

Server — сервер, який надає API як доступ до своїх даних та функцій.

Resource – ресурс є будь-яким видом контенту (відео, текст, картинка), який сервер може передати клієнту.

Принципи REST API

REST не прив’язаний до будь-якої конкретної технології або платформи, не залежить від мови. Він також не вказує, як саме створювати API, але використовує 6 архітектурних обмежень, які мають бути дотримані, щоб інтерфейс можна було назвати RESTful. Саме ці принципи REST API описують, як сервер обробляє запити та відповідає на них.

Client-server

Програма REST має клієнт-серверну архітектуру. Клієнтом є той, хто надсилає запити на ресурси і ніяк не пов’язаний із сховищем даних. Зберігання даних залишається всередині сервера. Сервери ж не зв’язуються з інтерфейсом користувача. Іншими словами, клієнт і сервер незалежні один від одного і можуть розвиватися окремо, що робить REST API більш гнучким та масштабованим.

Uniform Interface

Уніфікований інтерфейс чи єдиний інтерфейс – це головне, що відрізняє REST API від інших видів. Він передбачає наявність єдиного способу взаємодії з сервером незалежно від типу пристрою або програми.

Єдиний інтерфейс включає чотири основних принципи:

  • Identification of resources. Кожен ресурс REST має ідентифікатор, який не залежить від стану ресурсу. У ролі ідентифікатора виступає URL-адреса.
  • Manipulation of resources through representations (маніпулювання ресурсами через уявлення). Клієнт має уявлення ресурсу, яке містить дані для його видалення чи зміни. Клієнт відправляє подання на сервер (об’єкт JSON), який хоче змінити, видалити або додати.
  • Self-descriptive messages (самодокументовані повідомлення). Такі повідомлення містять потрібну інформацію для одержувача, щоб її зрозуміти. Жодної додаткової інформації не потрібна окрема документація або повідомлення. Кожне повідомлення має достатню інформацію для того, щоб сервер легко проаналізував запит.
  • Hypermedia as the engine of application state (Гіпермедіа як двигун стану програми). Гіпермедіа має на увазі використання посилань для кожної відповіді, щоб клієнт міг знайти інші ресурси. Таким чином, всі взаємодії в REST проходять через гіпермедіа.
  • Stateless (без стану)

    Сервер не містить жодної інформації про клієнта. Кожен запит включає всю потрібну інформацію для обробки. Інформація про сесію повністю зберігається за клієнта.

    Cacheable (кешування)

    Кожна відповідь повинна містити дані про те, чи вона кешується чи ні і протягом якого часу відповідь може бути кешована на стороні клієнта. Якщо відповідь може бути кешована, то в наступних схожих запитах клієнт може використовувати ті самі дані без повторного звернення на сервер. При правильному використанні це покращує продуктивність та доступність.

    Layered system (багаторівнева система)

    У REST використовується багаторівнева система – ієрархія шарів, що створює певні обмеження на поведінку компонентів. У багаторівневій системі компоненти можуть бачити тільки ті компоненти, які розташовані на найближчих рівнях і з якими вони взаємодіють.

    Code on demand (код на запит)

    Це опціональна функція, яка дозволяє клієнту завантажувати та виконувати код.

    Основні відмінності REST API від інших API

    Шість принципів REST API є основною відмінністю інтерфейсу від інших типів. Крім того, є ще кілька параметрів, які відрізняють REST від інших API.

    Насамперед, сама суть REST визначає його несумісність з іншими протоколами. REST – це архітектурний стиль, де архітектура REST представляє набір вимог, яким потрібно дотримуватися, щоб надати веб-службу RESTful. A, наприклад, SOAP та RPC є протоколами обміну повідомленнями. Протокол описує ці повідомлення, коли архітектурний REST API лише визначає вимоги (у разі обмеження), які повідомлення мають виконувати.

    Структура

    Більшість програмних інтерфейсів працюють у форматі програма-додаток, коли REST діє за принципом Клієнт-Сервер. У разі клієнт і сервер не залежать друг від друга, що дає більше гнучкості у роботі.

    Формат обміну повідомленнями

    Зазвичай API використовують конкретні формати повідомлень, наприклад SOAP використовує XML. REST не дотримується такого суворого принципу. Обмін повідомлень може відбуватися на основі JSON, XML або будь-якого іншого формату. Найпопулярнішим є JSON (JavaScript Object Notation).

    Популярність JSON цілком обґрунтована – це легко читається людиною та швидкий для аналізу формат обміну даними. JSON незалежний від мови та може бути використаний з будь-якою мовою програмування, крім JavaScript.

    Гнучкість

    REST є гнучкішою архітектурою, завдяки чому і став таким популярним. Він вирішує проблеми, які викликає той же SOAP, будучи складним протоколом з розширеними функціями безпеки, що потребує більшої пропускної спроможності. REST складається із простих рекомендацій, даючи можливість розробникам реалізовувати вимоги у своєму форматі. Архітектурний стиль також має високу продуктивність. Що зробило особливо затребуваним для мобільних пристроїв, де швидкість завантаження є особливо важливою.

    REST має певні переваги над іншими типами API. Саме тому всі великі компанії, такі як Twitter і Google, вже давно впровадили REST API для своїх продуктів. Адже це ідеальний спосіб передачі функцій та даних розробникам по всьому світу та перевірений механізм для створення ефективних та масштабованих інтерфейсів для розробки ПЗ.

    DOCTYPE – інструкція, яка асоціює веб-сторінку з типом документа. Простими словами, прописуючи DOCTYPE, ми говоримо браузерам/валідаторам, якою мовою розмітки ми писали свій документ.

    У HTML5 декларація типу документа виглядає дуже просто:

    <!DOCTYPE html>

    Застарілі типи DOCTYPE:

    DOCTYPE для HTML 1.0. Приклад:

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

    Та зі строгим сінтаксісом:

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

    DOCTYPE для HTML 4.01. Приклад:

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

    Та зі строгим сінтаксісом:

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">

    Якщо вказати DOCTYPE неправильно або не вказувати його взагалі, браузери покажуть сторінку сумісності зі своїми старими версіями.

    Селектор визначає, якого елемента застосовувати те чи інше CSS-правило.

    Зверніть увагу – не існує селекторів, які дозволили б вибрати батька (містить контейнер) або сусіда батька або нащадків сусіда батька.

    Існують:

    Базові селектори:

    • Универсальный селектор – зірочка *
    • Селектори за типом елемента – p, input та інше
    • Селекторы за классом – .block
    • Селекторы за ідентифікатором – #block
    • Селекторы за атрибутом – [attr], [attr=value], [attr~=value] (Позначає елемент з ім’ям атрибута attr значенням якого є набір слів розділених пробілами, одне з яких точно дорівнює value), [attr|=value] (є точно”value” або може починатися з “value” з відразу ж наступним “-“), [attr^=value] (починається з value), [attr$=value] (закінчується на value), [attr*=value] (містить value)

    Комбінатори:

    • кома – ,
    • потомки (через пробіл) – .block span a
    • дочірні – .block > span > a
    • сосідні – .blockOne ~ .blockTwo. Вибирає елементи, які знаходяться на цьому ж рівні вкладеності, після зазначеного елемента, з тим же батьком
    • слідуючий сосідній – .blockOne + .blockTwo

    Псевдо:

    псевдокласи (через двокрапку) – :,
    визначає його особливий стан.

    :active:active
    :any (en-US)
    :any-link
    :checked
    :default
    :defined
    :dir()
    :disabled
    :empty
    :enabled
    :first
    :first-child
    :first-of-type
    :fullscreen
    :focus
    :hover
    :indeterminate
    :in-range
    :invalid
    :lang()
    :last-child
    :last-of-type
    :left
    :link
    :not()
    :nth-child()
    :nth-last-child()
    :nth-last-of-type()
    :nth-of-type()
    :only-child
    :only-of-type
    :optional
    :out-of-range
    :read-only
    :read-write
    :required
    :right
    :root
    :scope (en-US)
    :target
    :valid
    :visited

    псевдоелементи (через дві двокрапки) – ::,
    дозволяє стилізувати певну частину вибраного елемента.

    ::after (:after)
    ::backdrop
    ::before (:before)
    ::cue
    ::cue-region
    ::first-letter (:first-letter)
    ::first-line (:first-line)
    ::file-selector-button
    ::grammar-error Experimental
    ::marker
    ::part()
    ::placeholder
    ::selection
    ::slotted()
    ::spelling-error
    ::target-text

    Псевдоклас у CSS – це ключове слово, додане до селектора, яке визначає його особливий стан. Наприклад, :hover може бути використаний для зміни кольору кнопки під час наведення курсору на неї.

    Псевдокласи дають можливість стилізувати елемент на основі не тільки відносин у DOM-дереві, але й ґрунтуючись на зовнішніх факторах, таких як історія відвідувань (наприклад, :visited), стан вмісту (на зразок :checked у деяких елементів форми) або позиції курсора миші (наприклад , :hover визначає, чи знаходиться курсор миші над елементом).
    :active:active
    :any (en-US)
    :any-link
    :checked
    :default
    :defined
    :dir()
    :disabled
    :empty
    :enabled
    :first
    :first-child
    :first-of-type
    :fullscreen
    :focus
    :hover
    :indeterminate
    :in-range
    :invalid
    :lang()
    :last-child
    :last-of-type
    :left
    :link
    :not()
    :nth-child()
    :nth-last-child()
    :nth-last-of-type()
    :nth-of-type()
    :only-child
    :only-of-type
    :optional
    :out-of-range
    :read-only
    :read-write
    :required
    :right
    :root
    :scope (en-US)
    :target
    :valid
    :visited

    БЭМ (Блок, Элемент, Модификатор) — компонентный подход к веб-разработке. В его основе лежит принцип разделения интерфейса на независимые блоки.

    Блок – независимый компонент, который можно использовать повторно. В HTML блоки представлены атрибутом class.

    Особенности:

    – Название блока характеризует смысл («что это?»).

    – Блок не должен влиять на свое окружение.

    – Не рекомендуется использовать селекторы по тегам или id.

    Элемент – дочерний элемент в блоке, который нельзя использовать отдельно от этого блока.

    Особенности:

    – Название блока характеризует смысл («что это?»).

    – Структура полного имени элемента соответствует схеме: имя-блока__имя-элемента. Имя элемента отделяется от имени блока двумя подчеркиваниями (__).

    .site-search {} /* Block */
    .site-search__field {} /* Element */
    .site-search--full {} /* Modifier */

    Модификатор – изменение стиля блока или модификатора.

    <form class="site-search  site-search--full">
        <input type="text" class="site-search__field">
        <input type="Submit" value="Search" class="site-search__button">
    </form>

    Міксіни або домішки дозволяють визначити стилі, які можуть бути використані повторно у будь-якому місці документа

    Міксіни можуть також приймати аргументи. Приклад такого міксіна:

    @mixin box-shadow($shadows...) {
      -moz-box-shadow: $shadows;
      -webkit-box-shadow: $shadows;
      box-shadow: $shadows;
    }
     
    .shadows {
      @include box-shadow(0px 4px 5px #666, 2px 6px 10px #999);
    }
    SASS/LESS підтримують умовні оператори – @if, @else if, @else. Це дозволяє здійснювати розгалуження, спираючись на умову, та повертає один із двох можливих результатів. Приклад використання:
    $type: monster;
    p {
      @if $type == ocean {
        color: blue;
      } @else if $type == matador {
        color: red;
      } @else if $type == monster {
        color: green;
      } @else {
        color: black;
      }
    }

    Преобразовать строку в массив можно функцией explode(string $separator, string $string, int $limit = PHP_INT_MAX)

    separator – разделитель, string – входная строка.
    Если аргумент limit является положительным, возвращаемый массив будет содержать максимум limit элементов, при этом последний элемент будет содержать остаток строки string. Если параметр limit отрицателен, то будут возвращены все компоненты, кроме последних -limit. Если limit равен нулю, то он расценивается как 1.

    Обратная функция (массив в строку) – implode(string $separator, array $array).

    <?php
    $pizza  = "кусок1 кусок2 кусок3 кусок4 кусок5 кусок6";
    $pieces = explode(" ", $pizza);
    echo $pieces[0]; // кусок1
    echo $pieces[1]; // кусок2
    ?>

    Еще одна функция преобразования строки в массив str_split(string $string, int $length = 1).

    string – входная строка.
    length – максимальная длина фрагмента.

    <?php
    $str = "Hello Friend";
    $arr1 = str_split($str);
    $arr2 = str_split($str, 3);
    //Результат
    Array
    (
        [0] => H
        [1] => e
        [2] => l
        [3] => l
        [4] => o
        [5] =>
        [6] => F
        [7] => r
        [8] => i
        [9] => e
        [10] => n
        [11] => d
    )
    Array
    (
        [0] => Hel
        [1] => lo
        [2] => Fri
        [3] => end
    )
    ?>

    PHP поддерживает три вида циклов:

    Цикл с предусловием (while)

    while (логическое_выражение)
    { 
      инструкция; 
    }

    Альтернативный синтаксис:

    while (логическое_выражение):
    инструкция;
    ...
    endwhile;

    Цикл с постусловием (do-while)

    do
    {
    тело_цикла;
    }
    while (логическое_выражение);

    Цикл со счетчиком (for)

    for (инициализирующие_команды; условие_цикла; команды_после_итерации) { тело_цикла; }

    Альтернативный синтаксис:

    for(инициализирующие_команды; условие_цикла; команды_после_итерации):
    операторы;
    endfor;

    Специальный цикл перебора массивов (foreach).

    foreach (массив as $ключ=&gt;$значение)
    команды;
     
    //например
    $arr = array(1, 2, 3, 4);
    foreach ($arr as &amp;$value) {
        $value = $value * 2;
    }
     
    // массив $arr сейчас таков: array(2, 4, 6, 8)

    При использовании циклов есть возможность использования операторов break и continue. Первый из них прерывает работу всего цикла, а второй – только текущей итерации.

    В PHP функция serialize() возвращает строковое представление любого значения, которое может быть сохранено в PHP.

    Обратная функция – unserialize() может использовать эту строку для восстановления исходного значения переменной. Использование сериализации для сохранения объекта сохранит все его переменные. Методы в объекте не будут сохранены, только имя класса.

    Сериализация PHP позволяет хранить массив или объект в текстовой форме. При назначении массивов таким вещам, как $_SESSION, он позволяет PHP хранить его в текстовом файле, а затем воссоздавать его позже. Сериализация используется для объектов и переменных.

    Сериализация в JavaScript – используют методы JSON.stringify() для преобразования объекта в строкую. Обратный метод – JSON.parse().

    Приклад, як вибрати назви сторінок у WP сортуванням за спаданням –
    SELECT post_title FROM wp_posts WHERE post_type = ‘page’ order by post_title desc;

    CHAR: представляє рядок фіксованої довжини. Довжина рядка, що зберігається, вказується в дужках, наприклад, CHAR(10) – рядок з десяти символів. І якщо в таблицю в даний стовпець зберігається рядок з 6 символів (тобто менше встановленої довжини 10 символів), то рядок доповнюється 4 пробілами і в результаті все одно займатиме 10 символівТип CHAR може зберігати до 255 байт.

    VARCHAR: представляє рядок змінної довжини. Довжина рядка, що зберігається, також вказуються в дужках, наприклад, VARCHAR(10). Однак на відміну від CHAR рядок, що зберігається, займатиме саме стільки місця, скільки необхідно. Наприклад, якщо певна довжина в 10 символів, але в стовпець зберігається рядок у 6 символів, то рядок, що зберігається, так і займатиме 6 символів плюс додатковий байт, який зберігає довжину рядка.Усього тип VARCHAR може зберігати до 65 535 байт.

    Приєднання (JOIN) таблиць у запитах – це базовий інструмент для роботи з базами даних. Бувають внутрішні або зовнішні:

    INNER JOIN

    Таке приєднання покаже нам дані з таблиць, лише якщо умова зв’язування дотримується.

    SELECT id_person, name, id_pos, title 
    FROM `persons` 
    INNER JOIN `positions` ON id_pos = position_ref

    LEFT OUTER JOIN або RIGHT OUTER JOIN

    Зовнішнє приєднання включає результати запиту INNER і додаються «невикористані» рядки з однієї з таблиць. Яку таблицю використовувати як “добавку” – вказує токен LEFT або RIGHT.

    SELECT id_person, name, id_pos, title 
    FROM `persons` 
    LEFT OUTER JOIN `positions` ON id_pos = position_ref
    SELECT id_person, name, id_pos, title 
    FROM persons 
    RIGHT OUTER JOIN positions ON id_pos = position_ref

    Повне об’єднання через UNION LEFT та RIGHT

    (SELECT id_person, name, id_pos, title 
    FROM persons 
    LEFT OUTER JOIN positions ON id_pos = position_ref)
     
    UNION
     
    (SELECT id_person, name, id_pos, title 
    FROM persons 
    RIGHT OUTER JOIN positions ON id_pos = position_ref)

    Хуки (крючки) – пользовательские функции, основной механизм связи между ядром WordPress, плагинами и темами.

    Размещаются либо в плагинах, либо в function.php темы.

    Есть два типа хуков:
    Фильтр (filter) – изменяет значение переменной — получает значение и возвращает его (изменённое или нет).
    Событие (action) – Запускает произвольный код — колбэк функция прикрепленный к хуку сработает в момент срабатывания хука в коде.

    Работают функции совершенно одинаково. Разница заключается только в логике работы. Фильтры перехватывают события выполняют какие либо действия и возвращают его назад. События же работаю также, только выполняют определенное действие но ни чего не возвращают. В двух словах, действия запускают какой-нибудь код, а фильтры — изменяют переменные.

    add_action( 'save_post', 'notify_administrator', 10, 3 );
     
    function notify_administrator( $post_id, WP_Post $post, $update ) {
    	// Really important code here ... 
     
    	wp_mail( $admin_email, $subject, $message );
    }
     
    add_filter( 'post_class', 'modify_post_classes', 10, 3 );
     
    function modify_post_classes( $classes, $class, $post_id ) {
    	if ( in_array( get_post_type( $post_id ), [ 'review', 'service' ] ) ) {
    		$classes[] = 'dark-theme';
    	}
     
    	return $classes;
    }

    Базовий набір WordPress включає 12 таблиць:

    • wp_options: проста та самостійна, у текстових option_value у вільній формі зберігаються налаштування WordPress, параметри консолі, плагінів;
    • wp_users: зареєстровані користувачі, логіни, хеш паролів та інше, пов’язана через user_id з іншими таблицями;
    • wp_usermeta: проста, підпорядкована wp_users. Зберігає в текстових meta_value у вільній формі метадані зареєстрованих користувачів, персональні налаштування, дані профілю, колірна схема, контактні дані, біографія, нікнейм та інші;
    • wp_posts: зберігає весь змістовий контент (всі пости, сторінки, коригування та кастомні типи постів) у текстовому post_content і його головні атрибути (автора, тип, статус, mime та інше), пов’язана через post_id з іншими таблицями;
    • wp_postmeta: зберігає різні метадані про контент за довільними текстовими ключами meta_key у текстовому meta_value у вільній формі, інформацію про прикріплені файли (зображення, документи, відео), дані заповнюваних полів при створенні або редагуванні записів, використовується плагінами;
    • wp_terms: зберігає терміни та їх UTF-8 уявлення, які служать категоріями, мітками та іншими термінами користувальницьких таксономій;
    • wp_termmeta: метадані термінів, які використовуються лише плагінами;
    • wp_term_relationships: зберігає зв’язки категорій та тегів таблиці wp_terms і цей зв’язок тут підтримується. Як приклад, ця таблиця допомагає WordPress прикріпити пост X до категорії Y;
    • wp_term_taxonomy: берігає таксономії (категорії, теги) для записів у таблиці wp_terms та встановлюється черговість та вкладеність категорій;
    • wp_comments: коментарі та основні дані (ім’я автора, еМейл, IP, браузер);
    • wp_commentmeta: метадані коментарів, використовується плагінами;
    • wp_links: застаріла та використовується рідкісними плагінами для внутрішнього менеджменту посилань.

    Ця внутрішня таблиця пов’язує таблицю wp_posts з таблицею wp_term_taxonomy. Щоб зв’язати ці таблиці, WordPress створює запис у таблиці wp_term_relationships. Цей запис містить два посилання: на ідентифікатор посту (post_id) у полі object_id та ідентифікатор терму (term_id) у полі term_taxonomy_id.

    FIELD TYPE LENGTH NOT NULL COMMENT
    object_id bigint 20 + Містить ID запису (значення поля ID таблиці wp_posts). Якщо включена підтримка посилань, також міститиме ID посилання з таблиці wp_links
    term_taxonomy_id bigint 20 + Містить значення того ж поля з таблиці wp_term_taxonomy
    term_order int 11 + Містить порядок, у якому були зазначені терміни, при прикріпленні їх до запису. Наприклад, при редагуванні запису ми вказали їй 2 рубрики та 3 мітки, ось у якому порядку їх бачимо (вони передалися в POST запиті), такі значення сюди будуть записані: 1, 2 для рубрик, і 1, 2, 3 для міток. За замовчуванням ця функція вимкнена для всіх вбудованих таксономій (поле містить 0). Щоб її увімкнути, потрібно вказати параметр sort при реєстрації таксономії, див. register_taxonomy()

    Стандарт ECMAScript визначає 8 типів:Стандарт ECMAScript визначає 8 типів:

    • Undefined (Неопределённый тип) : typeof instance === “undefined”
    • Boolean (Булев, Логический тип) : typeof instance === “boolean”
    • Number (Число) : typeof instance === “number”
    • String (Строка) : typeof instance === “string”
    • BigInt : typeof instance === “bigint”
    • Symbol (в ECMAScript 6) : typeof instance === “symbol”

    Null (Null тип ) : typeof instance === “object”. Специальный примитив, используемый не только для данных но и в качестве указателя на финальную точку в Цепочке Прототипов;

    Object (Объект) : typeof instance === “object”. Простая структура, используемая не только для хранения данных, но и для создания других структур, где любая структура создаётся с использованием ключевого слова new: new Object, new Array, new Map (en-US), new Set, new WeakMap, new WeakSet, new Date и множество других структур.

    Массив – это особый тип объекта, предназначенный для работы с упорядоченным набором элементов.

    Что такое undefined?

    undefined обычно означает, что переменная объявлена, но не имеет присвоенного значения.

    Что такое null?

    null имеет две особенности, которые надо себе подчеркнуть:

    – null показывает, что переменная пустая;

    – null должен быть явно присвоен.

    Сравнение null и undefined

    Не строгое сравнение дает true.

    Cтрогое сравнение дает false.

    Головна відмінність var і let у тому, як вони працюють із областями видимості. Змінна var, створена поза функцією, діє як глобальна змінна – вона доступна з будь-якої частини скрипта.

    Значення змінної, оголошеної за допомогою const, не можна перепризначити.

    Доступ до змінних let або const до їх оголошення буде викликати ReferenceError. На відміну від var, яка підіймається нагору області видимості. Відбувається спливання (хойстінг) змінної.

    Об’єкт, прописаний з оператором const, не може бути оновлений, а властивості цього об’єкта оновлювати можна.

    Иншими словами, ми можемо маніпулювати властивостями без ніяких перешкод.

    This — это ссылка на контекст исполнения функции. Таким образом, что this тесно связан именно с функциями и рассматривается относительно них. Вне функции this будет ссылаться на глобальный контекст.

    Если вы попытаетесь обратиться к ключевому слову this в глобальной области видимости, оно будет привязано к глобальному контексту, то есть — к объекту window в браузере. Но при ‘use strict’ в глобальной области видимости this всегда будет undefined, а не window.

    Особенности стрелочных функций

    Стрелочная функция не имеет своего контекста, она связывается с лексическим окружением, то есть функцией, внутри которой определена стрелочная функция. Именно функция верхнего уровня задаёт контекст стрелочной функции. И это поведение нельзя изменить с помощью функций call или bind.

    Использование this внутри объекта

    Когда this используется внутри объекта, это ключевое слово ссылается на сам объект.

    Асинхронный код в JavaScript может быть написан разными способами: с помощью обратных вызовов, promise (обещаний) и ключевых слов async/await.

    Promise (промисы, обещания) – это специальный объект и набор методов в JavaScript для удобного написания асинхронного кода.

    Создание промиса

    C помощью конструктора new Promise()

    const promise = new Promise((resolve, reject) =&gt; {
      // асинхронный код
    });

    Конструктор промиса принимает 2 аргумента, которые являются функциями. Первый аргумент обычно называют resolve, а второй – reject. Внутрь промиса помещают асинхронный код, можно конечно и синхронный, но тогда в этом не будет смысла. Промис завершает своё выполнение, когда вызывается функция resolve() или reject().

    Функцию resolve() вызывают обычно в том месте кода, в котором асинхронная операция должна завершиться успешно. А функцию reject() – там, где она должна завершиться с ошибкой.

    Цепочка промисов

    Цепочка промисов – это простая концепция, в основу которой положено то, что методы промисов тоже в качестве результата возвращают промис. А так как они возвращают промис, то мы для них в свою очередь тоже можем вызвать методы и т.д. Таким образом, мы можем создавать цепочку из промисов, каждый из которых выполняется только после того как завершился предыдущий.

    const promise = new Promise(resolve =&gt; {
      setTimeout(() =&gt; resolve(2), 3000);
    });
     
    promise
      .then(value =&gt; {
        console.log(value);
        return new Promise(resolve =&gt; {
          setTimeout(() =&gt; resolve(value * 2), 3000);
        });
      })
      .then(value =&gt; {
        console.log(value);
        return new Promise(resolve =&gt; {
          setTimeout(() =&gt; resolve(value * 2), 3000);
        });
      })
      .then(value =&gt; console.log(value))
    //2
    //4
    //8

    Методы промисов

    then – выполняется, когда промис завершился успешно (после вызова функции resolve());

    catch – вызывается, если промис завершается ошибкой (после вызова reject());

    finally – выполняется в любом случае после завершения промиса, вне зависимости от конечного состояния.

    Promice.all() и Promise.race()

    статические методы Promice, которые принимают на вход массив промисов и возвращают новый промис. В случае с Promice.all() промис завершится когда завершатся все промисы в массиве.

    const promise1 = new Promise(resolve =&gt; setTimeout(resolve, 1000, 'one'));
    const promise2 = new Promise(resolve =&gt; setTimeout(resolve, 2000, 'two'));
    const promise3 = new Promise(resolve =&gt; setTimeout(resolve, 3000, 'three'));
     
    Promise.all([promise1, promise2, promise3]).then(value =&gt; console.log(value)); // ['one', 'two', 'three']

    При использовании Promise.race() промис завершится, как только выполнится первый промис из массива.

    const promise1 = new Promise(resolve =&gt; setTimeout(resolve, 1000, 'one'));
    const promise2 = new Promise(resolve =&gt; setTimeout(resolve, 2000, 'two'));
    const promise3 = new Promise(resolve =&gt; setTimeout(resolve, 3000, 'three'));
     
    Promise.race([promise1, promise2, promise3]).then(value =&gt; console.log(value)); // 'one'

    Async/await

    Cпециальный синтаксис для работы с промисами

    Ключевое слово async перед функцией гарантирует, что эта функция в любом случае вернёт промис.

    Ключевое слово await заставит интерпретатор JavaScript ждать до тех пор, пока промис справа от await не выполнится. После чего оно вернёт его результат, и выполнение кода продолжится.

    const getCountries = async (currencyCode) =&gt; {
        try {
          const response = await fetch(`https://restcountries.eu/rest/v2/currency/${currencyCode}`);
     
          return response.data.map(country =&gt; country.name);
        } catch (error) {
          throw new Error(`Unable to get countries that use ${currencyCode}`);
        }
    };

    Прототипы – это механизм, с помощью которого объекты JavaScript наследуют свойства друг от друга. Это обычный объект, хранящийся в специальном служебном поле [[prototype]].

    Git rebase (перебазування) – це один із двох інструментів Git для впровадження змін з однієї гілки до іншої. Такі самі можливості надає команда git merge (злиття). Операція злиття фіксує зміни, завжди рухаючись уперед з історії проекту, тоді як перебазування дозволяє ефективно її переписувати.

    Перебазування виконується насамперед задля забезпечення лінійної історії проекту.

    У стандартному режимі команда git rebase автоматично бере комміти з поточної робочої гілки та застосовує їх наприкінці переданої гілки. Приклад:

    git rebase master

    git pull – це шоткод для послідовності двох команд: git fetch (отримання змін із сервера) та git merge (зливання в локальну копію).

    При використанні fetch, git збирає всі комміти з цільової гілки, яких немає в поточній гілці, і зберігає їх у локальному репозиторії. Однак він не зливає їх у поточну гілку. Це особливо корисно, якщо вам потрібно постійно оновлювати свій репозиторій, але ви працюєте над функціональністю, неправильна реалізація якої може негативно вплинути на проект в цілому. Щоб злити комміти в основну гілку, необхідно використовувати merge.

    Коментарі читачів статті "Співбесіда на позицію WordPress розробник (full stack)"

    Немає коментарів.

    Залишити відповідь

    Ваша e-mail адреса не оприлюднюватиметься.

    Цей сайт використовує Akismet для зменшення спаму. Дізнайтеся, як обробляються ваші дані коментарів.