PHP Annotated – June 2020
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
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 |
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 { |
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; |
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
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?
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가지 주요 보안 위협을 대응하는 방법을 살펴 봅니다.
- Injection
- Broken authentication
- Sensitive data exposure
- XML external entities (XXE)
- Broken access control
- Security misconfiguration
- Cross-site scripting (XSS)
- Insecure deserialization
- Using components with known vulnerabilities
- 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-macros에 try
와 catch
메소드를 추가했습니다. 이를 사용하는 법과 작동 원리를 소개하는 글입니다.
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 |
이렇게 사용할 수 있습니다.
class CustomerDTO |
이런 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
🔈 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
- #58 — With Max Semenik on the accepted RFC non-capturing catches.
- #57 — With Ralph Schindler on his proposal about conditional return, break, and continue statements.
- #56 — With Dan Ackroyd on the newly added mixed pseudotype.