PHP Annotated – August 2020

Php_annotated_monthly 이미지

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

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


⚡️ News & Releases

PHP 8.0.0 Beta 1

https://www.php.net/archive/2020.php#2020-08-06-3

첫 beta 버전이 릴리스되었습니다. attributes 문법을 제외하고, Feature Freeze되어 변경 사항 목록이 확정되어 최종 버전으로 간주됩니다. 다음 Beta 릴리스는 8월 20일입니다.

…라고 소개되어 있지만, 실제 beta2는 21일에 발표되었습니다.

그 동안 새로운 기능에 대한 overview를 확인하세요.

동영상 overview도 있습니다.

PHP 8 release manager인 Sara Golemon와 Garbriel Caruso의 Voices of the ElePHPant podcast에서의 오디오 인터뷰도 있습니다.

PHP 7.4.9, 7.3.21, 7.2.33

https://www.php.net/releases/7_4_9.php
https://www.php.net/releases/7_3_21.php
https://www.php.net/releases/7_2_33.php

PHAR에서의 취약성을 수정한 보안 업데이트가 있었습니다.

WordPress 5.5 “Eckstine”

https://wordpress.org/news/2020/08/eckstine/

CMS 설치를 좀 더 안전하게 하는 테마와 플러긴 자동 업데이트를 제공합니다.

PhpStorm 2020.2 released

https://www.jetbrains.com/phpstorm/whatsnew/

  • PHP 8 Union Types support
  • New Control Flow Engine for PHP
  • Quality Tools Improvements
  • Composer Improvements
  • Extract Class refactoring
  • Command Line Tools Improvements
  • New Inspections
  • Full Support for GitHub Pull Requests
  • Support for OpenAPI
  • New Inspections Widget and Problems View
  • Web Technologies
  • Version Control
  • Database Tools
  • 기타

🐘 PHP Internals

🍿 [RFC] Shorter Attribute Syntax Change

PHP 8의 attribute 문법이 여전히 결정되지 않았습니다.

처음에 Benjamin Eberlei는 << >>제안했고 이는 받아들여졌습니다. 나중에 새로운 문법에 대한 3가지 옵션으로 투표가 있었습니다 - << >>, #[], @@. 이 중 마지막 옵션이 선택되었는데, 아마도 PHPDoc tag나 Java의 annotation과 가장 유사했기 때문일 것입니다. 그러나 @@는 몇가지 파싱 문제와 다른 여러 문제가 있는 것으로 밝혀졌습니다.

#[Attr] 문법 역시 몇가지 고려할 사항이 있습니다 : 1, 2.

이제는 다음 옵션 중 하나를 선택하기 위해 재투표를 실시하기로 결정했습니다 : @@Attr, #[Attr], <<Attr>>, @[Attr].

커뮤니티의 반응이 재미있습니다.

어쨌든 결국은 어떤 문법이든 익숙해질 것이다

Jordi Boggiano트윗

2008년으로 돌아가보면, namespace separator를 \ 대신 **, ^^, :>, :), :::, and %%. 같은 걸 고려했다는 게 믿기지 않는다

Brent트윗

  • 난 2008년에 PHP를 쓰지 않았는데, 백슬래시가 namespace separator로써 이상한 선택이라고 생각해본 적은 없습니다. 다른 더 좋은 대안이 생각나진 않는데요?

여기에 대한 Benjamin Eberlei의 답변

  • 당시 모두가 원했던 것은 C++ 스타일의 ::였는데, 그건 불가능했습니다. 이미 구현할 수 없는 상황이었는데 늦게 발견되었습니다.

모두를 동시에 만족시키는 plan B는 항상 존재하는 법

Chris Emerson트윗

  • PHP 8 Annotations / Attributes에 아래와 같은 새로운 제안이 필요하다
  • @@#[<< Annotation >>]
  • 이제 모두가 만족할 거야

✅ [RFC] Saner string to number comparisons

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

이전 버전과의 호환성을 깨는 이 제안은 거의 만장일치로 통과되었습니다.

PHP8에서 엄격하지 않은 == 연산자로 숫자와 문자열을 비교할 때, 두 피연산자는 모두 문자열로 변환이 되고 그 중 하나가 숫자 문자열이 아닌 경우 문자열로 비교를 합니다.

0 == 'foobar'는 이제 공식적으로 false 입니다.

PHP8 이전과 이후 비교표

또한 모든 비교 연산자에도 변화를 주게 됩니다 : <=>, ==, !=, >, >=, < and <=, 그리고 switch 구문과 in_array(), sort() 같은 함수 등.

✅ [RFC] Treat namespaced names as a single token

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

PHP 8에서는 전체 namespace가 하나의 token으로 인식됩니다. 이는 keyword가 namespace 안에서 사용되는 것을 허용합니다. 예를 들어, namespace app\function { class Foo {} }. 그리고 새로운 keyword가 생겼을 때 하위 호환이 깨지는 걸 방지할 수 있습니다.

이 변경으로 네임 스페이스는 더 이상 주석을 포함 할 수 없습니다. 즉, 이런 더러운 것들은 다시는 빛을 볼 수 없다는 말입니다.
use /** Try comments */ \FullyQualified \ /* in this ugly way */ SometTotallyDifferentTrait /** also after */;

✅ [RFC] Nullsafe operator

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

?-> 연산자가 PHP 8에 accepted 됐습니다. 수많은 null 체크 대신 아래처럼 우아하게 작성하실 수 있습니다.

$country = $this->sessionStorage->getSession()?->getUser()?->address?->country;

✅ [RFC] Named Arguments

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

PHP 8에서는 named arguments를 사용할 수 있습니다. function이나 method에 파라미터 명을 기준으로 값을 전달할 수 있고, 파라미터의 원래 위치에 넣지 않아도 됩니다.

기존:
htmlspecialchars($string, ENT_COMPAT | ENT_HTML401 , ini_get("default_charset"), false);

앞으로:
htmlspecialchars($string, double_encode: false);

stitcher.io/blog/php-8-named-arguments 포스트에서 named argument에 대해 더 알아보세요.

[RFC] Named Parameters explicit opt in

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

문서가 재설계되었으며, 이제 이름을 바꾸거나 객체 다형성을 제공하지 않고 명시적으로 선언된 파라미터만 사용할 수 있습니다.

PHP 8은 이미 feature-freeze 단계여서 이 제안은 8.1 버전쯤부터 가능합니다.

[Proposal] Bigint shorthand (123n) for GMP objects

https://github.com/php/php-src/pull/5930

공식적인 RFC는 아직 없지만, 다음 버전을 위한 흥미로운 제안입니다.

Tyson Andre는 숫자 뒤에 “n”을 붙여서 큰 숫자를 표현하는 문법을 제안했습니다. JavaScript의 방식과 유사합니다.

$theBiggestInt = 9007199254740991n

이는 내부적으로 GMP 객체를 만들고 PHP에서 일반 숫자처럼 사용할 수 있게 해줍니다. 산술, 비트, 비교 연산자가 이미 GMP 객체를 overload하고 있기 때문입니다.

🛠 Tools

PHPUnit 9.3

https://github.com/sebastianbergmann/phpunit/blob/9.3.0/ChangeLog-9.3.md#930---2020-08-07

A fresh update with support for PHP 8 and Xdebug 3.

hidehalo/nanoid-php

https://github.com/hidehalo/nanoid-php

Nanoid의 PHP 구현체. 안전하고 URL 친화적인 unique ID generator.

woohoolabs/zen

https://github.com/woohoolabs/zen

Fast and simple, PSR-11을 지원하는 DI Container이자 preload file generator.

loophp/collection

https://github.com/loophp/collection

A (memory) friendly, easy, lazy, and modular collection class.

ramsey/conventional-commits

https://github.com/ramsey/conventional-commits

Conventional Commits 스펙에 따라 commit 메시지를 생성하고 유효성을 검사하는 PHP 라이브러리. CaptainHook plugin 포함.

jubianchi/ppc

https://github.com/jubianchi/ppc

PHP를 위한 파서 생성기 라이브러리. phplrt/phplrt와 비교해보세요.

zakirullin/mess

https://github.com/zakirullin/mess

Type-safe casting을 위한 scalar 타입과 배열의 wrapper.

nette/php-generator

https://github.com/nette/php-generator

PHP code generator with a fluent interface.

Symfony

Using Symfony’s service iterators for secondary flows.

https://timobakx.dev/php/symfony/2020/07/30/secondary-flows.html

Deploy a Symfony application in AWS Lambda.

https://medium.com/@smaine.milianni/aws-lambda-and-symfony-6d3e9831c3cd

A Week of Symfony #711 (August 10-16, 2020)

https://symfony.com/blog/a-week-of-symfony-711-10-16-august-2020

Nicolas Grekas의 트윗

https://twitter.com/nicolasgrekas/status/1286563593098612736

As of today, #Symfony 4.3 and 5.0 are out of maintenance \o/. It’s time to move on to 5.1 if you didn’t already!

Laravel

A nice guide for converting a legacy application to Laravel

https://tighten.co/blog/converting-a-legacy-app-to-laravel/

Running The Same Queued Job Multiple Times

https://divinglaravel.com/laravel-queues-in-action-running-the-same-job-multiple-times

Job을 delay하는 방법을 다룹니다.

📺 Don’t use mass assignment protection in your Laravel models.

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

📺 Better Laravel Way

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

이 플레이리스트의 소개글을 옮겨왔습니다.

Playlist for mid and senior developers who want to learn how to write scalable and maintainable PHP microservices in Laravel using SOLID Principles, Domain Driven Design, Test Driven Development, Hexagonal Architecture and CQRS:

📺 A stream with Nuno Maduro and Freek Murze

PHPUnit 테스트를 Pest로 변환합니다.

📺 Laracon EU Online 2020 videos

https://www.youtube.com/playlist?list=PLMdXHJK-lGoAepv_7mvIEuafrtO6N-3SZ

💡 기타 읽을 만한 글

Testing Microservices in PHP with Codeception.

https://medium.com/@docler/testing-microservices-in-php-with-codeception-94e47f22cc24

Antipatterns of legacy PHP applications.

https://adrien.poupa.fr/modernizing-a-legacy-php-application/

method fossilisation

https://www.exakat.io/en/method-fossilisation/

파편화된 메소드를 피하는 방법입니다. Exakat을 사용하면 쉽게 발견할 수 있다는 홍보를 하면서 아래의 방안을 제안합니다.

  • Monitor fossilisation
  • Reduce and remove fossilisation
  • Limit the usage of scalar typehints for large families of classes
  • Don’t forget your users
  • Skip inheritance

A case for system-wide dependency injection in PHP.

https://technex.us/2020/08/the_case_for_system_wide_dependency_injection_in_php/

다른 많은 언어의 경우처럼, composer를 프로젝트 단위에서 전역(global) 단위로 동작하게 설정할 수 있도록 composer를 fork한 프로젝트입니다.

Friendly classes in PHP

https://forum.yiiframework.com/t/usage-of-friendly-classes/130241

There was an RFC on the subject, but it did not pass.

Everything you need (and don’t need) to know about PHP’s type system.

https://thephp.website/en/issue/php-type-system/

Enhancements to PHP code coverage in 2020

https://doug.codes/php-code-coverage

2020년 8월 php-code-coverage 9.0 릴리스와 함께, 관련해서 릴리스된 PHPUnit 9.3과 behat-code-coverage 5.0으로 더 향상된 방식으로 코드 커버리지를 측정할 수 있습니다.
코드 커버리지에 관한 소개와 한계, 대안으로 사용할 수 있는 측정 지표, branch coverage, path coverage 등을 설명합니다.

https://doug.codes/php-code-coverage

PHP: Preloading – Manual

https://www.php.net/manual/en/opcache.preloading.php

7.4 버전에 추가된 preloading에 관한 상세한 문서가 올라왔습니다.

PhpStorm, But Better – Tips & Tricks Newsletter

https://phpstormbutbetter.com/

PhpStorm 사용팁에 관한 뉴스레터입니다. 이미 두 번 발행됐습니다 - #1, #2.

Are you sure you write OOP code?

https://adelf.tech/2020/oop-thinking

Order of evaluation in PHP

https://gist.github.com/nikic/6699370

Nikita Popov의 오래되었지만 매우 흥미로운 글 : “연산자 우선 순위 및 associativity는 그룹화를 지정하지만 그룹이 실행되는 순서는 지정하지 않습니다.”

  • associativity란 괄호가 없을 때 동일한 우선 순위의 연산자를 그룹화하는 방법을 결정하는 속성입니다.

📺 Videos

📺 Type Juggling Magic: Why PHP thinks 0 and “password” are the same

https://www.youtube.com/watch?v=-1kftH6t5VA

PHP의 type casting이 보안 문제를 유발하는 방법에 대한 재미있는 비디오입니다.

📺 Stream with Derick Rethans on how to work with Xdebug

https://www.youtube.com/watch?v=qVfqfJ7-grk

Laravel Valet과 PhpStorm 환경에 Xdebug를 설정합니다. profiling, debugging, 기타 tip을 다룹니다.

📺 Dutch PHP Conf 2020 videos.

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

🔈 Podcasts

PHP Internals News Podcast by Derick Rethans