PHP Annotated — January 2022

Php_annotated 이미지

Roman Pronskiy가 쓰고 JetBrains에서 제공하는 PHP Annotated 2022년 1월호의 번역/해석본입니다.

이 중에서 몇 가지 제 취향껏 골라 그 안의 내용도 좀 뒤져보고 개발새발 번역해서 소개합니다.


News

The PHP Foundation Update, January 2022

https://opencollective.com/phpfoundation/updates/the-php-foundation-update

PHP 재단은은 PHP 언어의 장수와 번영을 보장하는 것을 사명으로 하는 비영리 조직으로 11월 말에 작업을 시작했습니다.

우리는 이미 첫 번째 결과를 얻었습니다. 핵심 개발자들의 후원 신청이 접수되어 처리 중입니다.

재단 팀은 월간 업데이트를 게시할 예정이므로 Twitter @thephpf를 구독하면 최신 뉴스를 받아볼 수 있습니다.

PHP 재단에 대한 자세한 내용은 Joe Watkins, Sara Golemon 및 Sebastian Bergmann이 진행하는 Voices of the ElePHPant Ep 366 팟캐스트를 확인하십시오.

PHP 8.0.15, PHP 8.1.2, PHP 7.4.27

https://www.php.net/ChangeLog-8.php#8.0.15
https://www.php.net/ChangeLog-8.php#8.1.2
https://www.php.net/ChangeLog-7.php#7.4.27

최신 PHP branch의 버그 수정이 릴리스되었습니다. PHP 7.4의 경우 마지막 정기 릴리스이며, 이제부터는 PHP 7.4 branch는 보안 업데이트만 발행됩니다.

PHP version stats: January, 2022

https://stitcher.io/blog/php-version-stats-january-2022

다음은 packagist.org에 따른 PHP 버전에 대한 몇 가지 새로운 통계입니다. 버전 8.1이 나온 지 두 달밖에 안됐지만 이미 9.1%의 점유율을 기록했습니다. 그러나 여전히 PHP 7.4(44%)가 많이 있습니다.

Usage Statistics 이미지

[RFC] User Defined Operator Overloads

https://wiki.php.net/rfc/user_defined_operator_overloads#vote

PHP에 연산자 오버로딩을 추가하자는 제안이 투표를 통과하지 못했습니다. 그러나 저자 Jordan LeDoux와 함께하는 PHP Internals News 팟캐스트에서 자세한 내용을 들어볼 수 있습니다.
Jordan은 또한 PHP용 RFC를 만드는 방법에 대한 매우 철저한 지침을 발표했습니다.

그동안 lisachenko/z-engine 및 FFI 덕분에 연산자 오버로딩을 이미 PHP에서 사용할 수 있습니다. 행렬에 대한 연산자 구현의 예는 lisachenko/native-php-matrix를 참조하십시오.

Releases

thephpleague/flysystem 3.0.0

https://github.com/thephpleague/flysystem

파일 시스템 작업을 위한 인기 라이브러리의 메이저 업데이트입니다. 자세한 내용은 블로그 게시물을 확인하세요.

Cycle 2.0

https://spiralscout.com/blog/meet-cycle-2-0

Cycle의 두 번째 메이저 릴리스 - 전통 방식 및 데몬화된 PHP 애플리케이션 모두에서 사용할 수 있는 PHP용 DataMapper 및 ORM입니다.

ankitpokhrel/tus-php 1.0

https://github.com/ankitpokhrel/tus-php

재개 가능한 파일 업로드를 위한 개방형 프로토콜인 tus.io의 서버 및 클라이언트 구현. 이 프로토콜은 Vimeo 및 Cloudflare 등에서 사용됩니다.

Infection PHP 0.26.0

https://infection.github.io/2022/01/10/whats-new-in-0.26.0/

PHP mutation 테스트 프레임워크에 대한 업데이트입니다. 새 버전은 HTML 보고서, 추가되거나 수정된 줄만 변형하는 등을 기능을 추가합니다.

Doctrine ORM 2.11

https://www.doctrine-project.org/2022/01/11/orm-2.11.html

이 업데이트는 열거형, 가상 컬럼, 읽기 전용 속성, 중첩 속성 등에 대한 지원을 제공합니다.

Roave/BetterReflection 5.0

https://github.com/Roave/BetterReflection/releases/tag/5.0.0

향상된 리플렉션 API: 클래스를 로드하지 않고도 클로저 등에서 정보를 얻을 수 있습니다.
새 버전은 PHP 8.1 지원을 추가하고 더 나은 성능을 제공합니다.

Tools

viewi/viewi

https://github.com/viewi/viewi

PHP와 HTML만을 사용하여 반응형 애플리케이션을 만들기 위한 강력한 도구입니다. 본질적으로 이것은 서버 측 템플릿 엔진 + 프론트엔드 프레임워크입니다. 그러나 핵심은 모든 구성 요소와 논리를 PHP로 설명한 다음 도구가 이를 기본 JS로 변환한다는 것입니다.

프로젝트 웹사이트 viewi.net작동 메커니즘을 자세히 설명하고 코드 예제를 제공합니다. 단계별 자습서를 따라할 수도 있고 Symfony와 통합하는 방법을 확인할 수도 있습니다.

Roach PHP

https://roach-php.dev/

인기 있는 Python 라이브러리인 Scrapy에서 영감을 받은 웹 스크래핑 도구입니다.

symfony/html-sanitizer

https://github.com/symfony/html-sanitizer

신뢰할 수 없는 HTML을 정리하고 XSS로부터 보호하는 새로운 컴포넌트입니다. HTML Purifier의 좋은 대안이 될 수 있습니다.

EventSaucePHP/ObjectHydrator

https://github.com/EventSaucePHP/ObjectHydrator

원시 데이터(예: JSON)를 객체로 변환해주는 라이브러리입니다.

ajthinking/archetype

https://github.com/ajthinking/archetype

PHP 파일/클래스를 수정하기 위한 간단한 인터페이스입니다.

framjet/php-enum-bitmask

https://github.com/framjet/php-enum-bitmask

PHP 8.1의 열거형을 BitMask로 사용하기.

beyondcode/httpdump

https://github.com/beyondcode/httpdump

HTTP 요청을 디버깅하기 위한 Laravel 애플리케이션(web hook 디버깅 등). 임의의 URL을 만들고 그곳으로 가는 모든 요청을 훌륭하게 덤프합니다. httpdump.app에서 작동하는 것을 볼 수 있습니다.

spatie/ignition

https://github.com/spatie/ignition

Laravel의 많은 사람들에게 친숙하지만 이제 프레임워크에 독립적인 디버깅 오류 페이지를 표시하기 위한 이 라이브러리가 업데이트되었으며 모든 애플리케이션에서 사용할 수 있습니다.

디버깅을 위한 오류 페이지를 만들 수 있는 이 라이브러리는 Laravel의 많은 것과 비슷하지만, 이제 프레임워크에 독립적이어서 어느 어플리케이션에서나 사용할 수 있습니다. Overview 블로그 게시물을 확인하세요.

chevere/xr

https://github.com/chevere/xr

Spatie/ray에서 영감을 받은 ReactPHP의 디버그 서버이지만 데스크톱 애플리케이션 대신 CLI 명령으로 실행합니다. 비디오 데모.

JustSteveKing/php-sdk, Sammyjo20/Saloon

https://github.com/JustSteveKing/php-sdk
https://github.com/Sammyjo20/Saloon

동일한 아이디어를 가진 두 개의 유사한 라이브러리: 서비스용 SDK 생성을 단순화하거나 공통 스타일로 다른 API에 접근할 수 있게 구성합니다.

AliSaleem27/wordle-cl

https://github.com/AliSaleem27/wordle-cli

인기 있는 5글자 단어 추측 게임 Wordle의 CLI 버전입니다.

staabm/phpstan-dba

https://github.com/staabm/phpstan-dba

PDO, MySQLi 및 Doctrine/DBAL에서 SQL 쿼리의 유효성을 확인하는 PHPStan용 extension입니다. 데모.

flow-php/etl

https://github.com/flow-php/etl

PHP 애플리케이션에서 사용할 Extract Transform Load 패턴의 구현입니다. 자세한 내용은 작성자의 스레드를 확인하세요.

Symfony

The symfony-cli tool has been open-sourced

https://github.com/symfony-cli/symfony-cli

Symfony 관련 작업 외에도 이 도구에는 MAMP/WAMP의 최신 대안으로 사용할 수 있는 로컬 서버가 포함되어 있습니다. 여러 버전의 PHP를 지원하고(각 프로젝트에서 자체적으로 지정할 수 있음) Docker, 로컬 도메인 및 자동화된 HTTPS와 통합됩니다. 이 도구는 Go로 구현되며 Linux, macOS 및 Windows에서 사용할 수 있습니다.

A better way to quickly start Symfony projects

https://symfony.com/blog/a-better-way-to-quickly-start-symfony-projects

Introducing the Symfony 6 Certification – 90 minutes for 75 questions from 15 topics.

https://symfony.com/blog/introducing-the-symfony-6-certification

15개 주제에서 75개 질문에 대해 90분 동안 시험을 치고 Symfony 6 인증서를 받아보세요.

Organizing your Symfony project tests

https://www.strangebuzz.com/en/blog/organizing-your-symfony-project-tests

테스트를 용도(+속도)에 맞게 아래와 같이 디렉토리를 구분하고 별도로 실행할 수 있게 구성했습니다.

  • Unit tests
  • Integration tests
  • Api tests
  • Functional tests
  • End-to-end tests
  • External tests

The key concepts of Symfony’s Security package in 5 minutes

https://alex-daubois.medium.com/symfonys-security-key-concepts-in-5-minutes-e18033c26b35

Symfony 6 Security component를 설명합니다.

  • User, password and roles
  • User Providers
  • Firewalls
  • Voters and ACL
  • Authenticators, passports and badges

Symfony Messenger 💛 systemd

https://jolicode.com/blog/symfony-messenger-systemd

Use PHP Enums as Doctrine type in Symfony

https://smaine-milianni.medium.com/use-php-enums-as-doctrine-type-in-symfony-85909aa0a19a

Build Symfony and Doctrine ORM Applications with ease using Ecotone

https://blog.ecotone.tech/build-symfony-application-with-ease-using-ecotone/

norberttech/static-content-generator-bundle

https://github.com/norberttech/static-content-generator-bundle

Symfony 애플리케이션에서 정적 HTML 페이지를 생성합니다.

Using custom PHP attributes for registering and configuring Symfony Messenger handlers

https://angelovdejan.me/2022/01/09/custom-php-attributes-for-symfony-messenger-handlers.html

JSON Columns and Doctrine DBAL 3 Upgrade

https://dunglas.fr/2022/01/json-columns-and-doctrine-dbal-3-upgrade/

Laravel

Laracon Online is on Feb 9, and it’s free

https://laracon.net/

컨퍼런스는 보통 유료지만 이번 Laracon Online Winter는 유튜브에서 무료로 중계됩니다.

Building a multi-room chat application with Laravel and Centrifugo

https://centrifugal.dev/blog/2021/12/14/laravel-multi-room-chat-tutorial

Laravel과 Centrifugo로 멀티룸 채팅 애플리케이션 구축하기

Centrifugo : real-time messaging server).

Managing Laravel services

https://downing.tech/posts/managing-laravel-services

Clean Integrations 시리즈 중 세 번째입니다.

  1. Automating Tweets when publishing a new post
  2. Testing APIs and Services in Laravel
  3. Managing Laravel services

Laravel Pseudo-Daemons

https://aaronfrancis.com/2020/laravel-pseudo-daemons

Laravel command의 한계를 극복하고자, Supervisor 구성 없이 코드에 의해 제어되는 유사-데몬을 만든 경험을 공유합니다. 2020년 글이네요.

Primitive Types in Controllers and Closure Routes

https://laravel-news.com/primitive-types-in-controllers-and-closure-routes

How to scale Laravel project on AWS without breaking the bank.

https://laravel-news.com/primitive-types-in-controllers-and-closure-routes

LaravelDaily/Laravel-Roadmap-Learning-Path

https://github.com/LaravelDaily/Laravel-Roadmap-Learning-Path

간단한 것부터 복잡한 것까지 라라벨을 배우기 위한 체계적인 자료 모음입니다.

Building an API using TDD in Laravel

https://laravel.io/articles/building-and-api-using-tdd-in-laravel

Efficient Pagination Using Deferred Joins

https://aaronfrancis.com/2022/efficient-pagination-using-deferred-joins

-- Page 3
select * from users order by created_at desc limit 15 offset 30;

Pagination 구현 시 위와 같이 쿼리하곤 하는데, 이 경우 database에선 모든 row를 읽은 후 offset 이후의 값을 응답합니다. 이를 더 효율적으로 가져오려면 커서 기반으로 조회해야 하는데,

-- Page 3 (Assuming the max ID from page two was 72.)
select * from users where id > 72 order by id limit 15;

Laravel 문서에는 오프셋과 커서 사이의 절충점에 대한 몇 가지 좋은 컨텍스트가 있습니다.
https://laravel.com/docs/8.x/pagination#cursor-vs-offset-pagination

이 글에서는 지연된 조인으로 offset/limit이 적용될 때까지 요청된 열에 대한 액세스를 연기하는 기술입니다.

select * from contacts          -- The full data that you want to show your users.
inner join ( -- The "deferred join."
select id from contacts -- The pagination using a fast index.
order by id
limit 15 offset 150000
) as tmp using(id)
order by id -- Order the single resulting page as well.

이 글에서는 이 아이디어를 Laravel로 구현하는 예제와 더 나은 성능을 위한 MySQL 튜닝 아이디어 그리고 많은 이들의 성능 개선 간증이 이어집니다.

45 New Laravel Tips 2022

https://www.youtube.com/watch?v=YzBGmdnGtbY

Yii

Yii 1.1.25

https://www.yiiframework.com/news/419/yii-1-1-25-is-released

Yii 프레임워크의 첫 번째 버전은 활발히 개발되지 않지만 호환성을 위한 수정은 계속 나오고 있습니다. 이 업데이트는 PHP 8.0에 대한 몇 가지를 수정합니다.

The first stable releases for some Yii 3 components have also been released

기타 읽을 만한 글

Trying out PHP after 7 years

https://www.kode-krunch.com/2021/12/trying-out-php-after-7-years.html

7년 전 Java에만 집중하기 위해 PHP를 떠났던(당시 PHP 사용하던 버전은 5.3) 개발자가 천지개벽한 PHP 생태계를 만나 이제 쓸만 하다고 생각한다는 내용.

자신의 경험을 토대로 Symfony Demo를 다시 만들어 본 경험을 2부작으로 게시하기도 했습니다.
PHP: Symfony Demo meets Modular, Microservice-ready Architecture - Part 1, Part 2

7년 전에 PHP 커뮤니티에 PHP 언어가 오늘날의 모든 기능을 가질 것이라고 말하면 그들은 당신이 미쳤다고 생각할 것입니다.

PHP in 2022

https://stitcher.io/blog/php-in-2022

Brent Roose가 쓰는 PHP 생태계 overview.

매년 “PHP in 20XX” 포스트를 쓰는 것은 이번이 네 번째이며, 올해만큼 흥분한 적이 없었다는 것을 인정해야 합니다.

PHP 8.1

열거형
생성자에서 new 사용
readonly properties

PHP에 추가된 최신 기능을 확인하시려면 PHP 2021 3분 요약 비디오를 보고 오셔도 좋습니다.

Static Analysis

PHP의 정적 분석이 크게 성장하고 있습니다.

PHP에서 정적 분석이 중요한 이유와 이에 대해 열광하는 이유에 대해 간단히 읽고 싶다면 우리는 런타임 유형 검사가 필요하지 않습니다라는 블로그 게시물을 확인할 수 있습니다.

The PHP foundation

2개월 전, PHP 세계는 2021년의 가장 큰 뉴스일 수도 있는 꽤 큰 뉴스를 받았습니다. 가장 활동적인 핵심 유지 관리자 중 한 명인 Nikita가 LLVM 작업을 위해 자리에서 물러나지만 동시에 PHP core 개발을 지원할 수 있게 몇몇 대기업이 지원하는 새로운 이니셔티브도 생겼습니다.

요컨대, PHP core 개발 자금을 지원하는 유일한 목표를 가진 비영리 PHP Foundation이 있습니다. 이 이니셔티브는 이미 프로젝트에 10만 달러를 약속한 JetBrains가 주도합니다. 다른 많은 사람들과 함께 이제 $329,920.75를 모았습니다. 좋은 시작!

  • 이 글을 번역하는 시점에는 $386,384.93 USD, 연간 추정 예산은 $468,509.68 USD입니다.

JetBrains의 블로그 게시물에서 재단의 사명과 목표에 대해 자세히 알아볼 수 있습니다 .

The ecosystem

Packagist는 이제 300만 개 이상의 등록된 버전과 300,000개 이상의 패키지가 있습니다. 보시다시피 생태계는 계속 성장하고 성장하며 2022년에도 다르지 않을 것입니다.

Packagist에 등록된 패키지 현황 그래프

최근에 Packagist는 500억 회 이상의 설치(install)를 처리하는 이정표를 통과했습니다.
축하해요 Packagist!

Async PHP

Async 커뮤니티의 흥미로운 개발 중 하나는 Amp와 ReactPHP의 개발자가 함께 모여 Revolt PHP라는 fiber 호환 이벤트 루프 구현을 만들었다는 것 입니다.

Serverless PHP

Matthieu Napoli는 PHP 개발자에게 이 비교적 새로운 PHP 사용 방법에 대해 교육하는 것을 그의 사명으로 삼고 있으며 꽤 잘하고 있는 것 같습니다. 서버리스 PHP를 쉽게 만들기 위한 그의 오픈 소스 프로젝트인 Bref를 확인 하거나 2022년 서버리스 PHP에 대한 그의 visual course을 확인할 수 있습니다.

Heaps explained in PHP

https://doeken.org/blog/heaps-explained-in-php

PHP에서 heap을 사용하는 방식을 보여줍니다.
🤷 힙은 언제 유용합니까?

  • 가장 높은(또는 가장 낮은) 값에 직접 액세스
  • 많은 삽입 및 제거 작업
  • 배열 정렬
  • 우선 순위 대기열

이를 훌륭하게 구현한 Real world example은 revolt/event-loop package에서 찾을 수 있습니다.

이 글을 읽기 위해 Tree에 대한 약간의 지식은 유용하기 때문에 Trees and Tree Traversal in PHP를 먼저 읽는 것이 좋습니다 .

Implementation of Chain of Responsibility Design Pattern in PHP

https://orangesoft.co/blog/chain-of-responsibility-design-pattern-in-php

PHP에서 Chain of Responsibility 디자인 패턴 구현

             Chain of Responsibility:
+-------------------------------------------+
+-------+ | +---------+ +---------+ +---------+ | +--------+
| Input | -> | | Handler | -> | Handler | -> | Handler | | -> | Output |
+-------+ | +---------+ +---------+ +---------+ | +--------+
+-------------------------------------------+

async & await at the edge with ReactPHP

https://blog.wyrihaximus.net/2021/12/async-and-await-at-the-edge-with-reactphp/

Fiber를 지원하는 PHP 8.1이 출시되었습니다! ReactPHP maintainer 중 한 명이 사용 방법에 대해 씁니다.

PHP Benchmark: include() vs file_get_contents()

https://konstantin.blog/2021/php-benchmark-include-vs-file_get_contents/

Opcache 설정을 조정하면 include()가 file_get_contents()보다 빠를 수 있습니다.

Where does my validation live?

https://blog.frankdejonge.nl/where-does-validation-live/

유효성 검증을 어느 레이어(Controller Layer, Service Layer, Domain Layer)에 넣어야 할지, 각각 어느 점이 좋은지 설명합니다.

  • Controller validation: shapes and types
  • Service validation: from types to concepts concepts
  • Domain Layer: guarding invariants

How to build maintainable PHP applications

https://blog.ecotone.tech/how-to-build-maintainable-php-applications/

유지 관리 가능한 PHP 애플리케이션을 구축하고 프레임워크에서 비즈니스 로직을 분리하는 방법.

Making sense of the 8 log levels in PHP

https://darkghosthunter.medium.com/php-making-sense-of-the-8-log-levels-ddd27c4719a

여덟 레벨을 모두 설명하는데 저자 자신은 4개만 쓴다고 합니다.

  • Debug(디버그): 앱의 내부 작동을 보여주는 모든 것.
  • Error(오류): 발생해서는 안 되는 일이 발생했습니다.
  • Alert(경고): 단기적으로 앱 상태를 위험에 빠뜨리는 모든 것.
  • Emergency(긴급 상황): 응용 프로그램의 모든 부분이 작동을 멈췄습니다.

Overriding vendor classes

https://downing.tech/posts/overriding-vendor-classes

포크를 생성하지 않으려면 composer.json에서 autoloading을 적절하게 구성할 수 있습니다. 또는 옵션으로 cweagans/composer-patches와 함께 패치를 사용할 수도 있습니다.

Accessing private properties in PHP

https://www.lambda-out-loud.com/posts/accessing-private-properties-php/

Closure::bind를 통한 리플렉션 및 액세스 대신 객체를 배열로 캐스팅할 수 있습니다(하지만 그래야 할까요?).

@AllaertPatrick의 트윗

https://twitter.com/AllaertPatrick/status/1478323931924860928

때때로 코드에서 무슨 일이 일어나고 있는지 이해하기 위해 생성된 opcode를 살펴보는 것이 유용할 수 있습니다. phpdbg -p* file.php 명령이 도움이 될 것입니다.

AllaertPatrick에서 공유된 이미지

Community

PHP in 7 minutes

https://www.youtube.com/watch?v=IfcFQxYPTxo

Brent Roose의 영상.

What kind of language is PHP in 2022? Find out in 7 minutes!