Декомпозиция задач
Декомпозиция задач — это процесс их разделения на отдельные небольшие шаги (подзадачи). Делается это прежде всего для упрощения процесса разработки и контроля выполненных задач.
Например вам нужно сделать регистрацию пользователя, авторизацию и выход из системы и страницу редактирования его профиля. Вы можете это сделать в один приход, но проблема здесь во первых возникает в процессе оценки сроков задачи плюс как правило такой pull реквест (запрос на внесение изменений в ветку master/main) будет содержать в себе много изменений, что усложнит процесс review кода (когда ваш код смотрит и проверяет другой программист) как для ревьюера (вашего тим лида например), так и для исполнителя, тк правок может быть после ревью много и не одна итерация.
Поэтому эту задачу можно разбить на подзадачи.
1. Делаем регистрацию
2. Делаем авторизацию пользователя и выход
3. Делаем страницу редактирования профиля пользователя
Плюс данный подходят позволяет минимализировать шансы "все сломать", тк небольшие куски кода легче контролировать. Вы можете даже пушить в репозиторий код, который не будет вообще запускаться на проде и это вполне себе нормально,
главное, чтобы текущая функциональность не была нарушена. В конечном счете вы можете разработать все компоненты модуля и только потом уже подключить его к текущей системе и провести полноценное тестирование всех компонетов вместе.
Кто должен делать декомпозицию?
Декомпозицией задачи занимаются специалисты по проектному управлению, аналитики, а также менеджеры проектов. Этот процесс также могут выполнять разработчики программного обеспечения и инженеры (то есть вы) или ваш тимлид, когда речь идет о технических проектах
Декомпозиция задач — это процесс их разделения на отдельные небольшие шаги (подзадачи). Делается это прежде всего для упрощения процесса разработки и контроля выполненных задач.
Например вам нужно сделать регистрацию пользователя, авторизацию и выход из системы и страницу редактирования его профиля. Вы можете это сделать в один приход, но проблема здесь во первых возникает в процессе оценки сроков задачи плюс как правило такой pull реквест (запрос на внесение изменений в ветку master/main) будет содержать в себе много изменений, что усложнит процесс review кода (когда ваш код смотрит и проверяет другой программист) как для ревьюера (вашего тим лида например), так и для исполнителя, тк правок может быть после ревью много и не одна итерация.
Поэтому эту задачу можно разбить на подзадачи.
1. Делаем регистрацию
2. Делаем авторизацию пользователя и выход
3. Делаем страницу редактирования профиля пользователя
Плюс данный подходят позволяет минимализировать шансы "все сломать", тк небольшие куски кода легче контролировать. Вы можете даже пушить в репозиторий код, который не будет вообще запускаться на проде и это вполне себе нормально,
главное, чтобы текущая функциональность не была нарушена. В конечном счете вы можете разработать все компоненты модуля и только потом уже подключить его к текущей системе и провести полноценное тестирование всех компонетов вместе.
Кто должен делать декомпозицию?
Декомпозицией задачи занимаются специалисты по проектному управлению, аналитики, а также менеджеры проектов. Этот процесс также могут выполнять разработчики программного обеспечения и инженеры (то есть вы) или ваш тимлид, когда речь идет о технических проектах
Присваивание в if условии
Допустим есть такой код:
if ($request = $this->getRequest()) {
// здесь какая-то логика
}
Это называется присваивание под условием, альтернатива такому коду
$request = $this->getRequest();
if ($request) {
// здесь какая-то логика
}
Такая практика считается не самой лучшей, хотя это вопрос спорный. Тк первый вариант позволяет немного сократить код на одну строку и когда таких условий много, это становится весомым.
Какие минусы данного подхода:
1. Присваивание в условии может сделать код трудным для чтения и понимания. Читателю кода будет сложнее сразу понять, что происходит, поскольку переменные неявно изменяются в самом условии.
2. Легко случайно написать оператор присваивания = вместо оператора сравнения ==. Это приведет к логическим ошибкам, которые могут быть трудноуловимыми.
3. Присваивание внутри условия может привести к неожиданным побочным эффектам, так как переменная изменяет свое значение в месте, где это не ожидается. Это может затруднить отладку и понимание поведения программы.
Какой вариант выбирать - решать вам. Мне например эти аргументы против кажутся совсем притянутые, кроме наверное первого, тк ответ на них простой - читай код внимательно)
Допустим есть такой код:
if ($request = $this->getRequest()) {
// здесь какая-то логика
}
Это называется присваивание под условием, альтернатива такому коду
$request = $this->getRequest();
if ($request) {
// здесь какая-то логика
}
Такая практика считается не самой лучшей, хотя это вопрос спорный. Тк первый вариант позволяет немного сократить код на одну строку и когда таких условий много, это становится весомым.
Какие минусы данного подхода:
1. Присваивание в условии может сделать код трудным для чтения и понимания. Читателю кода будет сложнее сразу понять, что происходит, поскольку переменные неявно изменяются в самом условии.
2. Легко случайно написать оператор присваивания = вместо оператора сравнения ==. Это приведет к логическим ошибкам, которые могут быть трудноуловимыми.
3. Присваивание внутри условия может привести к неожиданным побочным эффектам, так как переменная изменяет свое значение в месте, где это не ожидается. Это может затруднить отладку и понимание поведения программы.
Какой вариант выбирать - решать вам. Мне например эти аргументы против кажутся совсем притянутые, кроме наверное первого, тк ответ на них простой - читай код внимательно)
⚡️Когда планируется выпуск PHP 8.4? ⚡️
Выпуск PHP 8.4 запланирован на 21 ноября 2024 года.
Что будет интересного (здесь конечно не полный список всех изменений):
1. Новый MyClass()->method() без скобок
Будет так (вокруг созданного объекта не нужны будут скобки)
$request = new Request()->withMethod('GET'));
Сейчас это так (скобки вокруг создания объекта и это действительно напрягает, кстати чтобы так можно было вызывать методы цепочкой, нужно в методе возвращать return $this):
$request = (new Request())->withMethod('GET');
2. Создать DateTime из временной метки Unix
$dateTime = DateTimeImmutable::createFromTimestamp(1718337072);
$dateTime->format('Y-m-d'); // 2024-06-14
3. Новые функции для работы с массивом
array_find($array, function (string $value)) - вторым аргументом будем передавать замыкание, которое ищет нужное и возвращает true если нашли
array_find_key($array, function (string $key)) - здесь аналогично, только искать будет ключ массива
array_any($array, function (string $value)) - будет проверять, что хотя бы один элемент соответствует условию проверки в замыкании, сама функция возвращает bool
array_all($array, function (string $value)) - здесь будет проверять, что все элементы соответствуют условию в замыкании (замыкание возращает bool), сама функция возвращает bool
4. Новые mb_ функции для работы с мультибайтовыми кодировками (то есть русские буквы например в UTF-8)
Проблема здесь возникает, что обычные trim и другие функции неправильно работают с UTF-8 и выдают ложные результаты, поэтому в PHP нужно использовать mb_ функции, но их список был не полный. Новые функции (их текущие аналоги без приставки mb_):
mb_trim
mb_ltrim
mb_rtrim
mb_ucfirst
mb_lcfirst
5. Хуки для свойств класса
Если упрощенно, то можно будет в классе определить хук на какое-либо свойство и присваивании этому значению, будет выполнена логика хука.
Сейчас без этого вам нужно пискать логику в сеттерах например:
public function setFullname(string $name, string $surname): void
{
$this->fullname = $name . ' ' . $surname;
$this->name = $name;
$this->surname = $surname;
}
Более подробно с примерами здесь:
https://wiki.php.net/rfc/property-hooks
Выпуск PHP 8.4 запланирован на 21 ноября 2024 года.
Что будет интересного (здесь конечно не полный список всех изменений):
1. Новый MyClass()->method() без скобок
Будет так (вокруг созданного объекта не нужны будут скобки)
$request = new Request()->withMethod('GET'));
Сейчас это так (скобки вокруг создания объекта и это действительно напрягает, кстати чтобы так можно было вызывать методы цепочкой, нужно в методе возвращать return $this):
$request = (new Request())->withMethod('GET');
2. Создать DateTime из временной метки Unix
$dateTime = DateTimeImmutable::createFromTimestamp(1718337072);
$dateTime->format('Y-m-d'); // 2024-06-14
3. Новые функции для работы с массивом
array_find($array, function (string $value)) - вторым аргументом будем передавать замыкание, которое ищет нужное и возвращает true если нашли
array_find_key($array, function (string $key)) - здесь аналогично, только искать будет ключ массива
array_any($array, function (string $value)) - будет проверять, что хотя бы один элемент соответствует условию проверки в замыкании, сама функция возвращает bool
array_all($array, function (string $value)) - здесь будет проверять, что все элементы соответствуют условию в замыкании (замыкание возращает bool), сама функция возвращает bool
4. Новые mb_ функции для работы с мультибайтовыми кодировками (то есть русские буквы например в UTF-8)
Проблема здесь возникает, что обычные trim и другие функции неправильно работают с UTF-8 и выдают ложные результаты, поэтому в PHP нужно использовать mb_ функции, но их список был не полный. Новые функции (их текущие аналоги без приставки mb_):
mb_trim
mb_ltrim
mb_rtrim
mb_ucfirst
mb_lcfirst
5. Хуки для свойств класса
Если упрощенно, то можно будет в классе определить хук на какое-либо свойство и присваивании этому значению, будет выполнена логика хука.
Сейчас без этого вам нужно пискать логику в сеттерах например:
public function setFullname(string $name, string $surname): void
{
$this->fullname = $name . ' ' . $surname;
$this->name = $name;
$this->surname = $surname;
}
Более подробно с примерами здесь:
https://wiki.php.net/rfc/property-hooks
Использование разных версий PHP по миру. Почему так много старых версий? Все просто, многим компаниям, особенно с историей, достаточно дорого и сложно сменить версию на следующую и чем выше разрыв между версиями, тем труднее. В продуктовой разработке это может занять вплоть до года, а то и больше, если такая цель поставлена. Если версия PHP в компании старая - это вовсе не значит, что в ней плохо с разработкой, это скорее значит, что компания давно на рынке и в кодовой базе достаточно легаси.
PHP умирает, зачем его изучать?
Это любимая байка в интернете, которой уже, наверное, более 15 лет. Я использую PHP более 20 лет, и все это время фоном была данная история, что вот-вот он умрет. На деле язык хорошо продвинулся в развитии, улучшилась производительность, поддержка ООП и т.д. Хороший толчок этой истории дал выход Ruby on Rails и Django на Питоне на рынок. Лет 10 назад каждая вторая статья в сети была о том, какой же PHP плохой, и что все должны переходить на рельсы.
В итоге где сейчас Ruby on Rails? Поэтому не нужно переживать, что вы выучите какую-то умирающую технологию, как PHP, так как он не умирает.
Даже если мы гипотетически представим, что завтра PHP начнет умирать, это тоже не проблема. Так как сама по себе backend-разработка состоит не только из языка программирования сегодня, это и очереди, базы данных, in-memory базы данных и многое другое. Поэтому перейти на другой backend-язык, если вы программируете уже пару лет на одном языке, будет несложно.
Исследование w3Techs на 2024 год показывает 76% использование PHP https://w3techs.com/technologies/overview/programming_language
Это любимая байка в интернете, которой уже, наверное, более 15 лет. Я использую PHP более 20 лет, и все это время фоном была данная история, что вот-вот он умрет. На деле язык хорошо продвинулся в развитии, улучшилась производительность, поддержка ООП и т.д. Хороший толчок этой истории дал выход Ruby on Rails и Django на Питоне на рынок. Лет 10 назад каждая вторая статья в сети была о том, какой же PHP плохой, и что все должны переходить на рельсы.
В итоге где сейчас Ruby on Rails? Поэтому не нужно переживать, что вы выучите какую-то умирающую технологию, как PHP, так как он не умирает.
Даже если мы гипотетически представим, что завтра PHP начнет умирать, это тоже не проблема. Так как сама по себе backend-разработка состоит не только из языка программирования сегодня, это и очереди, базы данных, in-memory базы данных и многое другое. Поэтому перейти на другой backend-язык, если вы программируете уже пару лет на одном языке, будет несложно.
Исследование w3Techs на 2024 год показывает 76% использование PHP https://w3techs.com/technologies/overview/programming_language
W3Techs
Usage Statistics and Market Share of Server-side Programming Languages for Websites, June 2025
What are the most popular server-side programming languages on the web
Нюансы использование ссылок в циклах
Допустим есть такой код (к каждому элементы массива прибавляем 1)
На выходе будет массив:
[2, 3, 4, 5, 6];
То есть при передаче по ссылке внутри foreach (знак амперсанта & перед $number) вы будете менять значение именно в массиве, а не новой переменной $number
После цикла стоит сделать unset($number); тк если вы это не сделаете, то при использовании $number снова, вы измените последний элемент массива
<?php
$numbers = [1, 2, 3, 4, 5];
foreach ($numbers as &$number) {
$number++;
}
unset($number); // Здесь стоит так делать, чтобы избежать повторное использование ссылки на последний элемент массива
$number = 10; // Здесь, если не будет unset, который выше, вы измените последний элемент массива numbers, и вместо 6 будет 10, тк здесь идет ссылка на последний элемент массива, а не его значение
Допустим есть такой код (к каждому элементы массива прибавляем 1)
На выходе будет массив:
[2, 3, 4, 5, 6];
То есть при передаче по ссылке внутри foreach (знак амперсанта & перед $number) вы будете менять значение именно в массиве, а не новой переменной $number
После цикла стоит сделать unset($number); тк если вы это не сделаете, то при использовании $number снова, вы измените последний элемент массива
<?php
$numbers = [1, 2, 3, 4, 5];
foreach ($numbers as &$number) {
$number++;
}
unset($number); // Здесь стоит так делать, чтобы избежать повторное использование ссылки на последний элемент массива
$number = 10; // Здесь, если не будет unset, который выше, вы измените последний элемент массива numbers, и вместо 6 будет 10, тк здесь идет ссылка на последний элемент массива, а не его значение
https://habr.com/ru/articles/832678/ у кого ютуб перестал с компьютера работать
Хабр
Замедление YouTube с технической стороны: ограничение и обход
Привет, Хабр! В последнее время замечаю огромное количество информации по поводу замедления Великого, но очень мало где видел конкретику о том, как именно это работает. Одно лишь отчаяние "мы все...
Используйте единый стиль кодирования
Использование единого стиля кодирования во всей кодовой базе облегчает чтение и понимание.
PHP имеет ряд стандартов кодирования, таких как PSR-1 и PSR-2, которые предоставляют набор рекомендаций по стилю кодирования для PHP, направленных на установление общего стандарта кодирования для проектов и разработчиков. Основные правила, предписанные PSR-2 (старая версия) и PSR-12 (обновленная), включают:
1. Отступы: в коде для отступов необходимо использовать 4 пробела, а не табуляции, что обеспечивает единообразное и читабельное форматирование кода.
2. Декларации пространства имен и использования: После декларации пространства имен и каждой группы операторов использования должна быть пустая строка.
3. Скобки классов и методов: Открывающая скобка для классов и методов должна быть на той же строке, а закрывающая скобка должна быть на новой строке. Методы и свойства внутри класса должны быть разделены пустой строкой.
4. Видимость методов: видимость методов (например, публичных, закрытых, защищенных) должна быть объявлена явно.
5. Закрывающая фигурная скобка управляющей структуры: Закрывающая фигурная скобка для управляющих структур (if, else, for, while и т. д.) должна находиться на той же строке, что и ключевое слово control.
6. Вызовы методов и функций: между именем метода или функции и открывающейся скобкой не должно быть пробела, а также не должно быть пробела перед закрывающейся скобкой.
7. Аргументы метода: В аргументах метода не должно быть пробелов перед открывающейся скобкой и после закрывающейся скобки. Также не должно быть пробелов после запятых в списках аргументов.
8. Объявление массива: Массивы должны объявляться с использованием короткого синтаксиса ([]), а не традиционного синтаксиса (array()).
9. Одинарные и двойные кавычки: строки могут быть заключены в одинарные или двойные кавычки, но выбранный стиль должен быть единообразным во всей кодовой базе.
10. Конкатенация: при конкатенации строк используйте пробел до и после оператора .
Соблюдение этих стандартов может помочь обеспечить единообразие вашего кода. Также вы можете подключить CS-Fixer как к своей IDE так и к хуку git перед commit который будет проверять это автоматически https://github.com/PHP-CS-Fixer/PHP-CS-Fixer
Официальная документация PSR-12 с примерами правильного оформления кода https://www.php-fig.org/psr/psr-12/
Использование единого стиля кодирования во всей кодовой базе облегчает чтение и понимание.
PHP имеет ряд стандартов кодирования, таких как PSR-1 и PSR-2, которые предоставляют набор рекомендаций по стилю кодирования для PHP, направленных на установление общего стандарта кодирования для проектов и разработчиков. Основные правила, предписанные PSR-2 (старая версия) и PSR-12 (обновленная), включают:
1. Отступы: в коде для отступов необходимо использовать 4 пробела, а не табуляции, что обеспечивает единообразное и читабельное форматирование кода.
2. Декларации пространства имен и использования: После декларации пространства имен и каждой группы операторов использования должна быть пустая строка.
3. Скобки классов и методов: Открывающая скобка для классов и методов должна быть на той же строке, а закрывающая скобка должна быть на новой строке. Методы и свойства внутри класса должны быть разделены пустой строкой.
4. Видимость методов: видимость методов (например, публичных, закрытых, защищенных) должна быть объявлена явно.
5. Закрывающая фигурная скобка управляющей структуры: Закрывающая фигурная скобка для управляющих структур (if, else, for, while и т. д.) должна находиться на той же строке, что и ключевое слово control.
6. Вызовы методов и функций: между именем метода или функции и открывающейся скобкой не должно быть пробела, а также не должно быть пробела перед закрывающейся скобкой.
7. Аргументы метода: В аргументах метода не должно быть пробелов перед открывающейся скобкой и после закрывающейся скобки. Также не должно быть пробелов после запятых в списках аргументов.
8. Объявление массива: Массивы должны объявляться с использованием короткого синтаксиса ([]), а не традиционного синтаксиса (array()).
9. Одинарные и двойные кавычки: строки могут быть заключены в одинарные или двойные кавычки, но выбранный стиль должен быть единообразным во всей кодовой базе.
10. Конкатенация: при конкатенации строк используйте пробел до и после оператора .
Соблюдение этих стандартов может помочь обеспечить единообразие вашего кода. Также вы можете подключить CS-Fixer как к своей IDE так и к хуку git перед commit который будет проверять это автоматически https://github.com/PHP-CS-Fixer/PHP-CS-Fixer
Официальная документация PSR-12 с примерами правильного оформления кода https://www.php-fig.org/psr/psr-12/
GitHub
GitHub - PHP-CS-Fixer/PHP-CS-Fixer: A tool to automatically fix PHP Coding Standards issues
A tool to automatically fix PHP Coding Standards issues - PHP-CS-Fixer/PHP-CS-Fixer
Многобайтовые функции (mb функции) в PHP
Если вы начинающий разработчик PHP то вы можете столкнуться с тем, что в некоторых случаях функции для работы со строками работают неверно, например измеряя длину строки с помощью strlen вы будете получать неверное число букв. В PHP существует две категории функций для работы со строками: обычные функции (string функции) и многобайтовые функции (mb функции). Разница между ними связана с поддержкой многобайтовых символов, таких как символы UTF-8.
Обычные string функции
Пример: strlen(), strpos(), substr()
Особенности: Эти функции предполагают, что строка состоит из однобайтовых символов, что характерно для таких кодировок, как ISO-8859-1 или Windows-1251.
Ограничения: При работе с многобайтовыми строками (например, UTF-8), они могут работать некорректно, так как каждый многобайтовый символ будет считаться как несколько отдельных байтов. Например, функция strlen() вернет количество байтов, а не количество символов, то есть если вы захотите найти длину строки из русских букв, то результат будет неверный
mb функции (многоязычные функции)
Пример: mb_strlen(), mb_strpos(), mb_substr() - как правила для каждой строковой функции есть ее аналог с приставкой mb_
Особенности: Эти функции специально предназначены для работы с многобайтовыми строками, такими как строки в кодировке UTF-8. Они правильно обрабатывают символы, занимающие более одного байта.
Преимущества: Они позволяют корректно работать с текстом на различных языках, включая те, где символы могут занимать больше одного байта (например, японский, китайский).
Основные различия
Поддержка кодировок: mb функции поддерживают различные кодировки, включая UTF-8, и корректно обрабатывают многобайтовые символы (в том числе и русские строки).
Результаты работы: Обычные string функции могут возвращать неправильные результаты при работе с многобайтовыми строками, например, длина строки или позиция символа может быть рассчитана неверно. mb_ функции решают эту проблему.
Для работы с mb_ функциями должен быть установлен модуль mb к PHP, в Ubuntu и Debian например это будет пакет например php8.2-mbstring
Если вы начинающий разработчик PHP то вы можете столкнуться с тем, что в некоторых случаях функции для работы со строками работают неверно, например измеряя длину строки с помощью strlen вы будете получать неверное число букв. В PHP существует две категории функций для работы со строками: обычные функции (string функции) и многобайтовые функции (mb функции). Разница между ними связана с поддержкой многобайтовых символов, таких как символы UTF-8.
Обычные string функции
Пример: strlen(), strpos(), substr()
Особенности: Эти функции предполагают, что строка состоит из однобайтовых символов, что характерно для таких кодировок, как ISO-8859-1 или Windows-1251.
Ограничения: При работе с многобайтовыми строками (например, UTF-8), они могут работать некорректно, так как каждый многобайтовый символ будет считаться как несколько отдельных байтов. Например, функция strlen() вернет количество байтов, а не количество символов, то есть если вы захотите найти длину строки из русских букв, то результат будет неверный
mb функции (многоязычные функции)
Пример: mb_strlen(), mb_strpos(), mb_substr() - как правила для каждой строковой функции есть ее аналог с приставкой mb_
Особенности: Эти функции специально предназначены для работы с многобайтовыми строками, такими как строки в кодировке UTF-8. Они правильно обрабатывают символы, занимающие более одного байта.
Преимущества: Они позволяют корректно работать с текстом на различных языках, включая те, где символы могут занимать больше одного байта (например, японский, китайский).
Основные различия
Поддержка кодировок: mb функции поддерживают различные кодировки, включая UTF-8, и корректно обрабатывают многобайтовые символы (в том числе и русские строки).
Результаты работы: Обычные string функции могут возвращать неправильные результаты при работе с многобайтовыми строками, например, длина строки или позиция символа может быть рассчитана неверно. mb_ функции решают эту проблему.
Для работы с mb_ функциями должен быть установлен модуль mb к PHP, в Ubuntu и Debian например это будет пакет например php8.2-mbstring
Различия между include, require, include_once, require_once
PHP использует несколько методов для включения и выполнения файлов. Это происходит в другом PHP-скрипте. Сначала различия могут показаться незначительными. Тем не менее, нюансы отличают их.
include: Это выражение включает PHP файл. PHP ищет указанный файл. Если он не найден, PHP выдает предупреждение. Тем не менее, скрипт продолжит работу.
require: Есть сходство с include. Он включает PHP файл. Если PHP не находит файл, это фатально. Это приводит к ошибке. Затем выполнение прекращается - это главное отличие от include, про которое часто спрашивают на собеседованиях.
require_once: Это имеет сходство с оператором require. Однако, как и include_once, он обеспечивает только одно включение.
include_once: Это функционирует как include. Но оно гарантирует, что файл будет включен только один раз. Если файл уже был включен, он не включает его снова.
PHP использует несколько методов для включения и выполнения файлов. Это происходит в другом PHP-скрипте. Сначала различия могут показаться незначительными. Тем не менее, нюансы отличают их.
include: Это выражение включает PHP файл. PHP ищет указанный файл. Если он не найден, PHP выдает предупреждение. Тем не менее, скрипт продолжит работу.
require: Есть сходство с include. Он включает PHP файл. Если PHP не находит файл, это фатально. Это приводит к ошибке. Затем выполнение прекращается - это главное отличие от include, про которое часто спрашивают на собеседованиях.
require_once: Это имеет сходство с оператором require. Однако, как и include_once, он обеспечивает только одно включение.
include_once: Это функционирует как include. Но оно гарантирует, что файл будет включен только один раз. Если файл уже был включен, он не включает его снова.