php-annotated-january-2020
Roman Pronskiy가 쓰고 JetBrains에서 제공하는 월간 PHP Annotated 2020년 1월호의 번역본입니다.
이 중에서 몇 가지 제 취향껏 골라 그 안의 내용도 좀 뒤져보고 개발새발 번역해서 소개합니다.
⚡️ News & Releases
CakePHP 4.0
https://bakery.cakephp.org/2019/12/15/cakephp_400_released.html
최소 PHP 사양이 PHP 5.6에서 PHP 7.2로 올랐습니다. PSR standard (3, 15, 16, 18)을 지원하고 많은 개선 사항이 있었습니다.
Codeception 4.0
https://codeception.com/12-18-2019/codeception-4
모든 모듈이 분리된 패키지로 추출되었습니다. Symfony 5와 phpdotenv 4 지원, 그리고 upgrade script를 제공합니다.
Phalcon 4.0
https://blog.phalcon.io/post/phalcon-4-0-0-released
C로 구현되고 PHP 확장으로 배포되는 이 프레임워크에 메이저 업데이트가 있었습니다. PHP 7.2 이상을 요구하고 PSR standard (7, 11, 13, 16, 17) 추가 지원하며 interfaces는 더 엄격해졌습니다. upgrade guide에서 더 많은 변경점을 확인하세요.
PHP 7.2.26
https://www.php.net/ChangeLog-7.php#7.2.26
PHP 7.2 branch에서 마지막 정규 bugfix 릴리스입니다. 올 해까지 필요할 경우 security fix 정도만 업데이트 되고 끝입니다.
PHP IMAP extension will no longer work with Gmail OAuth
https://github.com/google/gmail-oauth2-tools/issues/18
Gmail OAuth가 SASL XOAUTH2 protocol을 지원하지 않게 되면서 PHP IMAP extension은 더이상 사용하지 않는다고 합니다. 이 extension을 사용할 가능성도 거의 없다고 하는군요. 이 extension은 어차피 PHP 8에서 제거될 운명입니다.
laminas/laminas-mail 혹은 PHP IMAP과 거의 동일한 함수를 제공하는 Zend Mail의 wrapper인 freescout-helpdesk/ximap를 추천한다고 합니다.
🐘 PHP Internals
[RFC] Weak maps
https://wiki.php.net/rfc/weak_maps
이 제안이 accept 됐고, PHP 8 branch에 머지되었습니다.
[RFC] Variable Syntax Tweaks
https://wiki.php.net/rfc/variable_syntax_tweaks
이 RFC는 Uniform Variable Syntax RFC의 범위 중 PHP 7에서 다루지 않은 역 참조와 관련된 일부 불일치를 수정하도록 제안합니다.
[RFC] Static return type
https://wiki.php.net/rfc/static_return_type
static 키워드는 late static binding을 제공하는 타입 선언 방식입니다. 이 RFC는 return type에도 static 키워드를 쓸 수 있게 허용할 것을 제안합니다. 이미 self나 parent는 가능합니다.
이를 사용하면 static 생성자나 fluent interface를 구현하는데 도움이 될 수 있다고 합니다.
class Test { |
class Test { |
[RFC] Allow ::class on objects
https://wiki.php.net/rfc/class_name_literal_on_object
PHP8을 목표로 클래스 인스턴스로부터 fully qualified name을 얻을 수 있게 허용하는 제안이 올라왔습니다. 우리가 Foo\Bar::class처럼 사용하는 것과 같이 $object::class를 쓸 수 있게 말이죠.
[RFC] “use global functions/consts” statement
https://wiki.php.net/rfc/use_global_elements
함수나 상수(const)에 prefix가 없으면 우선 현재 namespace를 기준으로 찾고 이후에 전역 namespace를 뒤지는데, 제안자는 use global function
혹은 use global consts
을 쓰면 전역을 먼저 확인할 것을 제안합니다.
pull-requests를 통한 변화도 있을 수 있습니다.
[PR] Deprecate required param after optional
https://github.com/php/php-src/pull/5067
이 PR은 함수 signature에서 비 필수 파라미터가 필수 파라미터 앞에 위치할 경우 deprecation notice를 생성합니다.
[PR] Check abstract method signatures coming from traits
https://github.com/php/php-src/pull/5068
trait의 abstract 메소드는 그걸 사용하는 측 클래스에서 유효성 검증을 하지 않습니다. 아래 코드는 에러 없이 실행 가능합니다.
trait T { |
[PR] Ensure correct signatures for PHP magic methods
https://github.com/php/php-src/pull/4177
magic method의 signature를 검사하자는 PR.
[PR] Add Stringable interface
https://github.com/php/php-src/pull/5083
이 PR은 새로운 인터페이스인 Stringable를 제안합니다. 이 제안으로 PHP 8에서 도입된 Union Type을 통해 string|Stringable와 같이 선언하면 __toString()을 구현하고 있는 문자열이나 객체 모두 받아들일 수 있게 됩니다.
🛠 Tools
DarkGhostHunter/Preloader
https://github.com/DarkGhostHunter/Preloader
이 툴은 사용 통계에 기반해 PHP 7.4의 preloading을 위한 파일을 선택하고 자동으로 preloader script를 생성할 수 있게 도와줍니다.
nikic/PHP-Fuzzer
https://github.com/nikic/PHP-Fuzzer
Nikita Popov가 만든 실험적인 PHP 패키지입니다. 무작위 입력 데이터를 생성해줍니다.
lukanetconsult/network-address-types
https://github.com/lukanetconsult/network-address-types
Network Address Types을 구분해주는 라이브러리
krakjoe/pthreads
https://github.com/krakjoe/pthreads
PHP에서 multithread를 지원하는, 한 때 인기였던 extension이 아카이빙 됐습니다. 대신 krakjoe/parallel를 사용하세요.
php-service-bus/service-bus
https://github.com/php-service-bus/service-bus
Amphp에 기반한 프레임웍. Saga, CQRS, EventSourcing, and Message Bus 패턴을 사용하는 어플리케이션을 위한 프레임웍입니다.
franzliedke/studio
https://github.com/franzliedke/studio
Composer 패키지를 사용하는 동시에 개발할 수 있게 도와줍니다.
Symfony
A cheat sheet on the Messenger component.
http://assets.andreiabohner.org/symfony/sf44-messenger-cheat-sheet.pdf
Messenger component에 관해 매우 (개발자 눈에는) 예쁘고 친절하게 표현 해놓았습니다.
Symfony was the backend framework with the most contributors in 2019.
https://symfony.com/blog/symfony-was-the-backend-framework-with-the-most-contributors-in-2019
Symfony가 2019년에 다른 백엔드 프레임웍 중에 가장 많은 기여자 수를 기록했다고 합니다.
Symfony 2010s decade in review.
https://symfony.com/blog/symfony-2010s-decade-in-review
Symfony가 10년 간 걸어온 길
A week of Symfony #680 (6-12 January 2020)
https://symfony.com/blog/a-week-of-symfony-680-6-12-january-2020
Laravel
Laravel Idea
https://plugins.jetbrains.com/plugin/13441-laravel-idea/
Laravel plugin이 오랫동안 PhpStorm 용 플러그인으로 사용됐지만, 최근 몇년 간은 활발히 개발이 되진 않았습니다. 그 대안으로 Laravel plugin이 있습니다. 무료는 아니지만 몇가지 추가 기능이 있습니다.
.env files support로 알려진 Adel F는 “Architecture of complex web applications”의 저자이기도 합니다.
laravel/airlock
https://github.com/laravel/airlock
Taylor Otwell이 개발한 SPA나 API에서 쉽게 인증하기 위한 패키지의 초기 버전입니다. 이를 소개하는 포스트를 확인해보세요.
Using GitHub actions to run the tests of Laravel projects and packages
https://freek.dev/1546-using-github-actions-to-run-the-tests-of-laravel-projects-and-packages
GitHub actions로 Laravel project와 package를 다른 PHP 버전과 다른 의존성으로 테스트하는 방법입니다.
📺 Building filters using spatie/laravel-query-builder.
https://freek.dev/1534-building-filters-using-laravel-query-builder
📺 How to avoid large function signatures by using pending objects
https://freek.dev/1545-how-to-avoid-large-function-signatures-by-using-pending-objects
🔈 Laravel Snippet #20 – Union Types, SPA Authentication, Laravel UI, Middleware Priority, Laracon 2020.
🔈 Laravel Snippet #21 – Artisan Inspire, Vapor multi-domain support, Laravel Airlock.
Zend/Laminas
A new project for a new year
https://getlaminas.org/blog/2019-12-31-out-with-the-old-in-with-the-new.html
Zend Framework에서 여러 Laminas 프로젝트로의 마이그레이션이 마무리 됐다는 소식입니다.
Yii
Yii 1, Yii 2.0.31 and Yii 3 progress.
https://opencollective.com/yiisoft/updates/yii-1-yii-2-0-31-and-yii-3-progress
🌀 Async PHP
📺 Screencast on DriftPHP
https://www.youtube.com/watch?v=2-Id0dc1ZZk
ReactPHP Symfony components를 기반으로 한 비동기 PHP 프레임웍인 DriftPHP에 관한 Screencast입니다.
amphp/http-client 4.0
https://github.com/amphp/http-client
Amphp의 HTTP client가 HTTP/2를 완전히 지원한다는 소식. 게다가 PHP 7.4를 사용한다면 FFI를 이용한 nghttp2를 설치할 수 있다고 합니다.
기타 읽을 만한 글
Rules for working with dynamic arrays and custom collection classes.
PHP에서 dynamic array를 다루거나 custom collection 클래스를 만들어 사용하는 데 있어 저자가 사용하는 몇 가지 규칙을 Style guide로써 제시합니다.
Hashing passwords on the server-side, a dead end?
https://blog.usejournal.com/hashing-passwords-on-the-server-side-a-dead-end-82669ee0253a
Nicolas Grekas는 우리가 우리 스스로 서버를 서비스 거부 공격에 취약하게 만들 것인지 묻습니다.
요즘은 bcrypt가 대세이지만, 이런 알고리즘은 CPU 기준으로 비용이 계산됩니다. 결국 CPU 성능만 높이면 결국 “충분히” 취약해질 수 있다고 합니다. 그 대안으로 나온 것 중에는 Argon2를 추천합니다.
그런데 이 배경 때문에 서비스 거부 공격에 취약한데, 이에 관한 대안을 제시합니다.
How to break an entire ecosystem by publishing a release
https://medium.com/@alcaeus/how-to-break-an-entire-ecosystem-by-publishing-a-release-b6aaab2b8aaa
doctrine/persistence를 엄격한 타입 기반 API로 업그레이드 해가는 과정과 여기서 실수했던 부분을 공유합니다.
저자가 소개하는 How to deprecate a type in PHP도 추천합니다.
How to Develop and Debug PHP Applications in Kubernetes.
https://okteto.com/blog/how-to-develop-php-apps-in-kubernetes/
Benchmarks of PHP 5.6 – 7.4
https://kinsta.com/blog/php-benchmarks/
with WordPress, Drupal, Magento 2, Laravel, Symfony, and others (without preloading).
아주 큰 변화는 없지만 모든 테스트에서 조금은 개선된 걸 보실 수 있습니다. PHP 7.4에서 소개된 preloading은 설정하지 않은 수치입니다.
PHP 7.4 Preloading benchmarks with Laravel.
Preloading을 설정한 Laravel 벤치마크 자료입니다.
📺 Videos
📺 How to upgrade to PHP 7.4 with PhpStorm
https://www.youtube.com/watch?v=ia1KSZCG2Bs
PhpStorm를 통해 9 분 동안의 Alt+Enter
와 SSR 트릭으로 PHP 7.4로 업데이트 하기.
📺 How to Run PHPUnit Tests Using PhpStorm
https://www.youtube.com/watch?v=7YnYz_SjVbI
관련 포스트도 읽어보세요.
📺 Refactor complex conditionals.
📺 Single Responsibility principle (SOLID)
https://www.youtube.com/watch?v=Q61TtJlWvfE
by Anna Filina.
🔈 Podcasts
🔈 The Undercover ElePHPant #5
https://undercover-elephpant.com/episodes/integrating-with-third-party-apis-with-nils-adermann
Nils Adermann(Composer)와 함께 하는 Third-Party API 연동. 관련 포스트를 참고하세요.
🔈 The Undercover ElePHPant #4
https://undercover-elephpant.com/episodes/retries-and-timeouts-with-bastian-hofmann
how to handle retries and timeouts in PHP with Bastian Hofmann.