The Fly's PHP - Делаем из Мухи Слона – Telegram
The Fly's PHP - Делаем из Мухи Слона
424 subscribers
29 photos
1 video
64 links
Авторский блог Сергея Мухина

Чат: @fly_php_public

Сайт автора: https://sergeymukhin.com
Download Telegram
Вышел большой пост о дженериках в php, почему многие разработчики желают иметь их в инструментарии и возможно ли это в принципе в PHP?

https://sergeymukhin.com/blog/dzeneriki-v-php
PHP 8.3 будет выпущен как обычно в конце ноября 2023 года. Как обычно начинаю пост о новом функционале и устаревании. Итак первое что известно на данный момент:

unserialize(): Вывод E_WARNING ошибок вместо E_NOTICE

До версии PHP 8.3 передача недопустимой строки в функцию unserialize() выдавала всего лишь уведомления PHP ( E_NOTICE) в определенных случаях, например, при синтаксических ошибках в сериализованной строке. Начиная с PHP 8.3 выдается предупреждение E_WARNING. Кроме того, некоторые условия ошибки функции serialize() также изменяются, чтобы выдавать E_WARNING:

unserialize("invalid-string");

- PHP Notice: unserialize(): Error at offset 0 of 14 bytes //было
+ PHP Warning: unserialize(): Error at offset 0 of 14 bytes //стало

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

https://sergeymukhin.com/blog/chto-novogo-v-php-83
Новая функция json_validate

В PHP 8.3 будет добавлена ​​новая функция json_validate(), которая возвращает true или false в том случае, если заданная строка является допустимой строкой JSON. До PHP 8.3 единственным способом определить, является ли заданная строка допустимой строкой JSON, была попытка ее декодирования и проверка наличия каких-либо ошибок. Новая функция json_validate() использует тот же базовый синтаксический анализатор JSON, что и PHP, но потребует меньше памяти:

json_validate('[1, 2, 3]'); //true
json_validate('{1, 2, 3]'); //false
Ранее в обзоре новых функций PHP 8.2 я писал, что будут добавлены readonly классы (только для чтения),
на практике это означает, что все свойства этого класса будут доступны только для чтения. Это особенно полезно при использовании DTO или объектов-значений (Value Object), когда класс имеет только общедоступные свойства для чтения .

Другими словами, вместо того, чтобы писать это:

class PostDTO
{
public function __construct(
public readonly string $noscript,
public readonly Status $status,
public readonly ?DateTimeImmutable $published_at = null,
) {}
}


можно теперь писать:

readonly class PostDTO
{
public function __construct(
public string $noscript,
public Status $status,
public ?DateTimeImmutable $published_at = null,
) {}
}


более подробно можно почитать в новом посте https://sergeymukhin.com/blog/php-82-klassy-tolko-dlia-cteniia-readonly-classes
К концу недели накатал пост про одну из фишек PHP 8.2

true, false и null как самостоятельные типы

До версии PHP 8.2 можно было использовать null и только false только как части Union Types:
function foo(): string|null {}
function strpos(): int|false {}


class User extends Model 
{
/**
* @return false
*/
public function isAdmin(): bool
{
return false;
}
}


Начиная с PHP 8.2 можно писать так и не будет ошибок:

class User extends Model 
{
public function isAdmin(): false
{
return false;
}
}


false, true, null можно использовать как самостоятельный тип везде, где PHP принимает тип:

class Foo {

private true $processed;

private false $focused;

public function process(string|int|true $value): true {}

public function focus(int|false $value): false {}

}


Более подробно в посте
https://sergeymukhin.com/blog/php-82-true-false-i-null-kak-samostoiatelnye-tipy
Итак, релиз PHP 8.2 выпущен, об этом официально объявила команда разработчиков PHP https://www.php.net/archive/2022.php#2022-12-08-1.

Давайте быстро пробежимся по новым функциям:

- null и false как самостоятельные типы
- true как самостоятельный тип
- Классы только для чтения
- Новое расширение для генерации случайных чисел Random
- Типы DNF (дизъюнктивных нормальных форм)
- Константы в трейтах
- Новые функции openssl_cipher_key_length и openssl_cipher_key_length
- Новая функция curl_upkeep
- Новая функция ini_parse_quantity
- Новая функция memory_reset_peak_usage
- Получение свойств перечислений в константных выражениях
- Устаревшие динамические свойства
- Редактирование параметров в бэк трейсах
- Изменения типа возвращаемого значения для DateTime
- str_split возвращает пустые массивы для пустых строк
- ksort(..., SORT_REGULAR) изменения порядка сортировки
- Устаревание utf8_encode() и utf8_decode()
- Устаревшие частично поддерживаемые вызываемые объекты
- Нечувствительный к локали strtolower() и strtoupper()
- Изменения подписи для нескольких методов SPL
- Новый модификатор "n" в PCRE
- Экранирование имени пользователя и пароля ODBC
- Устаревшая ${} интерполяция строк
- MySQLi больше не может быть скомпилирован с libmysqli

Более подробно можно почитать в статье https://sergeymukhin.com/blog/chto-novogo-v-php-82
Forwarded from Пых (Валентин Удальцов)
🔴 Начинаем стрим по PHP 8.2!

Подключайтесь и встречайте новый PHP вместе с нами!

https://youtu.be/cXdJxa2gxgo

Картинка из поста в светлом и тёмном вариантах!
У нас тут начинают подъезжать новые утвержденные rfc по PHP 8.3. Один из них:

Функция gc_status() будет возвращать дополнительную информацию и Garbage Collector

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

var_dump(gc_status());

array(4) {
["runs"]=>
int(0)
["collected"]=>
int(0)
["threshold"]=>
int(10001)
["roots"]=>
int(6)
}


На данный момент функция gc_status возвращает массив с четырьмя ключами:

runs - Количество запусков сборщика мусора.
collected - Количество собранных объектов.
threshold - Количество roots в буфере, которое вызовет сборку мусора.
roots - Текущее количество roots в буфере.

В PHP 8.3 функция возвращает четыре дополнительных поля:

running - true если сборщик мусора запущен, в противном случае false .
protected - true если сборщик мусора защищен и добавление root запрещено, в противном случае false
full - true если размер буфера сборщика мусора превышает GC_MAX_BUF_SIZE. В настоящее время установлено значение 0x40000000(= 1024³.)
buffer_size - Текущий размер буфера сборщика мусора.
👍3
PHP 8.3: Динамическое получение констант класса и Enum

Итак, PHP 8.3 позволит написать вот такой код:

class Invoice {
public const STATUS_COMPLETE = "complete";
}

$constName = "STATUS_COMPLETE";

echo Invoice::{$constName}; //"complete"


И ничего не сломается, а как вы помните раньше динамически получить доступ к константе можно было только через:

echo \constant("MyClass::$constName");


Теперь в PHP 8.3 код будет валиден и выполняться как ожидается.

Более подробно в новом посте https://sergeymukhin.com/blog/php-83-dinamiceskoe-poluchenie-konstant-klassa-i-enum
Хей здорово гайз!

Хочу поделиться с вами, что ежедневный траффик моего блога на сайте ~200 человек, не считая одноразовых всплесков в 600-1000 человек из тематических каналов телеграма, типа Laravel и др.

Но я хочу довести эту цифру до 1000, это в идеале конечно, но хотя бы до 500 уников в день, увеличив текущую аудиторию в 2 раза (это на сайте, в канале мы пока уютно сидим в 21 человек))
Так вот как показывает практика 1 статья в месяц или даже в два не способствует выполнению этого плана, поэтому я решил немного сменить стратегию, ну может и себя немного подстегнуть в написании текстов, так вот хочу попробовать писать чаще, как минимум статью в неделю, а лучше наверное две.

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

Поэтому завершаю эту неделю статьей о функции array_merge_recursive, чуть ниже, а от вас жду комментариев, хоть в канале к посту, хоть на сайте в статье
https://sergeymukhin.com/blog/funkciia-array-merge-recursive-v-php

Всем хороших выходных!
Обычно 8 марта не пишу каких-либо постов, это либо общие праздники типа нового года (хотя в этом году тоже забегался и не написал пост), либо тот же день разработчика,

Но как минимум в наших рядах есть одна девушка @YuliaYgorevna и я думаю нам не сложно от всего мужского коллектива нашего канала поздравить ее (а если есть ещё и другие подписчики-девушки, то и их тоже) с этим прекрасным днём, и пожелать чистого неба над головой, и всегда дарить своим близким лучи радости и красоты!

Все отдыхают в праздник или кто-то работает?)

Я например все пытаюсь добить пост с внятным объяснением генераторов с yield. Надеюсь скоро опубликую. 😀
👍2🔥1
Какой он PHP в 2023 году?

Наверное ежегодный пост о том, стоит ли изучать PHP в новом 2023 году будет не совсем актуален для тех, кто уже давно работает с PHP. А скорее полезен для новичков, кто только собирается "Войти в айти", но может кто-то что-то и почерпнет из него)

Начнем пожалуй с PHP Foundation, прошло чуть более года с момента создания фонда, на текущий момент коллектив состоит из 10 волонтеров и 6 разработчиков, которым платят за работу над языком PHP. Можно твердо сделать выводы, что PHP Foundation - одно из лучших событий, произошедших с PHP за долговое время, и можно надеяться что в 2023 году они смогут улучшить язык еще больше.

Далее перейдем к последней версии языка на сегодняшний момент PHP 8.2. Хоть он и является наименее запоминающимся релизом, но тем не менее имеет множество приятных функций, напомню про пару интересных штук:

- Классы только для чтения
- Совершенно новый рандомизатор
- Самостоятельные типы null, true и false
- Типы дизъюнктивных нормальных форм
- Возможность редактировать параметры

Стоит упомянуть что менеджер пакетов PHP - Packagist сейчас содержит 361 000 пакетов, что на 60 000 больше, чем в прошлом году.
Поскольку мы заговорили об экосистеме, нельзя не упомянуть два крупнейших PHP-фреймворка на сегодняшний день: Laravel и Symfony. Хоть ваш покорный слуга любит и использует в большинстве своих проектов более специфический фреймворк Phalcon, я не могу не отдать должное тому как за последние годы значительно вырос Laravel.

Ну и напоследок можно пофантазировать о будущем развитии языка, например, многие функции, такие как дженерики, не могут быть реализованы в PHP, пока он поддерживает runtime-проверки типов, есть предложения сделать некое надмножество PHP с поддержкой IDE и статического анализатора. То есть этакой аналог Typenoscript. Вы могли слышать об этом, например тот же PXP, который может пойти в интересном для разработчиков направлений.

более подробная статистика в новом посте https://sergeymukhin.com/blog/php-v-2023-godu
👍3
Всех с праздником веб-мастера! Поменьше багов, лагов и пр. проблем, совсем без них жить не получится)

Сегодня в день праздника поговорим немного о психологии, а именно о синдроме самозванца.

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

Среди разработчиков/айтишников/программистов данный синдром достаточно распространенное явление. По некоторым источникам, которые мне попадались, себя недооценивают более 60% активных людей.

Синдром самозванца можно разделить на пять (иногда в других областях выделяют и больше типов) основных типов:

- Перфекционист
- Эксперт
- Природный гений
- Солист
- Суперчеловек

Некоторые общие характеристики синдрома самозванца включают в себя:

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

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

Чтобы избавиться от синдрома самозванца, полезно начать задавать себе несколько трудных вопросов. Вот некоторые из них:

Какие основные убеждения я придерживаюсь о себе?
Верю ли я, что достоин быть таким какой я есть?
Должен ли я быть совершеннее, чтобы другие одобряли меня?

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

более подробно в статье https://sergeymukhin.com/blog/s-prazdnikom-404
👍1
Из новых RFC PHP 8.3: Поправки для классов и свойств только для чтения из https://wiki.php.net/rfc/readonly_amendments

В этом RFC было предложено два изменения, но было принято только одно: возможность повторной инициализации свойств только для чтения во время клонирования. Правда этот RFC касается только конкретного (но важного) случая: перезапись значений свойств внутри __clone(), чтобы разрешить глубокое клонирование свойств только для чтения:

readonly class Post
{
public function __construct(
public DateTime $createdAt,
) {}

public function __clone()
{
$this->createdAt = new DateTime();
// так можно,
// даже не смотря на то что свойство createdAt только для чтения.
}
}
PHP 8.3: Анонимные классы только для чтения

Ранее нельзя было пометить анонимные классы как доступные только для чтения. Это исправлено в PHP 8.3:

$class = new readonly class {
public function __construct(
public string $foo = 'bar',
) {}
};
Кстати, на днях, вышла новая версия кодинг стайла для PHP PER 2.0.0, в которой были исправлены проблемы предыдущей версии, а так же были обновлены правила для нового синтаксиса PHP, такие, как например:

- добавлен раздел с описанием nowdoc и heredoc
- добавлен раздел о коротких замыканиях
- добавлены правила о конечных запятых
- обновлен раздел ключевых слова-модификаторов abstract/final
- перефразировали «MUST… no» на «MUST NOT… any»
- добавлен раздел о перечислениях
- добавлена спецификация стиля цепочки методов
- добавлено руководство по стилю атрибутов
- описание именованных аргументов
- уточнение правил пустых операторов

более подробные примеры оформления кода можно посмотреть в посте https://sergeymukhin.com/blog/reliz-psr-per-200
👍1🔥1
День добрый, давно не виделись)

У меня для вас есть несколько обновленных rfc в PHP 8.3:

Типизированные константы класса

теперь, наконец-то, можно будет указывать типы констант класса:

class Foo 
{
public const string A = 'a';
public const int B = 1;
public const float C = 1.1;
public const bool D = true;
public const array E = ['a', 'b'];
}

Отрицательные индексы в массивах

Раньше, если у вас был пустой массив, и вы добавите элемент с отрицательным индексом, а затем добавите еще один элемент, этот второй элемент всегда будет начинаться с индекса 0:
$array = [];

$array[-5] = 'a';
$array[] = 'b';

var_export($array);

//array (
// -5 => 'a',
// 0 => 'b',
//)
Начиная с PHP 8.3, следующий элемент будет добавлен в index -4:
//array (
// -5 => 'a',
// -4 => 'b',
//)

Ну и напоследок спорное решение в виде атрибут #[Override]

Будет использоваться, чтобы показать намерение программиста: "Я знаю, что этот метод переопределяет родительский метод. Если это когда-либо изменится, сообщите мне".

более подробно почему не все довольны этим rfc в новом посте https://sergeymukhin.com/blog/php-83-atribut-override
👍5
Уязвимость OpenSSL USN-6119-1

Мэтт Касвелл обнаружил, что OpenSSL можеть неправильно обрабатывать определенные идентификаторы объектов ASN.1.

Уязвимость заключается в том, что злоумышленник может использовать эту проблему, чтобы удаленно заставить OpenSSL потреблять сильно ресурсы, что приведет систему к отказу в обслуживании. (CVE-2023-2650)

OpenSSL неправильно обрабатывает расшифровку шифра AES-XTS на 64-битных платформах ARM. Эта проблема затрагивает 18.04 LTS, 20.04 LTS, Ubuntu 22.04 LTS, Ubuntu 22.10 и Ubuntu 23.04. (CVE-2023-1255)

Инструкции по обновлению:

sudo pro fix USN-6119-1

Результатом будет чек лист пофиксенных или пропущенных USN

Проблему можно решить, обновив систему до следующих версий пакетов:

Ubuntu 23.04:

libssl3 3.0.8-1ubuntu1.2

Ubuntu 22.10:

libssl3 3.0.5-2ubuntu2.3

Ubuntu 22.04 LTS:

libssl3 3.0.2-0ubuntu1.10

Ubuntu 20.04 LTS:

libssl1.1 1.1.1f-1ubuntu2.19

Ubuntu 18.04 LTS:

libssl1.0.0 1.0.2n-1ubuntu5.13

libssl1.1 1.1.1-1ubuntu2.1~18.04.23

CVE, содержащиеся в этом USN, включают: CVE-2023-1255, CVE-2023-2650.
👍1🤯1
Всем привет, у меня тут подъехал второй отчет в 2023 году об используемых версий PHP:

Как можно заметить процент использования новой версии PHP 8.2 растет и это радует)

более полная информация и красивые диаграммы в новом посте https://sergeymukhin.com/blog/statistika-versii-php-vypusk-20232
👍5