PHP newbie | bukachuk
159 subscribers
1 photo
16 links
Канал о PHP, Linux, Mysql, Web

Youtube канал: https://www.youtube.com/@bukachuk_php

Друг друга не оскорбляем, не хулиганим!
Вопросы, пожелания оставляем в комментариях!
Download Telegram
⚡️ Самая главная ошибка начинающих разработчиков

Вы можете найти много историй, про ошибки начинающих, с кучей пунктов, но главный на деле в этом списке один.
И так, вы решили научиться программированию, открыли интернет, купили курс, смотрите Youtube, это неважно. Ответьте себе на один простой вопрос - сколько вы сделали проектов от начала до конца, пускай даже небольших?

Очень часто ответ здесь - ноль. В этом и есть главная проблема и ошибка, тк. чтобы научиться любому делу, пусть это лечить людей, водить машину, нужна практика и только практика. Причем много практики, как можно больше.

В ИТ как правило работает простое правило - гладко было на бумаге, да забыли про овраги. Вы смотрите видеоурок или читаете статью, вам вроде все ясно и понятно, но как только вы начинаете даже повторять тоже самое, а более того, пытаетесь сделать немного иначе, у вас возникают разные сложности. Причем это правило работает и для программистов со стажем, я вчера сидел в Jenkins настраивал деплой, и пол часа втыкал в экран, а на деле просто описался в названии переменной. Поэтому вам нужна практика и еще раз практика. Плюс ко всему программирование - это не только знание языка, это и быстрая печать на клавиатуре, умение читать ошибки на английском языке, умение правильно искать ответ на свой вопрос в Google и еще много все, и все эти навыки вместе вы получите только практикой. Плюс само гугление проблемы и чтение форумов наполняет вас теории само по себе.

Что же в итоге делать?

Берете любую понравившуюся идею, тут не стоит утопать в думках на несколько дней, тк это не сильно важно. Самые простые варианты: блог статей, доска объявлений, доска объявлений автомобилей, доска объявлений недвижимости.

Последние примеры по мне так вообще идеальные, тк там прорабатываются основные моменты веб программирования, плюс много разных полей характеристик объекта итд. Далее берете любой первый попавшийся дизайн шаблон и начинаете делать. Долго упорно и нудно, не отвлекаясь на разные медиа итд.

Не гнаться за перфекционизмом

Не надо переживать на начальном этапе, что вы сделаете что-то не так, тк всем на это будет пофиг. Вам нужно просто любыми силами и способами сделать рабочий сайт, который будет предоставлять какой-то функционал.

Его желательно максимально упростить, то есть не пытаться на коленках сделать убийцу VK тк это будет утопия и вы быстро выгорите. Далее делаете проект, в идеале находите на раз наставника, он посмотрит код, даст рекомендации.

Далее берете сдедующий проект и делаете его уже лучше и сложнее, пусть с вкраплениями ООП и composer. Следующий шаг тоже самое на фреймворке.
⚡️ Вопрос с собеседования на PHP разработчика.

Что будет выводом программы?

$id = 4;
if ($id = 2) $id = 3;
echo $id;

Ответ будет позже в комментариях, можете ответить сами, только не запускать код)
Декомпозиция задач

Декомпозиция задач — это процесс их разделения на отдельные небольшие шаги (подзадачи). Делается это прежде всего для упрощения процесса разработки и контроля выполненных задач.

Например вам нужно сделать регистрацию пользователя, авторизацию и выход из системы и страницу редактирования его профиля. Вы можете это сделать в один приход, но проблема здесь во первых возникает в процессе оценки сроков задачи плюс как правило такой pull реквест (запрос на внесение изменений в ветку master/main) будет содержать в себе много изменений, что усложнит процесс review кода (когда ваш код смотрит и проверяет другой программист) как для ревьюера (вашего тим лида например), так и для исполнителя, тк правок может быть после ревью много и не одна итерация.

Поэтому эту задачу можно разбить на подзадачи.

1. Делаем регистрацию
2. Делаем авторизацию пользователя и выход
3. Делаем страницу редактирования профиля пользователя

Плюс данный подходят позволяет минимализировать шансы "все сломать", тк небольшие куски кода легче контролировать. Вы можете даже пушить в репозиторий код, который не будет вообще запускаться на проде и это вполне себе нормально,

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

Кто должен делать декомпозицию?

Декомпозицией задачи занимаются специалисты по проектному управлению, аналитики, а также менеджеры проектов. Этот процесс также могут выполнять разработчики программного обеспечения и инженеры (то есть вы) или ваш тимлид, когда речь идет о технических проектах
Присваивание в if условии

Допустим есть такой код:

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 по миру. Почему так много старых версий? Все просто, многим компаниям, особенно с историей, достаточно дорого и сложно сменить версию на следующую и чем выше разрыв между версиями, тем труднее. В продуктовой разработке это может занять вплоть до года, а то и больше, если такая цель поставлена. Если версия 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
Нюансы использование ссылок в циклах

Допустим есть такой код (к каждому элементы массива прибавляем 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, тк здесь идет ссылка на последний элемент массива, а не его значение
Используйте единый стиль кодирования

Использование единого стиля кодирования во всей кодовой базе облегчает чтение и понимание.

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/
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Многобайтовые функции (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
Различия между 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. Но оно гарантирует, что файл будет включен только один раз. Если файл уже был включен, он не включает его снова.