С концом 2020 года вышел выпуск PHP 8 , а также выпуск .Net 5.0.0 , первый также обсуждается на Хакерские новости (и здесь , здесь или здесь ). Я пишу много кода на PHP, при этом часто использую C# с .Net Фреймворк, а в последнее время все чаще .Net Ядро – может быть, половина/половина. Я восхищаюсь PHP и думаю, что PHP 8 доказывает, что люди, разрабатывающие и разрабатывающие PHP, очень заботятся о языке и будущем PHP в целом. В этом сообщении в блоге я хотел бы показать, почему я думаю, что PHPmatters и почему я все еще предпочитаю C#.
Что нового в PHP 8?
Во-первых, есть именованные аргументы, так что вам гораздо проще использовать функции с большим количеством аргументов или просто для того, чтобы сделать аргументы более понятными. Как показано в объявлении о выпуске PHP 8:
htmlспециальные символы($строка, двойной код: false);
PHP 8 также поддерживает атрибуты класса/метода, которые могут заменить часто используемый PHPDoc для настройки поведения классов или методов. Они выглядят немного глупо с использованием #[] в качестве синтаксиса, но похоже, что это для обратной совместимости (поскольку # вводит однострочный комментарий).
# [Маршрут(“/api/сообщения/{идентификатор}”, методы: [“ПОЛУЧИТЬ”])] публичная функция foo()
Затем есть также продвижение свойств конструктора, которое устраняет необходимость вручную устанавливать свойства классов, которые являются аргументами конструктора, в конструкторе. Кроме того, существуют типы объединения, которые позволяют передавать более одного типа строго типизированному методу. Существуют выражения соответствия, которые устраняют необходимость написания оператора switch. И есть оператор null safe, который позволяет перемещаться по методам класса, которые могут быть нулевыми:
$страна = $сессия?->пользователь?->Получить адрес()?->страна;
Есть также некоторые другие улучшения под капотом, такие как своевременная компиляция, множество вещей, связанных с системой типов, обработкой ошибок и различными настройками синтаксиса. По сути, PHP 8 является основным выпуском в отношении языкового дизайна и в меньшей степени в отношении функциональности (ожидайте, возможно, JIT-компиляции). Это исправляет многое из наследия, которое существовало так долго, и позволяет языку расти – и даже становиться лучше.
Действительно ли PHP того стоит?
Да, безусловно. PHP – удивительный язык, обеспечивающий легкий ввод, простое развертывание, широко доступные хорошие веб-хостинги, которые его поддерживают. Он стабилен, надежен и обычно просто работает. Над PHP часто смеются из-за его языкового дизайна. Тем не менее, PHP имеет динамичное сообщество и один из крупнейших общедоступных репозиториев пакетов . PHP прост в установке, прост в использовании и довольно прост в развертывании, поскольку он состоит только из файлов, которые необходимо скопировать на веб–сервер – компиляции для конкретной платформы нет.
Наиболее часто слышимые аргументы против PSP – это небрежность/лень в отношении типов (типы сценариев не являются обязательными), это простительно (если синтаксис в порядке, семантика “адаптируема”) и это плохой языковой дизайн (путь к большому наследию).
Тогда почему вы предпочитаете C#?
Я покажу вам несколько аргументов, почему я предпочитаю языковой дизайн C#, а не PHP. Для контекста: я в основном использую оба языка для веб-приложений. Так что обычно это всегда вход JSON и выход JSON.
Хорошее управление зависимостями
Хотя я думаю, что PHP выполняет свою работу (он делает это очень хорошо), мне начал нравиться C# (особенно с .Net Ядро). Больше всего я восхищаюсь дизайном языка C#. Composer, полуофициальный менеджер пакетов PHP, является одним из лучших решений для разрешения зависимостей. Он прекрасно справляется с переходными зависимостями, что позволяет разработчикам пакетов очень легко определять свои требования, а пользователям пакетов очень легко требовать какой-либо пакет и проверять, действительно ли он совместим с другими зависимостями. В .net привязка сборки и переходные зависимости часто вызывали проблемы, проблемы и проблемы со сборкой . С помощью .Net Ядро, это стало намного проще благодаря более простому формату определения зависимостей.
Строгая типизация и проверка синтаксиса во время компиляции
Одна из особенностей интерпретируемого языка, такого как PHP, заключается в том, что проверка синтаксиса выполняется либо статически, либо при фактическом запуске кода. Это может привести к проблемам, которые обнаруживаются довольно поздно (в лучшем случае при выполнении автоматического тестирования, в худшем случае в производстве). Поскольку C# является компилируемым языком, по крайней мере, синтаксис проверяется при компиляции. Это не означает, что ваш код волшебным образом работает всегда, это просто означает, что самые основные проблемы устраняются на ранней стадии.
//Это допустимый синтаксис в PHP. Имеет ли это смысл? Нет. функция foobar(): пустота {} ();
Очевидно, что предпочитаемая вами среда разработки может указывать на то, что этот код не имеет смысла. Но дело не в этом. В большой кодовой базе становится очень трудно следить за всеми подобными проблемами.
Потоки
В PHP нет доступных потоков. У него есть ресурсы , которые являются своего рода специальной переменной, содержащей ссылку на внешний ресурс. Если вы ищете, как прочитать изображение (или любой файл) с удаленного хоста и записать его в локальный файл, вы указали на что-то вроде этого:
$imageString(“http://example.com/image.jpg “); (‘(‘Изображение/сохранить to/image.jpg ‘,строка изображения$);
C# использует еще немного кода для этого, но тогда: какой тип на самом деле имеет $imageString? Это не ресурс, это строка. И если вы догадываетесь, что захотите загрузить файл размером 100 МБ с удаленного сервера, сколько памяти вам нужно? Не менее 100 МБАЙТ. Тогда я просто предпочитаю использовать какой-либо производный класс Stream , который позволяет мне читать, писать, искать и все такое, используя довольно низкий объем памяти. Работая над проектами, которые обрабатывают изображения на веб-серверах с часто довольно большими изображениями (до 50, а иногда и 100 МБ), потоки являются желанным подарком.
Обобщения, перечисления и все недостающие части хорошего языка
В PHP действительно есть предложение для реализации перечислений в будущем. У него также есть четырехлетнее предложение по внедрению дженериков. Нужны ли вам перечисления и обобщения для выполнения этой работы? Абсолютно нет. Облегчает ли это вашу работу? Абсолютно да. Особенно, учитывая, что практически каждая база данных предоставляет тип данных перечисления, было бы неплохо иметь перечисление в PHP и не использовать для этого строку. Для этого существуют отличные библиотеки , и они работают довольно хорошо. И это подводит меня к моему последнему аргументу:
Правильная десериализация типов
Поиск в Интернете о том, как “десериализовать в php пользовательский класс”, первая ссылка, которая Всплывающий поток стека предлагает что-то вроде этого:
$данные($json, верно); Фубар(); foreach ($данные как $ключ => $значение) $класс->{$ключ} = $значение;
Очевидно, что это не работает с вложенными классами, строгими типами (или как-то так?, Из-за слабой типизации в PHP). Другие предложения выглядят гораздо более привлекательными или предлагают использовать stdClass (базовый класс каждого класса) и использовать подсказки типа PHPDoc для указания типа в среде IDE. Тогда я предпочитаю способ C #, который вполне способен десериализовать вложенные объекты в их надлежащий тип.
ФууОбж. Десериализуетобъект Obj>(строка json); Obj>(строка json);
В современном мире с распределенными (или микро-) сервисами возможно, что некоторые данные передаются от одного сервиса к другому. Принимающая служба получает некоторую строку JSON и десериализует эту строку в определение общего класса. При этом вы получаете типы сценариев бесплатно, а изменение одной стороны (изменение контракта) также позволяет отслеживать изменения для принимающей службы. Без надлежащей десериализации в реальные типы классов вы просто о многом догадываетесь.
Буду ли я по-прежнему использовать PHP?
Да, конечно. С помощью Symfony , одного из если не самых продвинутых фреймворков PHP, легко писать веб-сервисы. С помощью Doctrine , ORM, довольно легко читать/записывать в базы данных и объекты отображения (однако я все еще предпочитаю что-то вроде шаблона пассивной записи). PHP имеет большое, активное сообщество и множество проектов с открытым исходным кодом, которые помогут вам во многих случаях. PHP абсолютно развивается, и я думаю, что если он продолжит двигаться в том же направлении, что и в случае с PSP 8, он может надолго занять свое место в языковом ландшафте.
PHP зародился в (веб-) ландшафте, который сильно отличался от того, что мы знаем сегодня. PHP сохранил (и до сих пор сохраняет) много наследия, что также может быть хорошо (другие этого не делают, глядя на .Net экосистема и их множество фреймворков пользовательского интерфейса), но также может быть настолько плохим, что в какой-то момент вы сломаете половину Интернета , сделав язык несовместимым с WordPress.
Вывод
С помощью .Net Ядро 3 и, последняя версия, .Net Ядро 5, Microsoft показывает, что она заботится о своей платформе .Net, и это показывает, что она вполне способна конкурировать с известными языками для веб-API, такими как PHP, Python и Java. PHP 8 доказал, что команда вокруг PHP готова значительно улучшить язык и обрезать старые хвосты. Я думаю, что PHP 8 потрясающий, и он отлично справляется со своей работой. Тем не менее, я думаю, что C # просто обеспечивает лучший языковой дизайн для современного мира, основанного на api.
Это сообщение в блоге было первоначально размещено в блоге моей компании в разделе компания .
Оригинал: “https://dev.to/klauenboesch/php-8-is-amazing-i-still-prefer-c-1lkk”