PHP Annotated — August 2021

Php_annotated 이미지

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

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


PHP 8.1이 두 번째 베타 버전에 도달했으며 변경 사항 목록이 확정되었습니다. 결정이 필요한 것은 지금 투표 중인 Nullable Intersection types 뿐입니다.

한편, PHP internals에서는 이미 다음 릴리스의 기능에 대해 논의하고 있습니다. 2022년에 출시될 PHP 8.2의 처음 두 RFC에 대해 알아보려면 계속 읽어보시기 바랍니다.

PHP 8.1이 파이버를 갖게 됨에 따라 두 개의 인기 있는 PHP용 비동기 프레임워크가 힘을 합치고 공통의 추상화 위에서 함께 작업하기로 합의했습니다.

⚡️ News

PHP 8.1.0, Beta 2

https://www.php.net/archive/2021.php#2021-08-05-2

베타 릴리스는 PHP 8.1의 활발한 개발 단계가 끝났다는 신호이며, 이는 새로운 기능 및 변경 사항 목록이 최종적인 것으로 간주될 수 있음을 의미합니다(Nullable Intersection types 제외). 세 번째이자 마지막 베타 버전은 8월 19일 입니다.

Peter Kokot의 PHP 8.1 departures 이미지

PHP 8.1에는 어떤 기능이 추가될까요?
가장 주목할만한 변경 사항을 요약했습니다.

  • Enums (RFC).
  • First-class callables (RFC).
  • Readonly properties (RFC).
  • New operator in initializers (RFC).
  • Brand new never type for return values (RFC).
  • Fibers (RFC).
  • Final constants in classes (RFC).
  • Spread operator supporting string array keys (RFC).
  • Deprecation of implicit non-integer-compatible float to int conversions (RFC).
  • Deprecation of serializable interfaces (RFC).
  • Explicit octal notation with the 0o prefix (RFC).
  • Restricted usage of $GLOBALS (RFC).

더 자세히 알고 싶다면 PHP 8.1 “이전” 및 “이후” 예제를 훌륭히 모은 글을 확인하세요.

Brent Roose의 The Road to PHP 8.1이라는 10일짜리 뉴스레터도 있습니다.

모든 변경 사항에 대한 전체 설명은 PHP.Watch: php.watch/versions/8.1 에서 볼 수 있습니다 .

PHP.Watch에는 Directory Uploads in PHP 8.1라는 게시물도 있습니다 . PHP 8.1의 경우 $_FILES 배열에는 사용자의 디렉토리 구조 경로가 있는 full_path 섹션이 포함됩니다. 이것은 디렉토리 업로드를 지원하는 데 필요합니다.

ReactPHP and Amp join forces

PHP 8.1에 파이버가 추가되면서 비동기 PHP 코드가 조금 더 쉽고 예뻐졌습니다. 비동기 PHP용으로 널리 사용되는 두 라이브러리의 유지관리자들(maintainers)이 RevoltPHP 프로젝트를 발표했습니다. 그들은 공통의 이벤트 루프를 만들고 fiber 추상화를 공유하여 구현할 계획입니다.

Revolt PHP(@revoltphp)의 트윗

With Fiber in 8.1 a new age dawns for #PHP. @AsyncPHP and @ReactPHP are joining forces through @RevoltPHP collaborating on a shared event loop and Fiber abstraction. Stay tuned!

PhpStorm 2021.2 has been released

https://blog.jetbrains.com/phpstorm/2021/07/phpstorm-2021-2-release/

제네릭 지원, 열거형(enums), 배열 모양 및 이 릴리스에 도입된 기타 모든 것에 대한 모든 세부 정보가 포함된 이 블로그 게시물을 확인하십시오.

PHP

  • Basic support for generics in PHP
  • PHP 8.1 Enums
  • One-line array shapes
  • New inspections and quick-fixes
  • Refactoring opportunities inspections
  • Formatter improvements
  • Reworked Extract Method refactoring

IDE

  • Actions on save
  • New Terminal options
  • Run tests before commit
  • Browser pages reload on save
  • Automatic clean-up of caches and log directories
  • Advanced settings

Code With Me

  • Screen sharing

PHP 7.4.22, PHP 8.0.9

https://www.php.net/ChangeLog-7.php#7.4.22
https://www.php.net/ChangeLog-8.php#8.0.9

현재 branch에 대한 보안 및 버그 수정 업데이트.

🐘 PHP Internals

[RFC] Nullable Intersection types

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

Type intersection에 관한 RFC르 채택한 직후 Nikolas Grekas(Symfony core)가 의견을 게시했습니다. 그는 intersection을 nullable로 만들 수 있는 기능이 없으면 훨씬 덜 흥미롭다고 말했습니다.

기술적으로 PHP 8.1 branch는 이미 동결되었지만(frozen) PHP 팀은 이 제안에 예외를 적용하기로 결정했습니다.

class Foo
{
public (X&Y)|null $bar;

function setBar((X&Y)|null $bar = null): (X&Y)|null
{
return $this->bar = $bar;
}
}

Syntax choice is also put to a vote: ?X&Y or (X&Y)|null.
구문 선택도 투표에 포함됩니다: ?X&Y 또는 (X&Y)|null.

[RFC] Unwrap reference after foreach

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

현재 버전의 PHP에는 foreach 루프에 대한 전용 scope가 없습니다. 이것은 매우 직관적이지 않은 결과를 가져옵니다. foreach 루프가 끝난 후에도 $value의 reference와 배열의 마지막 요소에 대한 참조가 유지됩니다.

문제는 다음 예를 통해 쉽게 설명됩니다.

$array = [0, 1, 2];
foreach ($array as &$value) { /* ... */ }
// without calling unset($value),
// $value still points to the last element: $array[2]

foreach ($array as $value) {
// $array[2] will be updated each time with the values of $array
}
var_dump($array);

// Before RFC:
>
array(3) {
[0] => int(0)
[1] => int(1)
[2] => &int(1)
}

// After RFC:
> array(3) {
[0] => int(0)
[1] => int(1)
[2] => int(2)
}

이 RFC는 논리적으로는 문제 없지만 버그가 있어 보이는 동작을 수정하도록 제안합니다. foreach 루프 후에 $value에 대한 참조가 제거됩니다.

[RFC] Never For Parameter Types

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

PHP 8.1에는 never라는 새로운 반환값 유형이 있습니다. PHP 8.2의 경우 never를 매개변수 유형으로 사용할 수 있도록 하는 제안이 이미 있습니다.

RFC의 저자인 Jordan LeDoux는 never가 추상 클래스와 인터페이스에서 유용할 것이라고 생각합니다. 매개변수를 어떤 방식으로든 입력해야 함을 지정하는 데 사용할 수 있습니다.

이것은 제네릭의 동작을 모방하는 데 도움이 될 수 있습니다. 그러나 정적 분석기 및 PhpStorm에 대해서는 여전히 PHPDoc의 type description에 의존해야 합니다.

interface CollectionInterface {
public function add(never $input): self;
}

class A implements CollectionInterface {
public function add(int $input): self {}
}

🛠 Tools

frontdevops/php-evil

https://github.com/frontdevops/php-evil

eval()을 비활성화하는 extension. eval()은 함수가 아닌 언어 구조이므로, disable_functions로는 막을 수 없습니다. 그래서 저자는 자신만의 작은 extension을 만들어야 했습니다.

beyondcode/expose 2.0

https://github.com/beyondcode/expose/releases/tag/2.0.0

ngrok의 대안으로, 로컬 환경의 서비스를 전 세계에 몰래 서비스 하기 위한 멋진 도구입니다. 웹훅을 테스트하거나 앱을 시연하는 데 유용해야 합니다.

EcotoneFramework

https://github.com/ecotoneframework

PHP에서 DDD, CQRS 및 이벤트 소싱을 하기 위한 흥미로운 서비스 버스입니다. 속성을 통해 PHP 8 이상에서 작동하며 Laravel 및 Symfony에 대한 훌륭한 문서 및 통합 기능이 있습니다. 다음은 CQRS 구현의 예 입니다.

PHP-CSS-Parser

https://github.com/sabberworm/PHP-CSS-Parser

PHP로 작성된 CSS 파일용 파서. 이를 통해 CSS 파일을 데이터 구조로 추출하고 해당 구조를 조작하고 (최적화된) CSS로 출력할 수 있습니다.

Psalm 4.9.0

https://github.com/vimeo/psalm/releases/tag/4.9.0

저자인 Matt Brown 이 프로젝트를 떠난 후의 첫 번째 커뮤니티 릴리스입니다.

ergebnis/composer-normalize

https://github.com/ergebnis/composer-normalize

composer.json파일을 멋지게 보이게 하는 Composer용 플러그인입니다.

paragonie/paseto 2.0 – Stateless-token, a safe alternative to JWT.

https://github.com/paragonie/paseto/releases/tag/v2.0.0

JWT의 안전한 대안인 Stateless-token.

결함이 있는 JOSE(Javascript Object Signing and Encryption) 대신 안전한 Paseto(Platform-Agnostic SEcurity TOkens) 표준을 사용하자고 합니다.

JOSE 표준에 어떤 결함이 있는지는 여기서 확인해보세요.

chrome-php/chrome v1.0.0

https://github.com/chrome-php/chrome

헤드리스 모드에서 Chrome/Chromium을 제어하기 위한 패키지입니다.

darsyn/ip

https://github.com/darsyn/ip

Doctrine을 위한 헬퍼를 포함한, IP 주소 작업을 위한 Immutable value objects

MadLisp

http://madlisp.com/

PHP로 작성된 Lisp 인터프리터.

Symfony

The Symfony team now provides support in the Discussions section on GitHub.

https://github.com/symfony/symfony/discussions/42363

Symfony 팀은 이제 GitHub의 토론 섹션에서 도움(support)을 제공합니다.

Scaling the Symfony Demo app to the extreme with Varnish.

https://jolicode.com/blog/scaling-the-symfony-demo-app-to-the-extreme-with-varnish

Varnish를 통해 Symfony Demo app을 극단적으로(소수의 사용자에서 수만 명의 동시 사용자로) 확장해봅니다.

Symfony Lock

https://medium.com/geekculture/symfony-lock-dealing-with-shared-resources-concurrency-and-parallelism-f4df66a744de

공유 리소스, 동시성, 병렬성을 다룹니다.

A way to centrally handle Doctrine/Symfony access control.

https://medium.marco.zone/doctrine-symfony-centralized-access-control-d1f4717734e5

Doctrine/Symfony 액세스 제어를 중앙에서 처리하는 방법

How to use cascade delete in Doctrine

https://medium.com/accesto/how-to-delete-not-to-delete-yourself-accesto-blog-9c252f684db5

Doctrine에서 cascade 삭제를 사용하면서 모든 데이터를 잃지 않는 법.

A week of Symfony #763 (9-15 August 2021).

https://symfony.com/blog/a-week-of-symfony-763-9-15-august-2021

Laravel

Laracon Online

https://laracon.net/#schedule

9월 1일로 예정되어 있습니다.

laravelexamples.com

https://laravelexamples.com/

Laravel Daily YouTube 채널 작성자의 Laravel에 대한 유용한 예제 카탈로그입니다 .

LaravelDaily/Laravel-Roadmap-Learning-Path

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

어떤 개발 경험 수준에도 도움이 될 멋진 Laravel 교육 자료 모음입니다.

Building an app to scale on Laravel Vapor.

https://dyrynda.com.au/blog/scaling-on-laravel-vapor

Laravel Vapor에서 앱을 확장하는 방법.

Immutable dates in Laravel.

https://dyrynda.com.au/blog/laravel-immutable-dates/

Taylor Otwell(@taylorotwell)의 트윗

This week’s 8.53.0 release includes new “immutable_date” and “immutable_datetime” casts for Eloquent!

Carbon을 다루면서 흔히 하는 실수가 있죠.

$start = Carbon\Carbon::now();
$end = $start->addDay();
$end->diffForHumans($start); // 1 second before

Carbon을 쓰는 대신 CarbonImmutable을 사용하면 이 문제를 피할 수 있습니다.

$start = Carbon\CarbonImmutable::now();
$end = $start->addDay();
$end->diffForHumans($start); // 1 day after

Carbon\Carbon이나 Illuminate\Support\Carbon 대신 Illuminate\Support\Facades\Date로 바꿔주는 식으로 변경해줄 수도 있습니다.

📺 60+ Laravel collection methods in 15 minutes.

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

15분 안에 60 개 이상의 Laravel Collection method를 살펴봅니다.

📺 What’s new in Laravel v8.53.0

https://www.youtube.com/watch?v=8Iz1UqSbpwA

Laravel YouTube 채널 에서 더 많은 동영상을 확인하세요.

Yii

Yii framework team continues to release packages for the upcoming Yii 3: yiisoft/data-response, yiisoft/view, yiisoft/yii-view, yiisoft/mailer.

PhpStorm

i18n Ally

https://plugins.jetbrains.com/plugin/17212-i18n-ally

번역을 위한 문자열을 쉽게 작업할 수 있는 PhpStorm용 플러그인입니다. Laravel 및 Symfony에 대해 자동으로 구성되며 Yii, CodeIgniter 및 CakePHP에 대해 수동으로 구성할 수 있습니다.

Laravel Idea 4.4

https://laravel-idea.com/blog/2021/4-4-release

큰 업데이트가 있었답니다.

📺 Source diving the PhpStorm Pest plugin

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

Oliver Nybroe가 PhpStorm 플러그인 개발 방법을 보여주는 멋진 스트림 녹화.

💡 기타 읽을 만한 글

We don’t need runtime type checks

https://stitcher.io/blog/we-dont-need-runtime-type-checks

Sarah Golemon, Rasmus Lerdorf 및 Nikita Popov의 인용문과 함께 Brent Roose의 PHP 유형 시스템에 대한 흥미로운 사색입니다.

얼마 전, PHP의 제네릭이 조만간 나오지 않을 것이라는 것이 분명해졌고, 주요 이유 중 하나는 이를 구현하는 두 가지 방법이 있으며 둘 다 심각한 문제가 있다는 것입니다. 런타임 성능에 미치는 영향이 너무 크거나 구현이 너무 복잡하여 제대로 작동하지 않습니다. 두 접근 방식 모두 런타임 유형 검사 구현을 가정했습니다.

Sarah Golemon은,
(Hack이 이미 수행하고 있는) 런타임에 무시되는 제네릭이 대부분의 PHP 개발자에게 익숙하지 않은 패러다임 전환이라고 보며, 이런 변화는 5년 이상 걸릴 것이라고 생각합니다.

Brent는,
우리가 원하는 경우 PHP의 런타임 타입 체크를 해제하고 그 결과를 스스로 처리할 수 있어야 하며, 이런 시나리오에서는 정적분석기를 사용해야 한다고 말합니다.
이를 위해 이상적으로는 PHP가 built-in, opt-in 정적분석기와 함께 배포되어야 할 거라고 이야기 합니다.

Nikita는,
런타임에 지워지는 제네릭을 “비겁한 탈출구”라고 불렀습니다. 런타임에 지워지는 제네릭이 지원된다면 PHP의 유형 시스템 내에서 일부 부분은 런타임에 확인되고 다른 부분은 정적으로 확인되는 엄청난 불일치가 있음을 의미하기 때문입니다.

Brent가 런타임에 지워지거나 무시되는 제네릭에서 시작해야 하는 건 아니고, 먼저 런타임 유형 검사가 없는 PHP가 필요하고 그 위에 빌드하는 것을 이야기 했을 때는 그도 긍정적으로 생각했지만, PHP를 완전히 재설계 하지 못한다는 제약 안에서 일해야 하므로 힘들다고 답변했습니다.

Brent는 PHP internals에서 정적 분석 측면을 더 탐구하기를 바란다며 글을 마칩니다.

다음은 Joe Watkins의 주제에 대한 또 다른 의견입니다.

Joe Watkins(@krakjoe)의 트윗

Removing types from #PHP, even at runtime:

  1. fundamentally changes the dynamic nature of PHP
  2. will complicate the type system considerably
  3. is not a solution to the complexity of a generics implementation
    Source: I’ve experimented.
    TL;DR it isn’t happening …

(내가 해봤는데 그거 안 돼)

The evolution of a PHP object throughout the years

https://stitcher.io/blog/evolution-of-a-php-object

data transfer objects가 PHP 버전업에 따라 수년 간 어떻게 변화했는지 보여줍니다.

글의 예제를 단순화해서 2014년과 2021년을 비교해보았습니다.

August 2014: PHP 5.6

class BlogData
{
/** @var \DateTimeImmutable|null */
private $publishedAt;

/**
* @param \DateTimeImmutable|null $publishedAt
*/
public function __construct(
$publishedAt = null
) {
$this->publishedAt = $publishedAt;
}

/**
* @return \DateTimeImmutable|null
*/
public function getPublishedAt()
{
return $this->publishedAt;
}
}

November 2021: PHP 8.1

class BlogData
{
public function __construct(
public readonly ?DateTimeImmutable $publishedAt = null,
) {}
}

Functional programming and PHP 8

https://not-a-number.io/2021/functional-programming-and-php-8/

강력한 loophp/fpt(Functional Programming Toolbox) 툴 사용법을 예제와 함께 보여줍니다.

phpschool.io: PHP 8 Appreciate

https://www.phpschool.io/blog/2021/07/24/introducing-php-8-appreciate

PHP 8을 배우기 위한 CLI 워크숍.

b-viguier/php-emoji

https://github.com/b-viguier/php-emoji

이모지로 PHP 배열 함수를 설명합니다.

php-emoji 예시 이미지

📺 Videos

📺 What’s new in PHP 8.1 – Enums

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

Marcel Pociot의 열거형에 대한 자세한 둘러보기.

📺 Event Sourcery Full Course – CQRS and Event Sourcing.

https://www.youtube.com/playlist?list=PLQuwqoolg4aI6v1GvtRg3NgT0PBBHVqii

CQRS 및 이벤트 소싱.

📺 PHP Roundtable 82

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

전설적인 PHP 팟캐스트의 귀환. Sammy K를 응원 하고 새로운 호스트 Eric Van Johnson을 환영합니다!