PHP Annotated – March 2020
Roman Pronskiy가 쓰고 JetBrains에서 제공하는 월간 PHP Annotated 2020년 3월호의 번역/해석본입니다.
이 중에서 몇 가지 제 취향껏 골라 그 안의 내용도 좀 뒤져보고 개발새발 번역해서 소개합니다.
⚡️ News & Releases
CodeIgniter 4.0
https://github.com/codeigniter4/CodeIgniter4
5년 간의 개발 끝에 새 버전이 릴리스되었습니다. 처음부터 다시 작성하고, PHP 7.2 이상에서 동작하며, PSR-1, 3, 4를 구현했습니다.
PHP 7.4.3
https://www.php.net/ChangeLog-7.php#7.4.3
오래 기다렸던 opcache.preload_user
버그가 수정됐고, 이제는 production에서 사용할 수 있겠습니다.
preload_user 버그란 이걸 말하는 가 봅니다.
Fixed bug #79128 (Preloading segfaults if preload_user is used).
🐘 PHP Internals
Accepted proposals:
아래 세가지 RFC가 승인되었습니다.
[RFC] Variable Syntax Tweaks
[RFC] Static return type
[RFC] Allow ::class on objects
[RFC] Stringable
https://wiki.php.net/rfc/stringable
Nicolas Grekas의 제안이 승인됐습니다. 따라서 PHP 8에서는 string|Stringable
union type을 쓸 수 있고, __toString()을 구현한 클래스를 인자로 넘길 수 있습니다. 게다가 명시적으로 implements Stringable
을 선언하지도 않아도 되는데, __toString()을 구현한 클래스라면 뒤에서 알아서 처리해줍니다.
Language evolution
https://github.com/nikic/php-rfcs/blob/language-evolution/rfcs/0000-language-evolution.md
Nikita가 PHP를 어떻게 legacy code를 깨뜨리지 않으면서 앞으로 나아가게 할 수 있을지 논의를 시작했습니다.
하나의 옵션으로 Rust의 방식처럼 “edition”을 도입하는 것이 있는데, declare(edition=2020)
처럼 파일 단위 선언하는 것입니다.
[RFC] Write-Once Properties
https://wiki.php.net/rfc/write_once_properties
새로운 property 수정자를 추가하는 제안입니다. 특정 property를 초기화하면 이후 수정할 수 없도록 합니다.
어떤 keyword를 사용할 지 다양한 옵션이 거론되고 있습니다. final, immutable, readonly, writeonce, locked, sealed…
class Foo |
[RFC] Allow explicit call-site pass-by-reference annotation
https://wiki.php.net/rfc/explicit_send_by_ref
호출하는 쪽에서도 reference를 전달한다는 것을 명시적으로 보여줄 수 있도록 제안합니다.
require_explicit_send_by_ref 옵션이 활성화 될 떄만 적용됩니다.
declare(require_explicit_send_by_ref=1); |
[RFC] Increment/Decrement Fixes
https://wiki.php.net/rfc/increment_decrement_fixes
경우에 따라 덧셈/뺄셈 연산자가 명시적으로 1을 더하거나 빼는 연산에서 일관되게 동작하지 않는 문제가 있습니다. 예를 들면,
|
이 RFC는 PHP 8에서 오류를 수정하고 Error를 던질 수 있도록 제안합니다.
[RFC] Attributes v2
https://wiki.php.net/rfc/attributes_v2
이 RFC는 <<, >>를 사용해 완전한 어노테이션(annotations)을 추가하기 위한 두번째 시도입니다.
이전에 simple annotations나 attributes같은 제안이 있었지만 투표를 통과하진 못했습니다.
use Doctrine\ORM\Mapping as ORM; |
[PR] Make sorting stable
https://github.com/php/php-src/pull/5236
PHP의 정렬 함수는 안정되지 않았습니다(not stable). 같은 값을 가진 요소들의 원래 순서가 보장되지 않습니다. 예를 들면, 이렇습니다.
이를 고치자는 제안이 올라왔습니다만, 동일한 요소가 여럿 포함될 경우 성능에 영향을 줄 것입니다.
🛠 Tools
T-Regx/T-Regx
https://github.com/T-Regx/T-Regx
사용자 친화적인 인터페이스로 정규식을 작업하기 좋은 패키지입니다.
spiral/RoadRunner
https://github.com/spiral/roadrunner
Golang으로 만들어진 PHP Application Server입니다. 이제 file watcher가 포함되어, 워커가 자동으로 갱신될 수 있습니다.
tightenco/overload
https://github.com/tightenco/overload
closure의 모음을 통해 overloading method를 구현한 간단하지만 흥미로운 구현체입니다.
cmorrell.com/php-fpm
php-fpm 설정을 생성하는 좋은 툴.
minicli/minicli
https://github.com/minicli/minicli
CLI 중심의 PHP 애플리케이션을 생성하기 위한, 의존성이 없이 Vanilla PHP로 만들어진 도구입니다.
minicli를 소개하는 4개의 연재를 확인하세요.
shivammathur/setup-php
https://github.com/shivammathur/setup-php
PHP 환경을 설정해서 당신의 workflow의 기반으로 사용할 수 있게 도와주는 Github Action입니다.
GitHub action to setup PHP with required extensions, php.ini configuration, code-coverage support and various tools like composer
Symfony
📺 Charming Development in Symfony 5
https://symfonycasts.com/screencast/symfony
SymfonyCasts에서 진행중인 시리즈입니다.
Auto-configuration of Doctrine repositories as services
https://www.strangebuzz.com/en/blog/auto-configuration-of-doctrine-repositories-as-services
A Week of Symfony #688 (2-8 March 2020)
https://symfony.com/blog/a-week-of-symfony-688-2-8-march-2020
Laravel
Laravel 7
https://laravel.com/docs/7.x/releases
이번 릴리스에선,
- laravel/airlock – SPA에서의 인증을 위한 새로운 component
- Custom Eloquent Casts – 어떻게 사용하는 지는 이 tutorial을 보세요!
- Blade component가 이제 클래스와 custom HTML 태그로 선언될 수 있고 @component 태그 대신 사용할 수 있습니다
- HTTP Client – 일반적인 작업을 위해 단순한 인터페이스를 가진 Guzzle wrapper입니다. kitetail/zttp를 기반으로 합니다.
어떤 점이 새로워졌는지 📺 Laracasts와 📺 Coder’s Tape channel에서 동영상 overview로 확인해보실 수 있습니다.
Livewire v1.0
https://github.com/livewire/livewire
이 Laravel을 위한 frontend framework은 추가적인 JS 코드 없이도 Blade를 PHP class로 바인딩 해줄 수 있습니다. 이 📺 video tutorial에서 form을 처리하는 방식을 확인하실 수 있어요.
nunomaduro/laravel-mojito
https://github.com/nunomaduro/laravel-mojito
독립적으로 뷰를 테스트할 수 있는 간단한 패키지입니다. 어떻게 사용하는지 이 📺 demo를 보고 확인하세요.
Optimizing circular relationships in Laravel
https://reinink.ca/articles/optimizing-circular-relationships-in-laravel
Laravel에서 양방향 relation을 최적화하는 방법입니다.
📺 How to write exceptionally good exceptions in PHP.
https://freek.dev/1582-how-to-write-exceptionally-good-exceptions-in-php
🔈 Laravel Snippet #23: Laravel 7.x, Forge, Vapor, Speaking vs. Silence.
https://blog.laravel.com/laravel-snippet-23-laravel-7x-forge-vapor-speaking-vs-silence
📺 Laracon Australia 2019 videos.
https://www.youtube.com/playlist?list=PLEkJYA4gJb78lIOKjZ0tJ9rWszT6uCTJH
Yii
Yii news 2020, issue 2
https://opencollective.com/yiisoft/updates/yii-news-2020-issue-2
Yii 3에 반영된 많은 변화를 포함한 뉴스입니다.
yiisoft/friendly-exception
https://github.com/yiisoft/friendly-exception
Yii 3이 릴리스된 후 첫 패키지입니다. 사람이 읽을 수 있는 exception을 선언할 수 있는 인터페이스를 제공합니다.
Zend/Laminas
Inaugural Technical Steering Committee Meeting
https://getlaminas.org/blog/2020-03-05-tsc-inaugural-meeting.html
Laminas의 개발 및 자금 조달 계획에 대해 알 수 있습니다.
🌀 Async PHP
📺 Interview with Marc Morera
https://www.youtube.com/watch?v=bekZ7cPmSuE
DriftPHP의 저자와 driftphp/reactphp-dbal에 관해 이야기 합니다.
driftphp/tiny-load-balancer
https://github.com/driftphp/tiny-load-balancer
ReactPHP 위애서 도는 아주 작은 로드밸런서입니다.
💡 기타 읽을 만한 글
Understanding PHP 8’s JIT
https://thephp.website/en/issue/php-8-jit/
PHP 8의 JIT 이해하기
When does PHP call __destruct()?
https://dev.to/themsaid/when-does-php-call-destruct-1167
__destruct()가 언제 호출되는지 설명합니다.
Bitwise booleans in PHP
https://stitcher.io/blog/bitwise-booleans-in-php
저자가 PHP의 Enum type의 지원없이 Enum을 구현하는 이전 포스트에서 bool flag를 저장하는 것을 보여줬었는데, 이번에는 bitmask를 사용하여 bool flag를 저장하는 방식을 설명합니다.
PHPUnit: A Security Risk?
https://thephp.cc/news/2020/02/phpunit-a-security-risk
vendor 디렉토리가 공개적으로 접근 가능하다면, PHPUnit의 이전 버전이 어떤 보안 문제를 일으키는지 알아보세요.
여기서 얻은 교훈으로는
- Composer로 관리되는 vendor 디렉토리는 공개적으로 접근 가능해선 안 된다
- PHPUnit과 같은 개발 단계에서 필요한 라이브러리는 production에 배포되어선 안 된다
PHPUnit 문서에서도 이를 명확히 경고하고 있습니다.
PHPUnit is a framework for writing as well as a commandline tool for running tests. Writing and running tests is a development-time activity. There is no reason why PHPUnit should be installed on a webserver. If you upload PHPUnit to a webserver then your deployment process is broken. On a more general note, if your vendor directory is publicly accessible on your webserver then your deployment process is also broken. Please note that if you upload PHPUnit to a webserver “bad things” may happen. You have been warned.
How @miguelxpn found a bug in PHP’s standard library and fixed it.
Miguel Xavier Penha Neto란 사람이 PHP 표준 라이브러리의 버그를 고쳤다는 이야기.
Clean Code and Object Calisthenics Rules
https://beberlei.de/2020/02/25/clean_code_object_calisthenics_rules_i_try_to_follow.html
Benjamin Eberlei란 사람이 지키려고 하는 Clean Code / 객체 관리 규칙을 소개합니다.
- A strict coding style
- A static code analyzer, but not at highest level
- Take very good care of API Information Hiding and Encapsulation
- To new or not to new
- Separate Statements and Declartions by empty lines
- Use early exits and don’t use else
- Only one level of indentation per method and a second for early exits
- Don’t abbreviate names (too much)
- Prefer Null Coalesce Operator over if isset
- Don’t allow a variable to have two types
- Don’t re-use a variable with a different type
- Typehint Collection Items with assert
- Use structs to wrap arrays (especially from SQL results)
📺 Videos
📺 What’s coming in PhpStorm 2020.1 – Every week we publish a new 5-minute video.
https://www.youtube.com/playlist?list=PLQ176FUIyIUb7qSArPCxOkIGX-cqdfoBx
📺 PHP Tutorial for Absolute Beginners – PHP Course 2020 – 5 hours of video tutorials.
https://www.youtube.com/watch?v=yXzWfZ4N4xU
🔈 Podcasts
PHP Internals News
- #40 with Nikita Popov on three small accepted RFCs.
- #41 with Steven Wade on the proposal to add a magic __toArray().
- #42 with Jan Böhmer on userspace operator overloading.
- #43 with Nikita Popov on a fix for traits and improvement to the tokenizer.
The Undercover ElePHPant
- #8 about tuning php-fpm with Arne Blankerts from thephp.cc. Also see An Introduction to PHP-FPM Tuning blog post.
- #9 on background processes and workers with Samuel Rose (Symfony core). Also, see Five Challenges for Running Reliable PHP Background Processes.
Voices of the ElePHPant with Sara Golemon and Derick Rethans
https://voicesoftheelephpant.com/2020/02/26/interview-with-sara-golemon-derick-rethans/
a discussion of various updates in PHP 8.