1. 1. ⚡️ News & Releases
    1. 1.1. CakePHP 4.0
    2. 1.2. Codeception 4.0
    3. 1.3. Phalcon 4.0
    4. 1.4. PHP 7.2.26
    5. 1.5. PHP IMAP extension will no longer work with Gmail OAuth
  2. 2. 🐘 PHP Internals
    1. 2.1. [RFC] Weak maps
    2. 2.2. [RFC] Variable Syntax Tweaks
    3. 2.3. [RFC] Static return type
    4. 2.4. [RFC] Allow ::class on objects
    5. 2.5. [RFC] “use global functions/consts” statement
    6. 2.6. [PR] Deprecate required param after optional
    7. 2.7. [PR] Check abstract method signatures coming from traits
    8. 2.8. [PR] Ensure correct signatures for PHP magic methods
    9. 2.9. [PR] Add Stringable interface
  3. 3. 🛠 Tools
    1. 3.1. DarkGhostHunter/Preloader
    2. 3.2. nikic/PHP-Fuzzer
    3. 3.3. lukanetconsult/network-address-types
    4. 3.4. krakjoe/pthreads
    5. 3.5. php-service-bus/service-bus
    6. 3.6. franzliedke/studio
  4. 4. Symfony
    1. 4.1. A cheat sheet on the Messenger component.
    2. 4.2. Symfony was the backend framework with the most contributors in 2019.
    3. 4.3. Symfony 2010s decade in review.
    4. 4.4. A week of Symfony #680 (6-12 January 2020)
  5. 5. Laravel
    1. 5.1. Laravel Idea
    2. 5.2. laravel/airlock
    3. 5.3. Using GitHub actions to run the tests of Laravel projects and packages
    4. 5.4. 📺 Building filters using spatie/laravel-query-builder.
    5. 5.5. 📺 How to avoid large function signatures by using pending objects
    6. 5.6. 🔈 Laravel Snippet #20 – Union Types, SPA Authentication, Laravel UI, Middleware Priority, Laracon 2020.
    7. 5.7. 🔈 Laravel Snippet #21 – Artisan Inspire, Vapor multi-domain support, Laravel Airlock.
  6. 6. Zend/Laminas
    1. 6.1. A new project for a new year
  7. 7. Yii
    1. 7.1. Yii 1, Yii 2.0.31 and Yii 3 progress.
  8. 8. 🌀 Async PHP
    1. 8.1. 📺 Screencast on DriftPHP
    2. 8.2. amphp/http-client 4.0
  9. 9. 기타 읽을 만한 글
    1. 9.1. Rules for working with dynamic arrays and custom collection classes.
    2. 9.2. Hashing passwords on the server-side, a dead end?
    3. 9.3. How to break an entire ecosystem by publishing a release
    4. 9.4. How to Develop and Debug PHP Applications in Kubernetes.
    5. 9.5. Benchmarks of PHP 5.6 – 7.4
    6. 9.6. PHP 7.4 Preloading benchmarks with Laravel.
  10. 10. 📺 Videos
    1. 10.1. 📺 How to upgrade to PHP 7.4 with PhpStorm
    2. 10.2. 📺 How to Run PHPUnit Tests Using PhpStorm
    3. 10.3. 📺 Refactor complex conditionals.
    4. 10.4. 📺 Single Responsibility principle (SOLID)
  11. 11. 🔈 Podcasts
    1. 11.1. 🔈 The Undercover ElePHPant #5
    2. 11.2. 🔈 The Undercover ElePHPant #4

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를 구현하는데 도움이 될 수 있다고 합니다.

1
2
3
4
5
class Test {
public function createFromWhatever($whatever): static {
return new static($whatever);
}
}
1
2
3
4
5
6
7
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 메소드는 그걸 사용하는 측 클래스에서 유효성 검증을 하지 않습니다. 아래 코드는 에러 없이 실행 가능합니다.

1
2
3
4
5
6
7
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.