PHP Annotated — 2022 Spring Catch-up

Php_annotated 이미지

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

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


News

PHP 7.4.29, PHP 8.1.5, and PHP 8.0.18

https://www.php.net/ChangeLog-7.php#7.4.29
https://www.php.net/ChangeLog-8.php#8.1.5
https://www.php.net/ChangeLog-8.php#8.0.18

내장된 종속성의 업데이트로 인한, Windows 사용자를 위한 보안 릴리스입니다. Windows가 아닌 사용자의 경우 일반적인 버그 수정 업데이트일 뿐입니다. PHP 7.3의경우 보안 문제가 있더라도 업데이트가 더 이상 릴리스되지 않습니다. PHP 7.3 또는 PHP 5.x 버전을 계속 사용하고 있다면 가능한 한 빨리 업데이트하는 것이 좋습니다.

Symfony 팀은 다가오는 Symfony 6.1 릴리스에서 최소 필수 PHP 버전을 8.1로 올렸습니다. Drupal 10 과 Laravel 10에서도 동일한 변화가 이루어졌습니다.

또한 최근 출시된 Ubuntu 22.04 LTS 에는 PHP 8.1이 사전 설치된 상태로 제공됩니다.

Updates from the PHP Foundation

https://opencollective.com/phpfoundation

  • 6명의 후원 개발자가 활발하게 핵심(core) 영역을 유지관리하고 있습니다.
    • PHP Foundation Core Developers를 구하는 것이 2022년의 목표였고 이 6명이 초기 멤버로 활동하게 됩니다.
    • 이 중에는 Xdebug의 Derick Rethans도 있는데, 일주일에 하루 일을 한다는 트윗을 남긴 것으로 보아 위 개발자들이 모두 full-time으로 일을 하는 것은 아닌가 봅니다.
  • php.foundation 웹사이트가 가동 중입니다.
    • 후원사가 많이 늘었네요. OP.GG도 꾸준히 후원하고 있습니다.
  • Core 개발에 대한 통찰력이 담긴 별도의 뉴스레터가 정기적으로 발행될 것입니다. 다음은 초판입니다: PHP Roundup #1.
  • Sebastian Bergmann의 핵심 개발자 인터뷰.

Developer Ecosystem Survey 2022

https://surveys.jetbrains.com/s3/t-developer-ecosystem-survey-2022

JetBrains의 연례 설문조사가 막 시작되었으며 물론 PHP에 대한 섹션도 있습니다. 작년의 결과에서와 같은 것을 볼 수 있을 것입니다. 설문조사에 참여해서 경품을 받을 수 있는 기회를 잡으세요!

News from PHP-FIG

  • Coding Style PER (PHP Evolving Recommendation)은 PHP-FIG에서 공식적으로 승인했으며 PSR-12를 대체합니다. 이것은 “라이브” 표준을 보여주는 최초의 PER 문서입니다. PER 덕분에 PHP에 새로운 구문이 추가될 때마다 다른 PSR 표준을 발표할 필요가 없습니다. 대신 SemVer에 따라 PER이 업데이트됩니다.
  • 새로운 PSR 초안이 승인되었습니다: PSR-22 – Application Tracing.

PhpStorm 2022.1 released

https://blog.jetbrains.com/phpstorm/2022/04/phpstorm-2022-1-release/

Blade, WordPress, ArrayShape annotation 등에 대한 개선 사항이 함께 제공됩니다. 짧은 What’s New 비디오를 확인하거나 전체 스토리를 보려면 블로그 게시물을 읽으십시오.

Composer 2.3 Release

https://blog.packagist.com/composer-2-3/

이 릴리스는 사용자 및 현대화된 내부 코드베이스를 위한 약간의 개선 사항을 제공합니다.

최근에 발견된 취약점도 있었습니다. CVE-2022-24828: Composer Command Injection. composer.json에 있는 URL에 명시적으로 나열된 Git 또는 Mercurial 리포지토리를 제어하는 공격자는 특수하게 조작된 분기 이름을 사용하여 composer 업데이트를 실행하는 시스템에서 명령을 실행할 수 있습니다.

composer self-update를 실행하여 Composer가 최신 상태인지 확인하십시오.

Craft CMS 4

https://craftcms.com/blog/craft-4?ref=phpannotated

인기 있는 오픈 소스 CMS의 주요 업데이트가 릴리스되었습니다.

PHP Core

Core 뉴스의 대부분은 PHP Foundation의 PHP Roundup 시리즈에서 자세히 다루므로 간략하게만 언급하겠습니다.

Last call for PHP 8.2 release managers!

https://externals.io/message/117595#117664

PHP 8.2 릴리스 관리자를 구하는 마지막 요청입니다!
3년 반을 약정할 수 있어야 하며 PHP, Git, 가급적이면 C에 대한 지식이 있어야 합니다. 이미 베테랑 후보자 1명과 신인 후보자 6명이 있습니다.

✅ [RFC] Redacting parameters in back traces #PHP8.2

https://wiki.php.net/rfc/redact_parameters_in_back_traces

예외 시 back trace 기록에서 민감한 정보를 노출하는 것을 막기 위해 함수의 매개변수에 적용할 수 있는 새로운 표준을 제시했습니다.

✅ [RFC] Allow null and false as stand-alone types #PHP8.2

https://wiki.php.net/rfc/null-false-standalone-types

현재 null은 단일 유형으로 선언할 수 없습니다. false는 더 나아가 전통적으로 null 대신 오류 상태를 전달하기 위해 사용됐고, 이게 union type RFC에 “literal type”으로 소개된 주요 이유였습니다.

이 RFC에선 null과 false를 단일 타입으로 사용할 수 있도록 제안합니다.

✅ [RFC] Deprecate ${} string interpolation #PHP8.2

https://wiki.php.net/rfc/deprecate_dollar_brace_string_interpolation

PHP는 큰따옴표( “) 및 heredoc을 사용하여 다양한 방식으로 문자열에 변수를 포함할 수 있습니다.

  • 변수 직접 포함(“$foo”)
  • 변수 외부의 중괄호(“{$foo}”)
  • 달러 기호 뒤의 중괄호(“${foo}”)
  • 가변적인 변수(“${expr}”, (string) ${expr}와 동일한 표현)

옵션 1과 2에는 장단점이 있습니다. 옵션 3과 4는 중복되는 구문으로 인해 쉽게 혼동되고, 3은 1과 2보다 성능이 완전히 떨어지며, 4는 문자열 보간에서 거의 유용하지 않은 완전히 다른 의미를 갖습니다.

이 RFC 는 PHP 8.2에서 옵션 3과 4를 더 이상 사용하지 않고 PHP 9.0에서 제거할 것을 제안합니다.

✅ [RFC] Deprecate and Remove utf8_encode and utf8_decode

https://wiki.php.net/rfc/remove_utf8_decode_and_utf8_encode

  • PHP 8.2에서 utf8_encode 및 utf8_decode의 모든 사용은 표준 E_DEPRECATED 진단을 발생시킵니다.
  • PHP 9.0에서는 utf8_encode 및 utf8_decode 함수가 PHP에서 제거됩니다.
  • 문서나 사용 중단(deprecation) 메시지는 사용자가 사용 방법이 올바른지 확인하고 기본 대체제로 mb_convert_encoding를 권장하며 UConverter::transcode와 iconv도 선택지로 나열하도록 권장합니다.

✅ [RFC] Undefined Variable Error Promotion

https://wiki.php.net/rfc/undefined_variable_error_promotion

이 RFC는 정의되지 않은 변수에 액세스하는 것이 PHP의 다음 메이저 버전(Target: PHP 9.0)에서 잘못된 동작으로 렌더링되고, 정의되지 않은 변수에 액세스하면 오류 예외가 발생할 것을 제안합니다.

🗳 [RFC] Readonly classes

https://wiki.php.net/rfc/readonly_classes

PHP 8.1은 PHP RFC: Readonly properties 2.0을 통해 읽기 전용 속성에 대한 지원을 추가 했습니다. 그러나 특히 많은 속성을 포함하는 경우 (준)불변 클래스를 선언하는 것은 여전히 쉽지 않습니다. 따라서 이 RFC는 readonly 클래스에 대한 지원을 추가할 것을 제안합니다.

투표는 2022-05-11까지인데, 10일 현재 27:6으로 찬성이 우세합니다.

❌ [RFC] Sealed Classes

https://wiki.php.net/rfc/sealed_classes

봉인된 클래스는 속성 값 목록에 명명된 클래스에 의해서만 직접 확장될 수 있도록 제안되었으나 투표는 2/3의 찬성표를 얻지 못하고 거부(Decline)되었습니다.

🆕 [RFC] Add true type

https://wiki.php.net/rfc/true-type

위에서 언급한 null and false as standalone types이 통과됨에 따라 true도 독립된 타입으로 승격하자는 제안입니다.

🆕 [RFC] Disjunctive Normal Form Types

https://wiki.php.net/rfc/dnf_types

DNF(Disjunctive Normal Form)는 부울 표현식을 구성하는 표준 방법입니다.

이 RFC 는 합집합과 교집합 유형을 허용하기 위해 DNF 유형을 지원할 것을 제안합니다.

[RFC] final class Collections\Deque

https://wiki.php.net/rfc/deque

최적화된 데이터 구조를 PHP에 추가하려는 계획의 일환으로 첫 번째 제안이 준비되었습니다.
Deque – 이것은 양방향 대기열입니다. 즉, 시작과 끝에서 항목을 추가 및 제거할 수 있습니다. SplQueue또는 SplDoublyLinkedList 대신 사용하여 성능을 향상시키고 메모리 소비를 줄일 수 있습니다.

RFC Introduce a class-string type

https://gist.github.com/cspray/0f4e67e8731a8ea9382147707e75287f

공식 RFC는 아니지만 class-string을 실제 유형으로 만드는 것은 흥미로운 아이디어입니다. 이미 정적 분석기의 주석에서 널리 사용되기 때문입니다.

Tools

CanIPHP.com

https://caniphp.com/

caniuse.com처럼 PHP 기능별로 사용할 수 있는 버전을 찾을 수 있습니다.

clue/stream-filter

https://github.com/clue/stream-filter

PHP에서 스트림 필터링에 대한 간단하고 현대적인 접근 방식입니다.

PHP에서 스트림 필터를 사용하여 이런 미친 짓도 할 수 있고, 반대로 이렇게 실용적인 것도 할 수 있습니다.

(두 예시는 final 키워드를 제거하거나 모든 접근 제한을 푸는 행위를 하고 있어서 저는 둘 다 미친 짓처럼 보이기도…)

sfx101/deck

https://github.com/sfx101/deck

PHP 초보자에게 유용할 수 있는 로컬 웹 개발 환경의 빠른 시작 및 구성을 위한 GUI 도구입니다.

marijnvanwezel/try

https://github.com/marijnvanwezel/try

단일 명령으로 Composer 패키지를 사용해 볼 수 있는 간단한 CLI 도구입니다. 그냥 설치하고 실행 해보세요: try %vendor%/%package%.

frodeborli/moebius

https://github.com/frodeborli/moebius

PHP 버전 8.1 이상을 위한 Golang과 유사한 코루틴. 저자는 자신의 이벤트 루프 구현체와 자체 테스트 프레임워크를 사용했습니다.

Fiber를 사용하고, Swoole과도 비슷해보이지만 별도 extension이 필요 없습니다.

Crell/AttributeUtils

https://github.com/Crell/AttributeUtils

속성(attribute))의 구문 분석 및 관리를 용이하게 하는 유틸리티입니다.

doctrine/annotations 혹은 doctrine annotation interface가 적용된 PHP 8의 속성을 모두 읽을 수 있는 koriym/Koriym.Attributes도 흥미롭습니다.

spatie/visit

https://github.com/spatie/visit

모든 URL의 응답을 아름답게 표시하는 CLI HTTP 클라이언트입니다. colorize(code highlighting)하기 위해 bat과 jq를 사용합니다.

Think of it as curl for humans.

laravel/valet

https://github.com/laravel/valet

Mac용 경량 로컬 개발 환경입니다. Docker 또는 VirtualBox 대신 기본 Nginx와 PHP만 있습니다. 라라벨 뿐만 아니라 모든 프로젝트에서 사용할 수 있으며 v3부터는 폴더(프로젝트)마다 PHP 버전을 다르게 사용할 수 있습니다.

roach-php/core

https://github.com/roach-php/core

PHP를 위한 완벽한 웹 스크래핑 툴킷.

PHPStan 1.6.0

https://phpstan.org/blog/phpstan-1-6-0-with-conditional-return-types

조건부 리턴 타입 및 정수(integer) 마스크를 지원하여 출시되었습니다.

flow-php/etl

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

ReactPHP 또는 Amphp를 통한 비동기 처리를 지원하는 PHP용 ETL(Extract Transform Load) 데이터 처리 라이브러리입니다.

igorhrcek/wp-cli-secure-command

https://github.com/igorhrcek/wp-cli-secure-command/

WordPress 설치를 보호하는 하나의 CLI command.

williarin/wordpress-interop

https://github.com/williarin/wordpress-interop

다른 PHP 응용 프로그램에서 WordPress 데이터베이스에 더 쉽게 액세스할 수 있도록 하는 Doctrine/DBAL 기반 패키지입니다.

sj-i/php-profiler

https://github.com/sj-i/php-profiler
https://github.com/reliforp/reli-prof

php-profiler에서 reliforp/reli-prof로 이름을 바꾸고 있습니다.

순수 PHP(FFI)로 구현된 PHP용 샘플링 프로파일러입니다. flame 다이어그램을 생성하고, top-like 모드(demon mode도 있음)에서 trace 출력을 실행하는 등의 작업을 수행할 수 있습니다.

mrsuh/php-var-sizeof

https://github.com/mrsuh/php-var-sizeof

A function to get the memory size for any variable that promises to be more accurate compared to memory_get_usage(). Requires PHP 7.4 or higher with FFI.

memory_get_usage()에 비해 더 정확한, 모든 변수의 메모리 크기를 가져오는 함수 입니다. FFI를 사용하는 PHP 7.4 이상이 필요합니다.

davidcole1340/ext-php-rs

https://github.com/davidcole1340/ext-php-rs

Rust에서 PHP 확장을 빌드하기 위한 Zend API에 대한 바인딩입니다.

easysoft/phpmicro

https://github.com/easysoft/phpmicro

당신의 CLI 툴과 함께 (PHP에 구애받지 않는) 바이너리로 배포될 수 있도록 정적으로 컴파일된 마이크로 PHP 인터프리터입니다. Marcel Pociot가 프로세스를 자동화하기를 기대합니다!

While other people argue about PHP not being a good choice, I started working on making PHP/Laravel Zero apps truly portable

Symfony

See what’s coming in Symfony 6.1.

https://symfony.com/blog/category/living-on-the-edge/6.1

📺 Harmonious Development with Symfony 6

https://symfonycasts.com/screencast/symfony

이제 Symfony를 시작하기 위한 2시간 이상의 튜토리얼이 SymfonyCasts에서 완전히 무료로 제공됩니다.

Using Symfony Form in WordPress.

https://jolicode.com/blog/using-symfony-form-in-wordpress

WordPress에서 Symfony Form 사용하기

“Symfony: The Fast Track”

https://symfony.com/book

초보자와 숙련된 개발자 모두를 위한 공식 Symfony 책입니다. Symfony 6 기준.

Symfony Station Communiqué – April 29, 2022.

https://www.symfonystation.com/Symfony-Station-Communique-29-April-2022

Laravel

📺 Laravel Origins: The Documentary

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

이 비디오는 Laravel이 왜 생겨났는지, 지난 10년 동안 어떻게 성장했는지, 그리고 Taylor와 더 넓은 Laravel 커뮤니티의 미래에 대한 이야기를 알려줍니다.

Laravel Idea 5.3

https://laravel-idea.com/blog/2022/5-3-release

인기 있는 유료 PhpStorm 플러그인 업데이트.

LaravelProTips.com – A collection of useful articles and tweets.

https://laravelprotips.com/

유용한 기사 및 트윗 모음.

alexeymezenin/laravel-best-practices

https://github.com/alexeymezenin/laravel-best-practices

더 많은 Laravel 모범 사례.

한국어 버전은 2018년에 임영록(cherrypick)님이 번역해주셨습니다. 원래의 저장소는 작년까지도 계속 업데이트 되고 있었네요.

📺 Build a Laravel app and deploy it to production in 5 hours

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

Brent가 시작부터 프로덕션 배포까지의 과정을 5시간 동안 빠르게 진행합니다.

📺 Xdebug 3: Laravel Sail with PhpStorm.

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

Derick Rethans가 Laravel Sail Docker 환경에서 Xdebug를 활성화하고 설정하는 방법을 보여줍니다.

Yii

Yii news 2022, issue 1.

https://opencollective.com/yiisoft/updates/yii-news-2022-issue-1

Interview Questions For Yii 2

대부분은 일반적으로 PHP에 관한 것이며 모든 구직자에게 유용할 수 있습니다.

기타

Pascal Landau의 PHP 개발자용 Docker에 대한 포괄적인 게시물

https://www.pascallandau.com/docker-php-tutorial/

2022년 PHP 8.1 애플리케이션을 위한 Docker 시작하기, PHP 8.1에서의 PhpStorm, Docker 및 Xdebug 3 등 그의 웹 사이트에서 더 확인해보세요.

Posts on naming constructors by Andreas Möller and by Stefan Priebsch.

Naming constructors(생성자에 이름을 지어주기)에 관한 두가지 글입니다.

Matthias Verraes의 Named Constructors in PHP에서 출발하는 글입니다. 기본 생성자 하나만 제공되는 PHP에서 constructor 대신 도메인을 충분히 표현하는 static method로 overloading이 안 되는 문제를 보완하는 방식입니다.

class SomeValueObject
{
private function __construct(
...
) {
...
}

public static function fromInt(int $value): self
{
...
}

public static function fromString(string $value): self
{
...
}
}

How the Middleware Pattern works and can easily be applied in PHP.

https://doeken.org/blog/middleware-pattern-in-php

미들웨어 패턴이 작동하는 방식과 PHP에서 쉽게 적용할 수 있는 방법.

How To Mock Functions That Have External HTTP Requests.

https://hermanradtke.com/how-to-mock-functions-that-have-external-http-requests/

외부 HTTP 요청이 있는 함수를 mocking하는 방법.

Writing Readable PHP

https://writing-readable-php.com/

Freek Van der Herten과 Christoph Rumpel의 유료 강좌로, 여러분과 여러분의 동료 및 미래의 자신을 위해 코드를 즐겁게 읽을 수 있는 간단한 팁을 제공합니다.

PHP Tricks: Multi-value match()

https://peakd.com/hive-168588/@crell/php-tricks-multi-value-match

하나의 match 표현식(PHP 8.0 이상)에서 여러 값을 비교할 수 있다는 것을 알고 계셨습니까? 이와 같이:

function mayFriend(User $u1, User $u2, Group $group): FriendPermission
{
return match ([$u1->inGroup($group), $u2->inGroup($group)]) {
[true, true] => FriendPermission::Allow,
[true, false] => FriendPermission::WithApproval,
[false, true] => FriendPermission::WithApproval,
[false, false] => FriendPermission::Deny,
};
}

Interfaces are not class templates

https://www.exakat.io/en/interfaces-are-not-class-templates/

메서드가 없는 유효한 인터페이스를 활용하는 방법을 설명합니다.

Speeding up array_merge().

https://www.exakat.io/en/speeding-up-array_merge/

배열을 합치기 위해 loop 안에서 여러번 array_merge를 호출하지 말고, array_merge가 여러 인자를 받을 수 있으므로 한번에 실행하라고 조언합니다.
여러 인자를 받을 수 있는 implode(), array_sum()도 마찬가지의 효과가 있습니다.
최신 버전의 PHP를 쓰기만해도 성능 개선 효과를 볼 수 있습니다.

All the Dynamic Syntaxes in PHP – Good source for interview questions?

https://www.exakat.io/en/all-the-dynamic-syntaxes-in-php/

PHP의 동적 구문.

Solving Open Source Supply Chain Security for the PHP Ecosystem

https://paragonie.com/blog/2022/01/solving-open-source-supply-chain-security-for-php-ecosystem

PHP 생태계를 위한 오픈 소스 공급망 보안 해결. Paragon IE 사람들의 계획(initiatives)에 대한 흥미로운 게시물입니다. 그들은 이제 앱과 종속성을 안전하게 업데이트하기 위해 Gossamer라는 도구를 개발하고 있습니다. 이전에는 PHP 코어에 libsodium을 도입 하고 JWT에 대한 더 안전한 대안인 Paseto를 만들고 다른 도구도 개발했습니다.

Service locator: an anti-pattern.

https://stitcher.io/blog/service-locator-anti-pattern

라라벨의 파사드나 헬퍼 함수가 Service locator 패턴을 기반으로 만들어져있고, 여기에서 발생하는 문제를 설명합니다. 이런 문제는 의존성 주입이 해결한다고 결론을 냅니다.

(Brent가 2018년 stitcher에 쓴 글인데, 왜 지금 추천을 했는지는 모르겠네요.)

📺 Xdebug 3: Debugging Unit Tests with PhpStorm.

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

Derick Rethans의 강의 영상입니다.

📺 Learn PHP The Right Way – Full PHP course in 88 videos for free.

https://www.youtube.com/playlist?list=PLr3d3QYzkw2xabQRUpcZ_IBk9W50M9pe-

88개 동영상이 포함된 전체 PHP 과정을 무료로 제공합니다.

Generics

PHP는 최근에 제네릭 관련 활동을 많이 보였으므로 이 포스트에서 제네릭 관련 섹션을 제공합니다.

  • 📺 먼저 Brent의 Generics에 대한 비디오 시리즈 Generics in PHP를 확인하세요.
  • 더 자세히 알아보려면 Generics 구현 접근 방식에 대한 게시물에 관심이 있을 수 있습니다 .
  • PHP로 구현하는 흥미로운 프로젝트를 시도해보세요 : mrsuh/php-generics. 흥미롭게도 Reddit 에서는 성능을 위해 PHP에서 런타임 유형 검사를 삭제하는 것에 대한 토론이 있었습니다. 위의 도구는 타입 제거 방식(Type erasure)을 구현하므로 이론적으로는 다음과 같이 성능 관련 사례로 사용할 수 있습니다 : composer dump-generics --type=type-erasure.
  • 제네릭의 주요 응용 프로그램 중 하나는 컬렉션입니다. Comparing PHP Collections이라는 글을 확인하십시오.
  • 그리고 마지막으로 @SerafimArts의 재미있는 작품을 소개합니다.

generics gif by SerafimArts

Community

(PHP 뽕 주의)

📺 PHP isn’t dead, featuring the Laravel Origins cast.

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

PHP is definitely the best array-oriented programming language

https://twitter.com/savant/status/1519785011381161984

“PHP doeSNt sCaLE”

https://twitter.com/levelsio/status/1520354529421983745