PHP Annotated – August 2020
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를 확인하세요.
- Brent Roose의 What’s new in PHP 8
- Ayesh Karunaratne의 PHP 8.0: What’s New and Changed
- PHP 8: before and after
동영상 overview도 있습니다.
- 핵심 기여자(core contributor) 중 하나인 George Peter Banyard의 PHP 8: Process & fixing insanity
- Nikita Popov의 What’s new in PHP 8.0?
- William Pinaud의 [EN] PHP 8 talk - going infinite - everything you need to know about PHP 8
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]
.
커뮤니티의 반응이 재미있습니다.
어쨌든 결국은 어떤 문법이든 익숙해질 것이다
- 2008년 namespace seperators 투표에서도 마찬가지였다. 결국 익숙해졌지.
2008년으로 돌아가보면, namespace separator를 \ 대신 **, ^^, :>, :), :::, and %%. 같은 걸 고려했다는 게 믿기지 않는다
- 난 2008년에 PHP를 쓰지 않았는데, 백슬래시가 namespace separator로써 이상한 선택이라고 생각해본 적은 없습니다. 다른 더 좋은 대안이 생각나진 않는데요?
여기에 대한 Benjamin Eberlei의 답변
- 당시 모두가 원했던 것은 C++ 스타일의 ::였는데, 그건 불가능했습니다. 이미 구현할 수 없는 상황이었는데 늦게 발견되었습니다.
모두를 동시에 만족시키는 plan B는 항상 존재하는 법
- PHP 8 Annotations / Attributes에 아래와 같은 새로운 제안이 필요하다
- @@#[<< Annotation >>]
- 이제 모두가 만족할 거야
✅ [RFC] Saner string to number comparisons
https://wiki.php.net/rfc/string_to_number_comparison
이전 버전과의 호환성을 깨는 이 제안은 거의 만장일치로 통과되었습니다.
PHP8에서 엄격하지 않은 ==
연산자로 숫자와 문자열을 비교할 때, 두 피연산자는 모두 문자열로 변환이 되고 그 중 하나가 숫자 문자열이 아닌 경우 문자열로 비교를 합니다.
0 == 'foobar'
는 이제 공식적으로 false
입니다.
또한 모든 비교 연산자에도 변화를 주게 됩니다 : <=>
, ==
, !=
, >
, >=
, <
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
- #63 — With André Rømcke on property write/set visibility.
- #64 — With Benjamin Eberlei on everything about attributes.
- #65 — With Dan Ackroyd about the new ?-> operator in PHP 8.
- #66 — With Nikita Popov on single token for namespaces and parsing PHP in general.