php-annotated-january-2020

Php_annotated_monthly 이미지

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 {
public function createFromWhatever($whatever): static {
return new static($whatever);
}
}
class Test {
public function withWhatever($whatever): static {
$clone = clone $this;
$clone->whatever = $whatever;
return $clone;
}
}

[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 {
abstract function neededByTheTrait(int $a, string $b);
}
class C {
use T;
function neededByTheTrait(array $a, object $b) {}
}

[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.

https://blog.laravel.com/laravel-snippet-20-union-types-spa-authentication-laravel-ui-middleware-priority-laracon-2020

🔈 Laravel Snippet #21 – Artisan Inspire, Vapor multi-domain support, Laravel Airlock.

https://blog.laravel.com/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.

https://matthiasnoback.nl/2020/01/rules-for-working-with-arrays-and-custom-collection-classes-in-php/

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+EnterSSR 트릭으로 PHP 7.4로 업데이트 하기.

📺 How to Run PHPUnit Tests Using PhpStorm

https://www.youtube.com/watch?v=7YnYz_SjVbI

관련 포스트도 읽어보세요.

📺 Refactor complex conditionals.

https://vimeo.com/381650670

📺 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.