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

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

Друг друга не оскорбляем, не хулиганим!
Вопросы, пожелания оставляем в комментариях!
Download Telegram
⚡️Когда планируется выпуск 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. Но оно гарантирует, что файл будет включен только один раз. Если файл уже был включен, он не включает его снова.