что нового в php 8

Состоялся релиз языка программирования PHP 8.0

что нового в php 8. Смотреть фото что нового в php 8. Смотреть картинку что нового в php 8. Картинка про что нового в php 8. Фото что нового в php 8

26 ноября 2020 года состоялся релиз языка программирования PHP 8.0.

Сообщество разработчиков пояснило, что новая версия языка PHP содержит множество новых возможностей и оптимизаций, включая именованные аргументы, Union type, атрибуты, упрощенное определение свойств в конструкторе, выражение Match, оператор Nullsafe, добавлено включение JIT-компилятора и сделаны улучшения в системе типов, сравнении строк и чисел, обработке ошибок и консистентности.

Новая версия языка программирования PHP содержит ряд новых функций. Часть ранее используемых в предыдущих версиях PHP функций объявлены устаревшими.

Разработчики внесли в PHP 8.0 некоторые изменения, нарушающие обратную совместимость с предыдущими версиями языка программирования.

Для миграции с PHP 7.4.x на PHP 8.0.x создан специальный раздел на портале php.net. Разработчики просят ознакомиться с документацией и изменениями в PHP 8.0 перед переходом на новую версию, особенно в производственной среде.

Примечательно, что в начале июля 2020 года сервисный инженер и менеджер по проектам PHP в Microsoft Дейл Хирт (Dale Hirt) предупредил сообщество разработчиков PHP, что компания не собирается заниматься поддержкой новых версий PHP, включая 8.0 и выше, для Windows. Представитель сообщества разработчиков PHP ответил Microsoft, что они глубоко признательны компании за проделанную их специалистами работу по поддержке PHP на Windows на протяжении многих лет. Также в сообществе разработчиков PHP сообщили, что примут все необходимые меры, чтобы найти в ближайшее время альтернативный вариант для организации поддержки PHP 8.0 и выше для Windows, например, своими силами.

Источник

PHP 8 — пробуем новые возможности

что нового в php 8. Смотреть фото что нового в php 8. Смотреть картинку что нового в php 8. Картинка про что нового в php 8. Фото что нового в php 8

Добавлена поддержка типов union (RFC)

Тип union принимает значения разных других типов, а не только какого-то одного.

Добавлены WeakMap (RFC)

Слабые карты (weak maps) позволяют создавать связи между объектами и произвольными значениями (как и SplObjectStorage ), при этом объекты, используемые в качестве ключей, не защищаются от сборщика мусора. Если сборщик уничтожает такой объект, тот просто удаляется из карты.

Это очень полезная фича. Она позволяет нам ещё меньше думать об утечках памяти в коде. Хотя для большинства PHP-разработчиков это не должно быть проблемой, но стоит обращать внимание при создании долгоиграющих процессов, например, используя ReactPHP. С WeakMaps ссылки на объекты автоматически собираются сборщиком мусора, когда объект становится недоступен.

Если вы сделаете то же самое с массивом, то ссылки на объект сохранятся, что приведёт к утечке памяти.

Новое исключение ValueError

При определении функций можно использовать вариативный аргумент

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

Возвращаемый тип static (RFC)

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

Литерал имени класса для объекта (RFC)

Настройки синтаксиса переменных (RFC)

Интерфейс Stringable (RFC)

Теперь трейты могут определять абстрактные приватные методы (RFC)

throw теперь можно использовать как выражение (RFC)

Выражение throw теперь можно использовать там, где допускаются только выражения: в стрелочных функциях, coalesce-операторах тернарных условных операторах (ternary/elvis).

В параметрах списка теперь допускается опциональная висящая запятая (RFC)

По аналогии с висящей запятой в массивах, теперь можно определять её и в параметрах списка.

Ловля исключений без сохранения в переменной (RFC)

Теперь можно писать catch (исключение) для ловли исключений без их сохранения в переменной.

Добавлена поддержка типа mixed (RFC)

В PHP 8 появился новый тип mixed. Он может быть эквивалентен типам array, bool, callable, int, float, null, object, resource, string.

Добавлена поддержка атрибутов

Есть несколько предложений по внедрению атрибутов в PHP 8:

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

Добавлена поддержка продвижения свойств конструктора (RFC)

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

Добавлена поддержка выражения match (RFC)

Добавлена поддержка оператора nullsafe (?->) (RFC)

Добавлена поддержка именованных аргументов (RFC)

Именование позволяет передавать аргументы функции в зависимости от имени параметра, а не от его позиции. То есть значения аргументов становятся самодокументирующимися, а аргументы перестают зависеть от порядка перечисления, поэтому можно произвольно пропускать значения по умолчанию.

Источник

Что нового в php 8

Вместо аннотаций PHPDoc вы можете использовать структурные метаданные с нативным синтаксисом PHP.

Объявление свойств в конструкторе RFC Документация

Меньше шаблонного кода для определения и инициализации свойств.

Тип Union RFC Документация

new Number ( ‘NaN’ ); // Нет ошибки

new Number ( ‘NaN’ ); // TypeError

Вместо аннотаций PHPDoc для объединённых типов вы можете использовать объявления типа union, которые проверяются во время выполнения.

Выражение Match RFC Документация

Новое выражение match похоже на оператор switch со следующими особенностями:

Оператор Nullsafe RFC

Вместо проверки на null вы можете использовать последовательность вызовов с новым оператором Nullsafe. Когда один из элементов в последовательности возвращает null, выполнение прерывается и вся последовательность возвращает null.

Улучшенное сравнение строк и чисел RFC

При сравнении с числовой строкой PHP 8 использует сравнение чисел. В противном случае число преобразуется в строку и используется сравнение строк.

Ошибки согласованности типов для встроенных функций RFC

strlen ([]); // Warning: strlen() expects parameter 1 to be string, array given

strlen ([]); // TypeError: strlen(): Argument #1 ($str) must be of type string, array given

Большинство внутренних функций теперь выбрасывают исключение Error, если при проверке параметра возникает ошибка.

Компиляция Just-In-Time

PHP 8 представляет два механизма JIT-компиляции. Трассировка JIT, наиболее перспективная из них, на синтетических бенчмарках показывает улучшение производительности примерно в 3 раза и в 1,5–2 раза на некоторых долго работающих приложениях. Стандартная производительность приложения находится на одном уровне с PHP 7.4.

Относительный вклад JIT в производительность PHP 8

что нового в php 8. Смотреть фото что нового в php 8. Смотреть картинку что нового в php 8. Картинка про что нового в php 8. Фото что нового в php 8

Улучшения в системе типов и обработке ошибок

Прочие улучшения синтаксиса

Новые классы, интерфейсы и функции

Выше производительность, лучше синтаксис, надежнее система типов.

Для загрузки исходного кода PHP 8 посетите страницу downloads. Бинарные файлы Windows находятся на сайте PHP для Windows. Список изменений представлен в ChangeLog.

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

Источник

От версии 8 к 8.1: новый виток развития PHP

что нового в php 8. Смотреть фото что нового в php 8. Смотреть картинку что нового в php 8. Картинка про что нового в php 8. Фото что нового в php 8

Я уже несколько раз писал о том, что происходило с PHP за год и всегда с нетерпением ждал следующего года. Я делал это в 2020-м и 2019-м. И продолжаю делать в 2021-м.

Я всегда повторяю: PHP это уже не тот язык, которым он был десять лет назад, и мы очень этому рады. Сегодня это быстрый и надёжный язык, позволяющий разрабатывать сложные и масштабируемые приложения. Давайте обсудим некоторые из наиболее заметных изменений, которые появились за год — как в самом языке, так и в экосистеме.

От версии 8 к 8.1

Новая мажорная версия PHP 8 появилась в конце прошлого года. Я уже много об этом писал, так что не буду здесь повторяться. Как всегда, его производительность становится всё лучше и лучше. Этот факт подтверждают тесты от Kinsta.

Во многом, это заслуга компилятора JIT (Just in time, «на лету»). Он действительно улучшает производительность (что особенно справедливо для математических операций). Но счастье было бы не полным, если бы ранее в PHP 7.4 не появилась предзагрузка. Она компилирует исходные файлы в опкоды и связывает зависимые классы, трейты и интерфейсы. Такой «скомпилированный» фрагмент исполняемого кода (то есть кода, который может использовать PHP-интерпретатор) сохраняется в памяти и становится доступен для всех запросов. Это положительно влияет на производительность, если вы, конечно, не используете виртуальный хостинг.

что нового в php 8. Смотреть фото что нового в php 8. Смотреть картинку что нового в php 8. Картинка про что нового в php 8. Фото что нового в php 8

Стоит также упомянуть атрибуты (они же «аннотации»), именованные параметры (Named Arguments) и объявление свойств в конструкторе (Constructor Property Promotion), поскольку они определённо способствовали тому, что 8-я версия PHP получилась настолько удачной.

Не останавливаясь на достигнутом, PHP Core Team уже работает над следующей версией, PHP 8.1, которая должна выйти к концу 2021 года. На данный момент больше всего заслуживают внимания перечисления (enums) и файберы (fibers, зелёные потоки). Я ещё буду говорить о них позже в этой статье.

Год за годом команда выдаёт стабильные версии с множеством фич и других нововведений, улучшающих жизнь PHP-разработчикам. Среди прочего, в этот раз был усовершенствован процесс миграции. Я достаточно быстро перетащил некоторые из моих собственных проектов с PHP 7.4 на PHP 8: мне потребовалось около часа на каждый проект. Так что, у нас осталось ещё меньше поводов откладывать миграцию.

Система типов

Наконец-то в PHP добавят перечисления.

Ниже — пример их использования:

Кроме того, появился RFC-запрос на добавление в язык нового типа never.

Использование never будет означать, что функция с таким типом возвращаемого значения не сможет вернуть результат и должна прервать выполнение программы — выбросить исключение, вызвать exit или сделать это каким-то другим способом.

Отмечу, что never принципиально отличается от void: функция с возвращаемым значением типа void способна вернуть результат, а значит, прерывать работу программы нет необходимости. Такое нововведение может показаться слегка необычным, но оно обязательно найдёт применение в статическом анализе кода.

И ещё пару слов о статическом анализе: PhpStorm добавил встроенную поддержку анализаторов Psalm и PhpStan. После этого количество пользователей этих двух продуктов должно увеличиться.

К сожалению, дженерики (generics) по-прежнему нативно не поддерживаются. Есть несколько серьёзных проблем. В первую очередь, не забывайте, что PHP — это всё ещё язык с динамической типизацией. Здесь Nikita уже писал о связанных с этим проблемах. На мой взгляд, самый простой выход — нативно реализовать поддержку лишь так называемых runtime-erased generics, добавив в язык новый синтаксис без применения каких-либо дополнительных проверок типа во время выполнения и полагаясь на статический анализ. Однако, для этого требуется больше, чем просто техническое решение: нужно изменить мышление участников PHP-сообщества в целом. Может быть, когда-нибудь это станет возможным. Когда-нибудь.

Асинхронный PHP

Буквально недавно мы узнали, что в PHP 8.1 появятся корутины, также известные как файберы.

Простой пример использования файберов:

Хотя одних только файберов недостаточно для того, чтобы язык стал по-настоящему асинхронным. Они могут лишь стать маленькой шестерёнкой в «большой асинхронной машине».

Однако, соответствующий RFC снова вызвал интерес у «автолюбителей асинхронности», чему мы можем только радоваться. Популярность асинхронных фреймворков, таких как Amphp и ReactPHP, растёт: недавно Laravel объявил о встроенной поддержке Swoole и RoadRunner.

Экосистема PHP

Я не могу не вспомнить о новом релизе Composer 2.0, который вышел в октябре 2020 года. В этой версии есть несколько улучшений UX, но, что важнее всего, она демонстрирует большой прирост производительности. В условиях чистой установки прирост достигает 300%. Разница очень заметна на боевых проектах. Не зря пакетный менеджер Composer де-факто стал стандартом для PHP-разработчиков.

Мне нравится время от времени оценивать состояние экосистемы PHP, просматривая количество пакетов, доступных для скачивания. В прошлом году я говорил о ±25 миллионах загрузок в день. Сегодня это число увеличилось более чем вдвое, и мы уже видим ±60 миллионов загрузок в день.

Наконец, взгляните на этот график, в котором показано, как менялось количество доступных пакетов / версий с течением времени. Его можно найти на сайте Packagist.com. Вы можете сами оценить, как растёт экосистема. И конца этому не видно.

что нового в php 8. Смотреть фото что нового в php 8. Смотреть картинку что нового в php 8. Картинка про что нового в php 8. Фото что нового в php 8

Дальше — больше

Давайте подытожим, пройдясь по всему, что было добавлено в PHP за последние годы. Если вы не следите за его развитием, материалы из списка помогут восполнить этот пробел. Я думаю, он наглядно показывает рост сообщества и команды разработчиков за последние годы. Уверен, что дальше будет ещё лучше.

Наши серверы можно использовать для разработки на PHP.

Зарегистрируйтесь по ссылке выше или кликнув на баннер и получите 10% скидку на первый месяц аренды сервера любой конфигурации!

Источник

PHP 8 — какие возможности появятся в новой версии языка и как их использовать

что нового в php 8. Смотреть фото что нового в php 8. Смотреть картинку что нового в php 8. Картинка про что нового в php 8. Фото что нового в php 8

Скриптовый язык PHP 26 ноября 2020 года обновится до новой основной версии — PHP 8, а 18 июня 2020 года уже вышла его первая альфа-версия. Подробно разбираем, какие функции появятся в новой версии языка, сильно ли увеличится производительность и какие изменения придется внедрить в свой код, чтобы запустить его на восьмой версии PHP.

Новые особенности

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

Union Types

Учитывая динамически типизированную природу PHP, существует множество случаев, когда использование типов объединения может быть полезным. Union Types представляют собой совокупность двух или более типов, которые указывают, что можно использовать любой из них.

Разработчики обещают улучшения в производительности PHP 8 в том числе благодаря стратегии компиляции JIT (just in time, «в нужный момент»). В JIT код сначала переводится в промежуточное представление, и только потом — в машинный код, зависящий от архитектуры. Это значит, что он в ходе исполнения будет превращаться в машинный код, который будет выполняться не виртуальной машиной Zend VM, на которой построен язык, а непосредственно на процессоре.

Nullsafe-оператор

Если вы работали с оператором объединения с null, вы уже знакомы с его недостатками: его нельзя применить в цепочке вызовов методов. Вместо этого вам нужны промежуточные проверки или придется полагаться на optional помощников, предоставляемых некоторыми платформами:

С добавлением nullsafe-оператора разработчик может видеть поведение методов, подобное поведению при объединению с null.

Именованные аргументы

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

Атрибуты

Атрибуты — в других языках программирования известные как аннотации, предлагают новый способ добавить метаданные в классы, без необходимости парсить докблок-комментарии.

Вот пример того, как выглядят атрибуты:

Выражение соответствия

Выражение match можно назвать старшим братом выражения switch — оно может возвращать значения, комбинировать условия, и при этом не требует break операторов. Кроме того, match не выполняет никакого приведения типов.

Краткий синтаксис для объединения свойств класса и конструктора

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

Вместо такого кода:

Теперь можно будет кратко писать вот так:

Новый тип возврата static

Новый тип mixed

С добавлением скалярных типов в PHP 7, обнуляемых — в PHP 7.1, и, наконец, — объединенных типов в 8.0, PHP-разработчики могут явно объявлять информацию о типе для большинства параметров функции, callable-функций, а также свойств класса. Тем не менее, PHP не всегда поддерживает типы, и, скорее всего, он иногда будет пропускать информацию о них. Это приводит к тому, что значение будет неоднозначным, когда отсутствует информация о типе.

Явный mixed тип позволит разработчикам добавлять типы в параметры, свойства класса и возвращаемые значения из функции, чтобы указать, что информация о типе не была забыта, а её просто нельзя указать более точно.

mixed сам по себе означает один из этих типов:

Обратите внимание, что mixed также может использоваться как параметр или тип свойства, а не только как тип возвращаемого значения.

Throw-выражения

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

Наследование частными методами

Раньше PHP применял одинаковые проверки наследования для public, protected и private- методов. Другими словами: private методы должны были быть определены так же, как protected и public. При этом такое определение не имеет смысла, так как private методы не будут доступны дочерним классам.

Это обновление изменило поведение таких методов — теперь проверки наследования больше не выполняются для private методов. Кроме того, использование final private function и раньше не имело особого смысла, поэтому теперь оно вызовет предупреждение:

Weak maps

Слабая карта — это набор объектов, на которые в коде слабо ссылаются ключи, что может привести к их удалению сборщиками мусора. В PHP 8 добавляется класс WeakMaps для создания сохранения ссылки на объект, при этом она не препятствует удалению самого объекта.

Например, возьмем пример ORM — они часто реализуют кэши, где содержатся ссылки на классы сущностей, чтобы улучшить производительность отношений между сущностями. Эти сущности не могут быть собраны сборщиком мусора, пока кэш имеет ссылку на них, даже если кэш является единственной реальной ссылкой на них. Если теперь кэш будет использовать слабые ссылки и WeakMaps, то PHP сможет справляться с мусором. Особенно в случае с ORM, которые могут управлять несколькими сотнями, если не тысячами объектов в ходе запроса.

Пример использования WeakMaps в PHP 8:

:: class на объектах

Неименованные исключения

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

Если раньше программисту приходилось писать такой код:

То в PHP 8 это будет выглядеть уже так:

Завершающая запятая в списках параметров

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

Создать DateTime объекты из интерфейса

Вы уже можете создать DateTime объект из DateTimeImmutable объекта. Однако наоборот в PHP было сделать очень сложно. Теперь в языке появился новый обобщенный способ конвертировать эти объекты друг в друга.

Новый Stringable интерфейс

Новая функция проверки str_contains()

Можно использовать вот это:

Новые функции str_starts_with() и str_ends_with()

Ещё две давно назревшие функции. str_starts_with() проверяет, начинается ли строка с другой строки, и возвращает логическое значение ( true/ false).

str_ends_with() проверяет, заканчивается ли строка другой строкой, и возвращает логическое значение ( true/ false).

Новая функция деления на 0 fdiv()

Новая функция get_debug_type()

Новая функция get_resource_id()

Ресурсы — это специальные переменные в PHP, ссылающиеся на внешние ресурсы. Например, соединение MySQL или обработчик файла — каждому из них присваивается идентификатор, хотя ранее единственным способом узнать, что это идентификатор, было преобразование ресурса в int :

PHP 8 добавляет get_resource_id() функции, делая эту операцию более очевидной и безопасной для типов:

Улучшение абстрактных методов трейтов

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

PHP 8 будет выполнять правильную проверку сигнатуры метода при использовании признака и реализации его абстрактных методов. Это означает, что вам нужно написать теперь так:

Объект реализации token_get_all()

Изменения синтаксиса переменных

В этом обновлении изменились правила синтаксиса при работе с переменными в PHP. Например, при их разыменовывании.

Аннотация аргументов внутренней функции и типов возвращаемых значений

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

Запрет на выключение JSON

Исправления критических ошибок языка

Стандартизация ошибок разных типов

Изменение классификации некоторых предупреждений

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

• Неопределенная переменная: Error исключение вместо Notice ;

• Неопределенный индекс массива: предупреждение вместо уведомления;

• Деление на ноль: DivisionByZeroError исключение вместо предупреждения;

• Попытка увеличить/уменьшить свойство «% s» не-объекта: Error исключение вместо предупреждения;

• Попытка изменить свойство «% s» не-объекта: Error исключение вместо предупреждения;

• Попытка назначить свойство «% s» не-объекта: Error исключение вместо предупреждения;

• Создание объекта по умолчанию из пустого значения: Error исключение вместо предупреждения;

• Попытка получить свойство «% s» не-объекта: предупреждение вместо уведомления;

• Невозможно добавить элемент в массив, так как следующий элемент уже занят: Error исключение вместо предупреждения;

• Невозможно сбросить смещение в переменной, не являющейся массивом: Error исключение вместо предупреждения;

• Нельзя использовать скалярное значение в качестве массива: Error исключение вместо предупреждения;

• Только массивы и Traversables могут быть распакованы: TypeError исключение вместо предупреждения;

• Указан неверный аргумент для foreach (): TypeError исключение вместо предупреждения;

• Недопустимый тип смещения: TypeError исключение вместо предупреждения;

• Недопустимый тип смещения в isset или empty: TypeError исключение вместо предупреждения;

• Недопустимый тип смещения в unset: TypeError исключение вместо предупреждения;

• Преобразование массива в строку: предупреждение вместо уведомления;

• Идентификатор ресурса #% d, используемый в качестве смещения, приведение к целому числу (% d): предупреждение вместо уведомления;

• Произошло смещение строки: предупреждение вместо уведомления;

• Смещение неинициализированной строки: % d: предупреждение вместо уведомления;

• Невозможно назначить пустую строку для смещения строки: Error исключение вместо предупреждения;

Оператор @ больше не глушит фатальные ошибки

Вполне возможно, что это изменение может выявить ошибки, которые были скрыты до PHP 8. Обязательно установите их на своих рабочих серверах display_errors=Off

Уровень сообщений об ошибках по умолчанию

Режим ошибки PDO по умолчанию

Текущий режим ошибок по умолчанию для PDO — беззвучный. Это означает, что при возникновении ошибки SQL, никакие ошибки или предупреждения не могут выдаваться, а также не генерируются исключения, если разработчик не реализует свою собственную явную обработку ошибок. Это обновление изменит ошибку по умолчанию, которая выдается на PHP 8. PDO::ERRMODE_EXCEPTION

Приоритет конкатенации

Это обновление появилось еще на PHP 7.4, но теперь оно официально вступает в силу. Если бы вы написали что-то вроде этого:

PHP ранее интерпретировал бы это так:

PHP 8 сделает так, чтобы он интерпретировался так:

Более строгие проверки типов для арифметических и побитовых операторов

До PHP 8 можно было применять арифметические или побитовые операторы к массивам, ресурсам или объектам. Это больше не возможно и выдаст TypeError :

Изменилась сигнатуры методов классов Reflection

На PHP 8 реализовано изменение трех сигнатур методов классов Reflection.

В руководстве к PHP 8 говорится, что если разработчики хотят использовать как обновленную версию языка, так и предыдущие, то допускается использование:

Стабильная сортировка

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

Неустранимая ошибка для несовместимых сигнатур методов

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

В Хекслете есть большая профессия «PHP-программист», которая подойдет как для начинающих разработчиков, так и для людей, которые понимают основу этого языка. Кроме того, для продвинутых программистов на Хекслете есть специальные курсы — «Веб-разработка на PHP» и «ООП В PHP».

что нового в php 8. Смотреть фото что нового в php 8. Смотреть картинку что нового в php 8. Картинка про что нового в php 8. Фото что нового в php 8

С нуля до разработчика. Возвращаем деньги, если не удалось найти работу.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *