Данфа

Под капотом PHP: Как текст превращается в веб-страницу

PHP
Для большинства разработчиков написание кода на PHP выглядит магически просто. Вы создаете файл "index.php", пишете там пару строк, нажимаете «Обновить» в браузере — и результат перед глазами.

Эта простота обманчива. Она создает иллюзию того, что PHP — это медленный интерпретатор, который читает ваш код сверху вниз, как стихотворение, спотыкаясь о каждую запятую. На самом деле современный PHP (версии 7 и 8) устроен гораздо сложнее и ближе к таким языкам, как Java или C#, чем к старым скриптовым технологиям.

Давайте разберем путь вашего кода от нажатия клавиши Enter до появления пикселей на мониторе пользователя.

Этап 1. Лексический анализ (Токенизация)


Когда сервер получает запрос к .php файлу, управление берет Zend Engine — сердце языка. Но процессор компьютера не понимает команды типа $user = 'Alex';. Сначала работает лексер (Lexer, утилита re2c). Он сканирует ваш текстовый файл и разбивает его на токены — элементарные кирпичики языка:
  • Открывающий тег <?php.
  • Переменная $user.
  • Оператор при
...

Как обновить старый синтаксис PHP-обработчиков (Стрелочные функции)

PHP
В старых PHP-проектах (Особенно в движках форумов и CMS, написанных в 2010‑х) часто встречается однотипный шаблон: обработка BBCode через preg_replace_callback с обычными анонимными функциями, где для доступа к $this приходится использовать конструкцию use($this).

Такой код рабочий, но визуально тяжёлый и избыточный. Современный PHP (начиная с версии 7.4) позволяет сделать его чище, лаконичнее и удобнее в поддержке — за счёт стрелочных функций.

Что было раньше: Классический синтаксис


Типичный старый вариант выглядит так:
$text = preg_replace_callback(
    '/\[url(.*?)\](.*?)\[\/url\]/is',
    function($match) use ($this) {
        return $this->_link($match[1], $match[2]);
    },
$text);

Здесь три «лишних» элемента:
  1. Ключевое слово function — многословно.
  2. Явное указание use ($this) — избыточно, потому что $this нужен почти всегда.
  3. Фигурные скобки и оператор return — занимают строки, не добавляя смысла.

Это не ошибка, но в проектах с десятками подобных обработчиков такой стиль делает...

Kotlin: Как вывести данные для проверки

При написании приложения может потребоваться проверить данные, как они были обработаны. Для этого, за частую, достаточно их просто увидеть. В этом нам поможет класс Gson. Чтобы его использовать, необходимо импортировать:
import android.util.Log

Если, по каким то причинам его у вас до сих пор нет, добавляем в "build.gradle.kts":
implementation("com.google.code.gson:gson:xx.xx.xx")

  • xx.xx.xx: Указывайте актуальную версию.

После чего, если потребуется, пересоберите проект. И выводите нужные данные так:
Gson().toJson(data)

В лог выводим так:
Log.d("Data", Gson().toJson(data))

Импорт логирования:
import android.util.Log

В логе увидите строку с данными.

...

SQL: Как создать индекс

SQL
Сразу к примеру! Индекс создаётся при помощи запроса:
CREATE INDEX имяИндекса ON имяТаблицы (имяПоля);

Например создаём индекс с названием userIndex, для поля userId, в таблице users:
CREATE INDEX userIndex ON users (userId);


...

Kotlin: Стандартные индикаторы загрузки

В Jetpack Compose есть несколько стандартных индикаторов загрузки:
  1. CircularProgressIndicator: Классический круговой индикатор.
  2. LinearProgressIndicator: Линейный индикатор.
  3. ActivityIndicator: Простой вращающийся индикатор.

Примеры их использования:
// Круговой индикатор
CircularProgressIndicator(
    modifier = Modifier
        .size(40.dp)
        .padding(16.dp),
    color = MaterialTheme.colorScheme.primary
)

// Линейный индикатор
LinearProgressIndicator(
    progress = 0.5f, // значение от 0 до 1
    modifier = Modifier
        .height(4.dp)
        .fillMaxWidth()
        .padding(16.dp)
)

// Простой индикатор активности
ActivityIndicator(
    modifier = Modifier
        .size(40.dp)
        .padding(16.dp),
    color = MaterialTheme.colorScheme.primary
)


Дополнительные возможности настройки:
  • Изменение размера через модификатор size().
  • Настройка цвета через параметр color.
  • Анимация прогресса для LinearProgressIndicator.
  • Стилизация через темы Material
...