PHP Annotated – June 2020

Php_annotated_monthly 이미지

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

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


⚡️ News & Releases

PHP turned 25

https://www.jetbrains.com/lp/php-25/?_ga=2.202675409.1336001967.1592964633-44216834.1547258235

PHP가 25살이 되었습니다. PHP 역사에서 가장 인상적인 순간과 함께 타임라인을 살펴보세요.

PHP 7.4.7

https://www.php.net/releases/7_4_7.php

무엇보다도 yield from 버그가 해결되었습니다.

  • 7.4.6 버전은 스킵하는 게 좋을 거라는군요.

PHP 7.3.19

https://www.php.net/releases/7_3_19.php

Composer 2.0.0-alpha1

https://github.com/composer/composer/releases/tag/2.0.0-alpha1

The State of Developer Ecosystem in 2020

https://www.jetbrains.com/lp/devecosystem-2020/php/?_ga=2.158784506.1336001967.1592964633-44216834.1547258235

The State of Developer Ecosystem in 2020에서 PHP 섹션으로 바로 넘어가는 링크입니다.

응답자의 65%가 디버깅할 때 ‘dump & die’ 방식을 선택한다고 응답했습니다. 이에 Xdebug의 제작자인 Derick Rethans의 트윗은 커뮤니티에서 강한 반응을 일으켰습니다.

PHP developers that don’t use Xdebug for debugging are amateurs.

🐘 PHP Internals

✅ [RFC] Attribute Amendments

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

PHP 8에 accepted 된 기존 Attributes RFC에 몇가지 스펙을 추가했습니다.

  • PhpAttribute class를 Attribute로 rename
  • <<Attr1, Attr2>>처럼 그루핑하는 기능
  • Validation
  • 여러개의 동일한 속성을 추가하는 기능

✅ [RFC] Ensure correct signatures of magic methods

https://wiki.php.net/rfc/magic-methods-signature

지금까지는 magic method를 클래스 안에서 이렇게 선언할 수 있었습니다.

class Foo
{
function __get(int $name): void
{
echo $name;
}
}
(new Foo)->{42};

PHP 8부터는 메소드의 유효성을 검증하게 되고, compile-time error를 발생시킵니다. 위 코드는 첫번째 인자를 string이 아닌 값으로 선언했기 때문입니다. 이 버그 리포트도 참고하세요.

[RFC] Make sorting stable

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

PHP 8부터는 모든 표준 정렬 함수(sort, usort, asort, etc.)가 안정적(stable)으로 동작할 것입니다. 같은 값이라면 순서가 보장됩니다. 최신 버전에서는 stable하지 않게 동작하는 예를 찾기 어렵지 않습니다.

❌ [RFC] Opcache optimization without any caching

https://wiki.php.net/rfc/opcache.no_cache

거절됐습니다. (Declined)

[RFC] Make constructors and destructors return void

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

현재 버전의 PHP에서는 constructor나 destructor에서 아무 값이나 리턴할 수 있습니다. 예를 들면,

class Test {
public function __construct() {
return 0;
}
}

$test = new Test();

// this prints 0
echo $test->__construct();

Benas Seliuginas는 이런 상황에서 Deprecated warning을 던질 것을, 그리고 PHP 9에서는 이를 제거하고 Fatal Error를 발생시킬 것을 제안했습니다.

[RFC] Treat namespaced names as single token

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

인터프리터는 namespace의 각 요소를 분리된 토큰으로 다룹니다. 이것이 namespace에 키워드를 사용할 수 없는 이유였습니다. 예를 들어, namespace app\function { class Foo {} };는 Parse Error를 발생시킵니다. Nikita Popov는 새로운 키워드가 소개될 때 하위 호환을 문제를 최소화하기 위해, 전체 namespace를 하나의 토큰으로 고려할 수 있도록 제안했습니다.

[RFC] Rename T_PAAMAYIM_NEKUDOTAYIM to T_DOUBLE_COLON

https://wiki.php.net/rfc/rename-double-colon-token

:: 토큰은 PHP에서 T_PAAMAYIM_NEKUDOTAYIM라고 불립니다. 이 문제는 PHP Sadness에서도 첫번째로 언급되었습니다. George Peter Banyard와 Kalle Sommer Nielsen은 이름을 바꾸길 제안했습니다.

이 monthly를 작성하는 Roman Pronskiy는,
“오류 메시지가 항상 ::를 참조하므로 이것이 의미가 있는지 확실하지 않습니다. 게다가 재밌는 역사적인 특정을 왜 지워야 하죠?”라고 하네요.

paamayim nekudotayim은 원래 이스라엘 사람이 작성한 Zend Engine에서 소개된 단어인데, double colon이라는 뜻입니다.

[RFC] Shorter Attribute Syntax

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

Attribute는 이미 PHP 8에 accepted 됐지만, 많은 사람들은 그 문법을 좋아하지 않았습니다. 세가지 옵션이 투표에 올라왔습니다.

<<Attr>> (현재 방식) vs. @@Attr vs. #[Attr]

Brent Roоse는 #[ ] 문법에 대해 몇 가지 설득력 있는 주장을 했습니다.

  • Rust와 같은 문법이며 이 또한 C 기반의 언어입니다.
  • 오래된 코드와 호환됩니다. #[Attribute] 문법은 PHP <=7.4까지 comment로 취급될 것입니다.
  • @@는 에러 억제 연산자와 혼동될 수 있습니다. (예시)
  • <<>> 역시 bit-shift 연산자와 혼동될 수 있습니다. 미래에는 단일 꺽쇄 연산자를 쓸 수도 있는 generics 문법과도 혼동될 수 있습니다.

그동안, @@이 더 많은 표를 받는 것으로 보입니다.

[RFC] Change terminology to ExcludeList

https://wiki.php.net/rfc/change-terminology-to-excludelist

불쾌감을 주는 용어(master/slave and blacklist)의 이름을 바꾸는 주제는 PHP 세계에서도 간과되지 않았습니다. Internals에서 열띈 토론이 있었습니다.

PHP 코어에서 이 변경 사항은 설정 지시자 단 한 부분에서만 영향을 미칩니다. opcache.blacklist_filename에서 opcache.exclude_list_filename를 바꾸려고 합니다. 많은 PHP 도구들은 이미 이와 관련하여 변경됐습니다 : PHPUnit, Drupal, Xdebug, Yii, Composer (+ working with non-master Git branches).

이런 불쾌감을 주는 단어를 찾기 위한 PHP_CodeSniffer 규칙 세트에 대한 토론도 있었습니다.

[RFC] Nullsafe operator

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

여러 중첩된 조건 대신, Ilija Tovilo는 null을 확인하기 위해 property 또는 method를 참조하는 기능을 추가할 것을 제안했습니다.

$country = $session?->user?->getAddress()?->country;

지금은 이렇게 체크해야 하죠.

$country =  null;

if ($session !== null) {
$user = $session->user;

if ($user !== null) {
$address = $user->getAddress();

if ($address !== null) {
$country = $address->country;
}
}
}

PHP 8.0 release schedule was updated

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

기능 확정(feature freeze)은 8월 4일로, 최종 릴리스(GA)는 11월 26일로 날짜가 변경됐습니다.
다른 활성 브랜치(7.4.13, 7.3.25)의 릴리스와 스케줄을 맞추기 위해서라는군요.

3v4l.org

https://3v4l.org/

PHP 8을 3v4l.org에서 사용해보실 수 있습니다. php-master branch에서 결과를 확인해보세요.

🛠 Tools

beyondcode/expose

https://github.com/beyondcode/expose

ReactPHP 위에 순수한 PHP로 구현된 터널링 서비스입니다. 여러분만의 자체 호스팅 서버도 실행할 수 있습니다. how it works 페이지에서 자세히 알아보세요.

pestphp/pest

https://github.com/pestphp/pest

PHPUnit 위에 구축되고 테스트를 간단하고 우아하게 작성할 수 있게 도와주는 도구입니다. 공식 문서와 많은 동영상 강좌도 있습니다. facebook/jest에서 영감을 받았다고 하네요.

Moxio/sqlite-extended-api

https://github.com/Moxio/sqlite-extended-api

FFI와 lisachenko/z-engine이 서로 어떻게 도움을 줄 수 있을지 실제 구현된 예제입니다. 이 패키지는 표준 PHP 드라이버에서는 할 수 없는 SQLite API 메소드를 제공합니다.

FriendsOfPHP/pickle

https://github.com/FriendsOfPHP/pickle

Composer와 호환되는 PECL extension 관리도구입니다. 2015 이후 첫 업데이트가 있었고, 결국 Composer와 완전히 통합할 계획을 세웠습니다.

doctrine/migrations 3.0.0

https://github.com/doctrine/migrations/releases/tag/3.0.0

DB 마이그레이션을 처리하는, 잘 알려진 패키지의 주요 업데이트.

Symfony

Symfony 5.1 was released.

https://symfony.com/blog/symfony-5-1-curated-new-features

Symfony 5 certification is now available

https://symfony.com/blog/the-symfony-5-certification-is-now-available

In Symfony 6, configurations will be handled in usual PHP files

https://github.com/symfony/symfony/issues/37186

Symfony 6에서 configuration 설정에 YAML이나 XML 대신 PHP file을 사용하기로 했습니다.

dbu/snake-bundle

https://github.com/dbu/snake-bundle

symfony/console로 구현한 snake game

How much of a performance boost can you expect for a Symfony 5 app with PHP OPcache preloading?

https://www.ibexa.co/blog/how-much-of-a-performance-boost-can-you-expect-for-a-symfony-5-app-with-php-opcache-preloading

PHP OPcache preloading으로 얼마나 성능을 개선할 수 있을지 실험한 결과입니다.
현실적인 예제에서는 평균 10% 정도의 개선이 있는 것으로 보입니다.

10 Symfony testing tips.

https://blog.cemunalan.com.tr/2020/02/02/10-symfony-testing-tips/

Protect Symfony app against the OWASP Top 10 threats.

https://nicwortel.nl/blog/2020/06/07/protect-symfony-application-against-owasp-top-10-security-risks

PHP에서 10가지 주요 보안 위협을 대응하는 방법을 살펴 봅니다.

  1. Injection
  2. Broken authentication
  3. Sensitive data exposure
  4. XML external entities (XXE)
  5. Broken access control
  6. Security misconfiguration
  7. Cross-site scripting (XSS)
  8. Insecure deserialization
  9. Using components with known vulnerabilities
  10. Insufficient monitoring & logging

Laravel

spatie/laravel-cronless-schedule

https://github.com/spatie/laravel-cronless-schedule

cron 없이 예약 작업을 수행하는 패키지입니다. 내부적으로는 ReactPHP와 timer를 사용합니다. 소개 페이지에서 더 자세히 알아보세요.

Laravel Debugbar vs. Telescope Toolbar

https://barryvdh.nl/laravel/debugbar/telescope/2020/06/14/laravel-debugbar-vs-telescope-toolbar/

글쓴이는 Telescope를 이미 사용하고 있다면, 부하를 피하기 위해서 Telescope Toolbar를 추천한다고 합니다. Laravel Debugbar를 선호하지만 너무 무겁다고 생각되면 Telescope Toolbar를 사용해보라고 하네요.

Adding try/catch Laravel collections.

https://freek.dev/1691-adding-trycatch-to-laravel-collections

Jason McCreary라는 사람이 트위터에서 try/catch를 chaining하는 아이디어를 이야기했고, 글쓴이(Van der Herten)와 페어 코딩을 진행해서 laravel-collection-macrostrycatch 메소드를 추가했습니다. 이를 사용하는 법과 작동 원리를 소개하는 글입니다.

Laravel package ecosystem statistics.

https://itnext.io/laravel-package-ecosystem-4afd53fad192

tactics you can use to write cleaner code in Laravel

https://twitter.com/samuelstancl/status/1272822437181378561

Yii

Yii2 & Doctrine ORM simple integration.

https://medium.com/rigor-guild/yii2-doctrine-orm-simple-integration-fb0625002a40

Zend/Laminas

Is Zend Framework Dead?

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

Laminas project의 lead인 Matthew Weier O’Phinney가 “Zend Framework이 죽었는가?”라는 질문을 포함한 또 다른 질문에 답을 합니다.

asgrim/mini-mezzio

https://github.com/asgrim/mini-mezzio

이 패키지를 사용하여 Mezzio 애플리케이션을 더욱 빠르게 설정하십시오.

🌀 Async PHP

badfarm/zanzara

https://github.com/badfarm/zanzara

ReactPHP 기반의 Telegram bot을 만들어주는 비동기 프레임웍.

simple-swoole/simps

https://github.com/simple-swoole/simps

Swoole 기반의 프레임웍. Benchmark에 따르면 PHP로 작성된 것 중에는 가장 빠릅니다.

📺 Video course on ReactPHP by Marcel Pociot.

https://beyondco.de/video-courses#:~:text=Learning%20ReactPHP

💡 기타 읽을 만한 글

Introducing the new Serverless LAMP stack

https://aws.amazon.com/blogs/compute/introducing-the-new-serverless-lamp-stack/

AWS 블로그에 올라온 serverless PHP 사용법과 Serverless LAMP stack을 주제로 한 커뮤니티의 좋은 자료가 소개됐습니다.

또한, Amazon의 공식 AWS Toolkit 플러그인도 이제 PhpStorm에서 사용할 수 있습니다.

Constructor promotion in PHP 8

https://stitcher.io/blog/constructor-promotion-in-php-8

PHP 8에서는 아래처럼 작성하는 대신

class CustomerDTO
{
public string $name;

public string $email;

public DateTimeImmutable $birth_date;

public function __construct(
string $name,
string $email,
DateTimeImmutable $birth_date
) {
$this->name = $name;
$this->email = $email;
$this->birth_date = $birth_date;
}
}

이렇게 사용할 수 있습니다.

class CustomerDTO
{
public function __construct(
public string $name,
public string $email,
public DateTimeImmutable $birth_date,
) {}
}

이런 Constructor property 승격(promotion)이 어떻게 동작하는지 자세히 설명합니다.

What are the top most used PHP functions in frameworks?

https://thephp.website/en/issue/most-used-php-functions/

Symfony에서는 sprintf(), 라라벨에서는 is_null()입니다. 다른 프레임 워크에 대해 유사한 통계를 계산하는 방법에 대한 지침도 있습니다.

final classes in PHP

https://medium.com/swlh/final-classes-in-php-9174e3e2747e

Final class의 이점.

The fastest template engine for PHP

https://medium.com/@gotzmann/the-fastest-template-engine-for-php-b5b461b46296

Unit test naming conventions

https://matthiasnoback.nl/2020/06/unit-test-naming-conventions/

📺 Videos

PHP Russia 2020 Online

https://habr.com/ru/company/badoo/blog/487264/

How to generate and view code coverage reports in PhpStorm using PHPUnit and Xdebug

https://freek.dev/1674-how-to-generate-and-view-code-coverage-reports-in-phpstorm-using-phpunit-and-xdebug

🔈 Podcasts

Voices of the ElePHPant

https://voicesoftheelephpant.com/2020/06/09/interview-with-nuno-maduro/

Interview with Nuno Maduro.

PHPUgly 194: Oversight

https://phpugly.simplecast.com/episodes/194

PHP Internals News Podcast by Derick Rethans