PHP Annotated – April 2020

Php_annotated_monthly 이미지

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

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


⚡️ News & Releases

PHP

PHP 7.4.5, PHP 7.3.17, and PHP 7.2.30 are released.

Composer v2.0 Alpha

https://php.watch/articles/composer-2

4월 5일은 Composer repository에 첫 commit이 올라온 지 딱 9년째 되는 날이었습니다. 두번째 메이저 릴리스에서 어떤 점이 추가됐고 어떻게 변경됐는지 확인할 수 있습니다. 지금 composer self-update --snapshot를 실행해보세요.

실행하면 최신 스냅샷으로 업데이트 됩니다.

❯ composer self-update --snapshot
Updating to version 8ea787baa170ee462ee791c65b469ef62790f8aa (snapshot channel).
Downloading (100%)
Use composer self-update --rollback to return to version 1.10.5

다시 돌아가고 싶다면 composer self-update --rollback
혹은 특정 버전으로 업데이트 composer self-update 1.10.5

바뀐 점 몇 가지 소개해드릴게요.

Faster download times

Packages와 meta data를 병렬로 다운로드 되기 때문에, 캐시가 없는 상태라면 버전 1에 비해 2배 가량 빠릅니다. 게다가 HTTP/2를 사용해 TLS session과 DNS 응답을 공유해 더욱 속도를 낼 수 있었습니다.

Composer v1이라면 hirak/prestissimo로 이런 효과를 조금 얻을 수 있습니다.

Partial offline support

COMPOSER_DISABLE_NETWORK라는 환경 변수가 1로 세팅되어 있다면, 네트웍을 전혀 사용하지 않고 composer.lock과 캐시된 파일만으로 설치를 시도합니다.

Dry-run support for require and remove commands

말 그대로 require와 remove 커맨드에 --dry-run 옵션이 추가되어 실제 업데이트 하지 않고도 시험해볼 수 있습니다.

Running as root requires confirmation

root 사용자로 실행하는 건 위험한 일이지만 간혹 필요한 상황이 있습니다. 이전 버전에선 root 사용자로 실행하면 warning을 띄우는데 그쳤다면, 이제는 질문에 답을 해야 합니다. 물론 interaction flag를 꺼둘 수도 있긴 합니다.

New repository metadata format

새로운 repository metadata format을 제공합니다. 새로운 포맷은 가볍고, repository 운영자가 개별 패키지를 위한 URL endpoint를 제공할 수 있게 됩니다.

Packagist.org는 이미 지원하고 있답니다.

PhpStorm 2020.1

https://www.jetbrains.com/phpstorm/whatsnew/?_ga=2.91147290.1244278781.1587564338-44216834.1547258235

주요 변화는

  • composer.json support
  • Code coverage with PCOV and PHPDBG
    • Code coverage 측정을 위해 Xdebug 뿐 아니라 가벼운 krakjoe/pcov나 훨씬 빠른 커버리지 측정을 할 수 있는 built-in PHPDBG를 선택할 수 있게 됐습니다.
  • PHPUnit toolbox
    • PHPUnit 버전을 빠르고 쉽게 업그레이드 할 수 있게 해주는 툴
    • 에디터에서는 deprecation을 보여주고 제안하기도 합니다
  • PHP type inference improvements
    • 몇몇 타입 추론이 개선됐습니다
  • ML-assisted ranking for code completion
    • 코드 완성 도구 팝업에서 머신 러닝 기반으로 추천 순서를 바꿔줍니다. 기본으로 disabled 되어 있답니다.
    • 궁금하신 분들은, PHP under Preferences/Settings | Editor | General | Code Completion.
  • Metadata
    • 원래 .phpstorm.meta.php를 활용해 메타데이터를 설정할 수 있었는데, 많은 발전이 있었다고 합니다. 여전히 활발히 개발중인 도구입니다.
  • PHP Debug in HTTP Client
    • HTTP Client를 통해 실행할 때도 XDebug 같은 디버깅 툴을 사용할 수 있습니다.
  • default font 추가 : JetBrains Mono
  • 모든 OS에서 동일한 테마로 설정할 수 있는 light theme : IntelliJ Light
  • Git > Interactively Rebase from Here 가능이 많이 개선 됐습니다.
  • Commit 창이 그동안 modal만 있었는데, 일반 탭처럼 사용할 수 있는 옵션이 있습니다.
  • Database Tools
    • Excel export 기능
    • 에디터의 쿼리 아래 바로 실행 결과를 보여주는 옵션
    • Run configurations에서 DB 쿼리 실행
  • 괄호의 시작과 끝을 옮겨다닐 수 있는 Action 추가! (맥에서는 ^M)

🐘 PHP Internals

PHP 8 release schedule

https://wiki.php.net/todo/php80

첫 알파 버전은 6월 18일로 예상하고 최종 릴리스는 12월 3일로 계획되어 있습니다.

[RFC] Constructor Property Promotion

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

Larry Garfield가 analysis of PHP’s object ergonomics라는 상세한 분석을 썼습니다. (2020년 4월 22일 현재 이 페이지는 접근이 되지 않습니다)

그는 아래 세가지 RFC에 집중해야 한다고 끝마쳤는데요.

  • constructor promotion
  • named parameters
  • compound Property Visibility

그 분석에 따르면, 이 RFC 제안들은 이런 코드를

class Point {
public float $x;
public float $y;
public float $z;

public function __construct(
float $x = 0.0,
float $y = 0.0,
float $z = 0.0
) {
$this->x = $x;
$this->y = $y;
$this->z = $z;
}
}

이렇게 쓸 수 있게 해준답니다.

class Point {
public function __construct(
public float $x = 0.0,
public float $y = 0.0,
public float $z = 0.0
) {}
}

[RFC] Allow trailing comma in parameter list

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

PHP 7.3부터는 함수 호출 시 argument 목록 끝에 comma를 넣을 수 있었는데요. 선언부에도 허용하도록 제안이 올라왔습니다. target은 PHP 8.0입니다.

[RFC] Stricter type checks for arithmetic/bitwise operators

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

배열이나 resource, object 등에 산술/비트 연산을 시도하면 TypeError를 발생시키는 제안입니다.

[RFC] Type casting in array destructuring expressions

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

예제를 살펴보시죠.

[(int) $now, (int) $future] = ["2020", "2021"];

// The same as the following
[$now, $future] = ["2020", "2021"];
$now = (int) $now;
$future = (int) $future;

[RFC] throw expression

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

이 제안은 accept 됐습니다. PHP 8에서 throw는 더이상 문(statement)이 아니라 식(expression)으로 인식됩니다. 그 말은, arrow 함수, 3항 연산자 등의 구조에서 사용될 수 있다는 말입니다.

$callable = fn() => throw new Exception();

$foo = $bar['key'] ?? throw new KeyNotSetOnBarException();

[RFC] Attributes v2

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

Benjamin Eberlei와 Martin Schröder가 제안한, 흔히 annotation이라고 불리는 attribute 기능을 PHP core로 가져오기 위한 제안이 크게 진전이 있었습니다.
제안이 통과할 가능성이 매우 크고, 문법은 << >> 혹은 @:. 중에 투표 중입니다. 5월 4일까지 투표를 진행합니다. << >> 문법이 압도적이네요.

<<ExampleAttribute>>
class Foo
{
<<ExampleAttribute>>
public $x;

<<ExampleAttribute>>
public function foo(<<ExampleAttribute>> $bar) { }
}

[RFC] Mixed Type v2

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

현재 return 타입이 명시되지 않은 함수는 개발자가 잊은 건지 어떤 이유로 넣지 않기로 한 것인지 확실하지 않았습니다. 게다가 mixed라는 pseudotype은 이미 PHP manual에서 사용되고 있었죠.
Máté Kocsis와 Danack은 mixed 타입을 PHP 8에 넣자고 제안했습니다. array|bool|callable|int|float|null|object|resource|string 타입의 결합을 의미하도록 말이죠.

[RFC] non-capturing catches

https://wiki.php.net/rfc/non-capturing_catches

catch block에서 사용하지도 않을 변수를 선언하지 않도록 생략하게 해주는 RFC입니다.

try {
changeImportantData();
} catch (PermissionException) { // The intention is clear: exception details are irrelevant
echo "You don't have permission to do this";
}

[RFC] Match expression

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

이전에 올라온 것처럼 switch의 구조를 변경하지 않고 Ilija Tovilo는 match라는 표현을 사용해 switch문의 결함(타입 체크가 안 되는 문제나 값을 반환할 수 없는 점 등)을 피하도록 제안했습니다. 훗날 패턴 매칭으로도 확장할 수 있을 것으로 기대하고 있습니다.

$expressionResult = match ($condition) {
1, 2 => foo(),
3, 4 => bar(),
default => baz(),
};

[RFC] Pipe Operator v2

https://wiki.php.net/rfc/pipe-operator-v2

두번째 올라오는 Pipe Operator(|>) 제안입니다. 순차적으로 실행하면서 이전 함수의 결과를 다음 함수의 인자로 넘겨줄 수 있게 합니다.

$result = "Hello World"
|> 'htmlentities'
|> 'explode'
|> fn($x) => array_map(fn($v) => 'strtoupper', $x)
|> fn($x) => array_filter(fn($v) => $v != 'O');

거절된 제안들

Server-Side Request and Response Objects
Userspace operator overloading
Write-Once (readonly) Properties
Compact Object Property Assignment

🛠 Tools

jlaswell/compote

https://github.com/jlaswell/compote

Go로 만들어진 가벼운(lightweight) 의존성 관리 도구. Composer를 대체하기위한 것이 아니라 CI 파이프라인, 자동화 workflow, 메모리가 제한된 환경 등의 특정 사용 사례를 보완하는 것입니다.

repman.io

https://repman.io/

Private PHP Package Repository Manager.

Add and manage private PHP Composer dependencies in Cloud or behind your firewall

global CDN을 통해 packagist.org의 proxy를 제공하기도 합니다.

clue/graph-composer

https://github.com/clue/graph-composer

여러분 프로젝트의 composer 의존성을 그래프로 그려줍니다.

VKCOM/noverify v0.2.0

https://github.com/VKCOM/noverify/releases/tag/v0.2.0

Go로 만들어진 PHP를 위한 정적 분석 도구입니다.

markrogoyski/math-php 1.0

https://github.com/markrogoyski/math-php

MathPHP - Powerful Modern Math Library for PHP

첫 stable 릴리스입니다.

ackintosh/ganesha 1.0

https://github.com/ackintosh/ganesha

PHP 어플리케이션을 위한 Circuit Breaker 패턴 구현체입니다.

이 블로그 포스트를 확인해보세요.

Spiral Framework

https://spiral.dev/

고성능의 hybrid PHP+Go framework.

Symfony

migrify/symfony-route-usage

https://github.com/migrify/symfony-route-usage

Symfony app에서 사용하지 안는 route를 찾도록 도와줍니다. 이 블로그 포스트를 확인하세요.

How to Migrate Spaghetti to 304 Symfony 5 Controllers Over Weekend

https://www.tomasvotruba.com/blog/2020/04/13/how-to-migrate-spaghetti-to-304-symfony-5-controllers-over-weekend/

A Week of Symfony #694 (13-19 April 2020)

https://symfony.com/blog/a-week-of-symfony-694-13-19-april-2020

Laravel

6 Laravel Eloquent Secrets

https://laravel-news.com/6-eloquent-secrets

  • Snake Attributes
  • Pagination
  • Appending custom values to models
  • Mutators for non-existing columns
  • Eager loading with $with
  • Model keys

Building complex forms with Laravel Livewire

https://freek.dev/1609-building-complex-forms-with-laravel-livewire-in-oh-dear

Oh Dear라는 서비스에서 복잡한 form 렌더링을 위해 Livewire를 사용한 방식을 소개합니다.

Mixing event sourcing in a traditional Laravel app

https://freek.dev/1634-mixing-event-sourcing-in-a-traditional-laravel-app

Brent의 동료인 Freek이 함께 일하는 프로젝트에서 논의한 내용을 두 부분을 나누어 각자 글을 올렸습니다.

그들은 상태 기반 시스템과 이벤트 소스 시스템을 결합하는 방법을 찾고 싶었고, 강력한 bounded context를 생성해서 이벤트에만 의존해 통신하도록 설계했다고 합니다.

우선 Brent가 먼저 Combining event sourcing and stateful systems라는 시스템의 설계에 관해 글을 올렸고,

이를 어떻게 구현했는지 Freek가 이 글에서 설명합니다.

Dynamic relationships in Laravel using subqueries

https://reinink.ca/articles/dynamic-relationships-in-laravel-using-subqueries

Rethinking Laravel’s middleware argument API

https://timacdonald.me/rethinking-laravels-middleware-argument-api/

The Beauty of Single Action Controllers

https://driesvints.com/blog/the-beauty-of-single-action-controllers/

Jeffrey Way가 올린 트윗(현재 찾을 수 없음)에서 컨트롤러 이름을 단수로 짓는지 복수로 짓는지 질문했습니다. 이에 Dries Vints는 둘 다 해당하지 않고, 하나의 역할만 하는 Single Action Controller를 만든다고 답했고 이에 대한 생각을 글로 풀어냈습니다.

📺 Screencasts from Mohamed Said

Mohamed Said가 Laravel에서 CSRF protection, CORS, authentication, HTTP Middleware가 어떻게 동작하는지 설명합니다.

🔈 The Laravel Podcast

https://laravelpodcast.com/episodes/the-ethos-of-laravel

The Ethos of Laravel, with Taylor Otwell

Yii

Yii news 2020, issue 3

https://opencollective.com/yiisoft/updates/yii-news-2020-issue-3

Zend/Laminas

April 2020 Technical Steering Committee Meeting

https://getlaminas.org/blog/2020-04-07-tsc-meeting.html

🌀 Async PHP

hyperf/hyperf

https://github.com/hyperf/hyperf

A framework for building microservices or middlewares based on Swoole coroutines.

clue/reactphp-flux

https://github.com/clue/reactphp-flux

이 패키지를 사용하면 ReactPHP에서 동시에 실행되는 작업의 수를 제한할 수 있습니다.

기타 읽을 만한 글

Testing without mocking frameworks.

https://blog.frankdejonge.nl/testing-without-mocking-frameworks/

Coding with feature flags.

https://www.boxuk.com/insight/coding-with-feature-flags/

Feature flag(flag 값을 사용해서 특정 기능을 켜고 끄는 것)의 종류와 이를 CD(Continuous Delivery)에 활용해 좀 더 빠르게 피드백을 받고 배포할 수 있다는 주장.

Testing composer plugins.

https://blog.cebe.cc/posts/2020-04-17/testing-composer-plugins

Yii Framework에서 composer plugin 테스트

Improve your Design with CQRS.

https://thephp.cc/news/2020/04/improve-design-with-cqrs

SerafimArts/opengl-demo

https://github.com/SerafimArts/opengl-demo

FFI를 활용해 순수하게 PHP 만으로(음? 이게 순수한 것임??) OpenGL(SDL)를 사용하는 예제입니다.

A Snake Game Written in PHP

https://thephp.website/en/issue/games-with-php/

With joseph-montanez/raylib-php.

💵 Advanced Web Application Architecture

https://matthiasnoback.nl/2020/04/early-release-of-web-application-architecture-book/

Matthias Noback의 새로운 책입니다. 2주 마다 새로운 장이 발표됩니다.

💵 PHP Mentors

http://www.phpmentors.com/

code, career, teamwork 등에 관한 질문에 전세계 PHP 마스터에게 대답을 들고 책으로 엮었습니다.

📺 Videos

📺 Tips on styling and navigation with PhpStorm

https://blog.jetbrains.com/phpstorm/2020/04/new-video-series-phpstorm-tips-with-christoph-rumpel/

from @christophrumpel.

PhpStorm에서 스타일을 바꾸는 것, 파일 간 이동하는 방법 등을 설명합니다.

📺 Visual Perception of Code

https://www.youtube.com/watch?v=5qRFxMCEbLs

코드의 모양이 생산성에 미치는 엄청난 영향을 탐구합니다.

이외 관한 글을 올리고 영상에 나온 링크를 소개하기도 했습니다.

🔈 Podcasts

PHP Internals News Podcast by Derick Rethans