PHP Annotated – March 2020

Php_annotated_monthly 이미지

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
{
<keyword> public int $a = 1;
<keyword> public string $b;
<keyword> public array $c = ["foo"];
<keyword> public object $d;

public function __construct()
{
$this->b = "foo";
}
}

$foo = new Foo();

$foo->a = 42; // EXCEPTION: property a has already been initialized
$foo->b = "bar"; // EXCEPTION: property b has already been initialized
$foo->a++; // EXCEPTION: incrementing/decrementing is forbidden
unset($foo->c); // EXCEPTION: unsetting is forbidden
$foo->c[] = "bar"; // EXCEPTION: arrays can't be modified
$var= &$this->c; // EXCEPTION: reference isn't allowed

$foo->d = new Foo(); // SUCCESS: property d hasn't been initialized before
$foo->d->foo = "foo"; // SUCCESS: objects are still mutable internally

[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);

function byRef(&$ref) {...}
byRef(&$var);

[RFC] Increment/Decrement Fixes

https://wiki.php.net/rfc/increment_decrement_fixes

경우에 따라 덧셈/뺄셈 연산자가 명시적으로 1을 더하거나 빼는 연산에서 일관되게 동작하지 않는 문제가 있습니다. 예를 들면,

<?php

$a = [];
$a = ++$a; // [] and no errors
$a = $a + 1; // Fatal error

이 RFC는 PHP 8에서 오류를 수정하고 Error를 던질 수 있도록 제안합니다.

[RFC] Attributes v2

https://wiki.php.net/rfc/attributes_v2

이 RFC는 <<, >>를 사용해 완전한 어노테이션(annotations)을 추가하기 위한 두번째 시도입니다.

이전에 simple annotationsattributes같은 제안이 있었지만 투표를 통과하진 못했습니다.

use Doctrine\ORM\Mapping as ORM;

<<ORM\Entity(["repositoryClass" => UserRepository::class])>>
<<ORM\Table("users")>>
class User
{
<<ORM\Id, ORM\Column, ORM\GeneratedValue>>
public int $id;

<<ORM\Column(["unique" => true])>>
public string $email;

<<ORM\ManyToOne()>>
public ?Address $address;
}

[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

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

https://www.miguelxpn.com/coding/php/opensource/2020/03/01/how-i-found-and-fixed-a-bug-in-php-std-lib.html

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

The Undercover ElePHPant

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.