PHP Annotated — September 2021

Php_annotated 이미지

Roman Pronskiy가 쓰고 JetBrains에서 제공하는 PHP Annotated 2021년 9월호의 번역/해석본입니다.

이 중에서 몇 가지 제 취향껏 골라 그 안의 내용도 좀 뒤져보고 개발새발 번역해서 소개합니다.


PHP 8.1이 첫 번째 release candidate에 도달했으며(RC 1) 변경 사항 목록이 확정되었습니다. 11월 말에 예정된 최종 릴리스 전에 최소 5개의 릴리스 후보가 더 있을 것입니다.

한편, PHP 8.2에 대한 세 가지 추가 제안(연산자 오버로딩, $this type hint, 동적 속성 지원 중단)과 관련하여 PHP 내부에서 이미 논의가 진행 중입니다.

malware composer 패키지를 조심하십시오! 그 중 2개는 최근 Packagist에서 발견되었습니다.

PHP-FIG는 PSR에 새로운 유형의 표준을 추가하는 방법에 대해 설명합니다.

⚡️ News

PHP 8.1.0 RC 1

https://www.php.net/archive/2021.php#2021-09-02-1

최종 릴리스는 아직 2개월 반이 남았으며 최소 5개의 릴리스 후보가 더 나옵니다.

8.1 버전의 최종 릴리스는 아직 2개월 반 남았으며 최소 5개의 릴리스 후보가 더 남아 있습니다. 여기 Homebrew로 macOS에 PHP 8.1을 설치하는 방법에 대한 간단한 튜토리얼도 있습니다. 또한 PHP 8.1에는 이미 만들어진 Docker 이미지도 있습니다.

PHP 8.1에 대한 포괄적인 설명은 php.watch/versions/8.1 및 Brent Rooses의 블로그인 stitcher.io/blog/new-in-php-81에서 찾을 수 있습니다.

PHP 8.0.10, PHP 7.4.23, PHP 7.3.30

https://www.php.net/ChangeLog-8.php#8.0.10
https://www.php.net/ChangeLog-7.php#7.4.23
https://www.php.net/ChangeLog-7.php#7.3.30

The end of Swiftmailer

https://symfony.com/blog/the-end-of-swiftmailer

인기 있는 메일 패키지 Swiftmailer는 11월까지만 지원됩니다. Swiftmailer의 차세대 버전이라 할 수 있는 symfony/mailer로 대체할 수 있습니다.

Symfony/mailer의 기능과 개념은 Swiftmailer와 동일하므로 마이그레이션이 상당히 쉬울 것입니다(DSN format 등 일부 다른 점이 존재합니다).
Rector에는 마이그레이션 스크립트가 있으며 클래스 이름만 변경하면 됩니다.

PHP Evolving Recommendations (PERs)

https://github.com/php-fig/fig-standards/pull/1235

PHP-FIG는 현재 PSP 표준만 출시합니다. 문제는 일부 표준에는 지속적인 개선이 필요하다는 것입니다. 예를 들어 코드 스타일의 경우 PSR-12가 PSR-2를 대체했으며 이제 PHP 7.4-8.0의 새로운 기능이 포함되지 않습니다.

이제 시간이 지남에 따라 변경될 수 있는 PER이라는 특별한 유형의 권장 사항을 채택하자는 제안이 있습니다.

Malware Composer packages

Packagist에는 symfony/process와 똑같은 일을 하는 symfont/process라는 패키지가 있었는데, 머신에 대한 정보를 수집하여 제3자에게 보내고 웹 쉘을 열었습니다.

공격자는 사용자가 설치 중에 패키지 이름의 철자를 틀리고 symfony 대신 symfont를 입력할 가능성이 있다고 예상했습니다.

맬웨어 패키지는 이미 Packagist와 GitHub에서 제거되었으며 작동 방식에 대한 분석을 확인할 수 있습니다.

또 다른 백도어는 laraveli/qr-code 패키지에서 발견되었습니다. 코드에서 알 수 있듯이 멀웨어는 이러한 유형의 웹 셸을 시스템에 복사하고 있었습니다.

이러한 공격으로부터 자신을 보호하기 위해 CI 파이프라인에 local-php-security-checker를 추가하거나 the-php-security-checker GitHub Action을 사용할 수 있습니다.

더 복잡한 경우에는 marcocesarato/PHP-Antimalware-Scanner를 실행할 수 있습니다.

The hautelook/alice-bundle repository was removed from GitHub

https://packagist.org/packages/hautelook/alice-bundle

이 패키지는 800만 개 이상의 다운로드를 기록했으며 main contributor는 자신이 관리자 목록에서 제거되고 저장소가 비공개로 설정된 이유를 알지 못합니다.

nelmio/alice 이슈에서 Théo가 예상하는 원인이 나와있고, 여기 언급된 것처럼 Théo의 fork 버전인 theofidry/AliceBundle로 대체해서 사용할 수 있습니다.

🐘 PHP Internals

[RFC] Deprecate dynamic properties

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

현재 버전의 PHP에서는 존재하지 않는 속성에 쓰려고 하면 자동으로 생성됩니다.

현대(modern) 코드에서 존재하지 않는 속성에 쓰는 일은 의도적으로 수행되는 경우가 거의 없으며 대개 실수입니다.

이 RFC는 동적(선언되지 않은) 속성을 만드는 기능을 더 이상 사용하지 않고 제거할 것을 제안합니다.

class User {
public $name;
}

$user = new User;

// Assigns declared property User::$name.
$user->name = "foo";

// Oops, a typo:
$user->nane = "foo";

// PHP 8.2: Throws a warning but still creates a dynamic property.
// PHP 9.0: Throws Error exception.

이 변경 사항은 stdClass 및 해당 상속자에는 적용되지 않습니다. magic method __get/__set의 동작도 이 변경의 영향을 받지 않습니다.

$obj = (object) []; // = new stdClass;

// No deprecation warning
$obj->foo = 1;

class myStdClass extends stdClass {}
$obj2 = new myStdClass;

// No deprecation warning
$obj2->bar = 1;

PHP 9.0의 이러한 변경으로 (더 이상 properties 멤버를 저장하지 않아도 되므로) 객체의 크기를 8바이트 줄일 수 있습니다. 물론 단일 객체의 경우 이것은 아무것도 아닙니다. 그러나 대규모 응용 프로그램의 경우 누적하면 눈에 띄는 차이가 발생할 수 있습니다.

stdClass의 별칭을 DynamicObject로 지정하는 것이 타당한지에 대한 논의도 있습니다.

[RFC] User Defined Operator Overloads

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

이 RFC에서 Jordan LeDoux는 기본적으로 각 연산자에 대해 서로 다른 magic method를 정의할 것을 제안합니다. 예를 들어 +의 경우 __add() 또는 ==의 경우 __equals().

이러한 방법을 사용하면 개체에 적용되는 연산자의 원하는 동작을 설명할 수 있습니다.

$a = new Number(8);
$b = new Number(6);
$c = new Number(4);

// Instead of this
$posRoot = $b->mul(-1)->add($b->pow(2)->sub($a->mul($c)->mul(4))->sqrt())->div($a->mul(2));

// It would be possible do it like this
$posRoot = ((-1 * $b) + ($b ** 2 - 4 * $a * $c)->sqrt()) / (2 * $a);

제안이 수락되면 사용자 영역 코드에서 스칼라 객체의 동작을 구현하는 것이 가능해집니다.

[RFC] $this return type

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

Nikita는 $this를 반환 값 유형으로 사용하는 아이디어를 제시했습니다. 이로 인해 인터프리터는 객체가 반환된 객체와 동일한지 확인합니다.

다음은 Ben Ramsey의 self 및 static과 비교하는 방법입니다.

  • self – 반환 값은 이 type 선언을 설정하는 동일한 클래스의 인스턴스여야 합니다.
  • static – 반환 값은 이 type 선언으로 메서드를 호출하는 동일한 클래스의 인스턴스여야 합니다.
  • $this – 반환 값은 이 type 선언으로 메서드를 호출하는 인스턴스와 동일한 인스턴스여야 합니다.
class Test {
public function method(): $this {
return $this;
}

public function not_this(): $this {
return new self(); // Fatal Error
}
}

$this type은 static의 subtype입니다. 따라서 하위클래스에서 static type을 $this로 제한하는 것은 가능합니다. 그 반대는 불가능.

class A {
public function method1(): static {}
public function method2(): $this {}
}

class B extends A {
// This override is legal.
public function method1(): $this {}

// This override is illegal.
public function method2(): static {}
}

[RFC] Deprecate partially supported callables

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

다음 콜러블은 현재 콜러블, is_callable() 함수 및 call_user_func()에서 허용되지만 $callable()에서는 지원되지 않습니다.

"self::method"
"parent::method"
"static::method"
["self", "method"]
["parent", "method"]
["static", "method"]
["Foo", "Bar::method"]
[new Foo, "Bar::method"]

이 RFC는 PHP 8.2에서 deprecate되며 PHP 9.0에서 이 callable에 대한 지원을 제거할 것을 제안합니다.

“function”, “Foo::method”, [“Foo”, “method”] 또는 [new Foo, “method”]와 같은 일반적인 호출 가능 항목은 이 제안의 영향을 받지 않습니다. 중괄호로 호출하면 예상대로 작동합니다:

class Foo {
function method() {
echo 'method';
}
}
[new Foo, "method"]();
// > method

All PHP RFCs on GitHub

https://github.com/ramsey/php-rfcs

실험으로, PHP 8.1 릴리스 관리자인 Ben Ramsey는 지금까지 논의된 모든 838개 RFC를 각각의 변경 내역과 함께 Git으로 내보냈습니다.

🛠 Tools

whsv26/functional

https://github.com/whsv26/functional

저자는 컬렉션의 기존 PHP 구현에 문제가 있어 자신이 직접 패키지를 작성했습니다.

저자가 reddit에 올린 글에 의하면 type safe하고 map, filter, reduce와 같은 연산 체인에 유용합니다.

phabelio/phabel

https://github.com/phabelio/phabel

이 PHP용 변환기를 사용하면 이전 환경에서 또는 이전 버전과의 호환성을 유지해야 하는 경우 최신 PHP 버전의 기능을 사용할 수 있습니다. async/await 키워드와 같이 아직 존재하지 않는 기능에 대한 지원을 추가할 수도 있습니다.

marcioAlmada/yay 또는 preprocess.io와 같은 유사한 도구가 이미 존재합니다. 그리고 Rector는 백포트도 할 수 있습니다. 그러나 Phabel의 특별한 점은 Composer와의 쉬운(transparent) 통합입니다.

phparkitect/arkitect

https://github.com/phparkitect/arkitect

프로젝트의 아키텍처 규칙을 정의하고 확인하기 위한 도구입니다.

niklongstone/regex-reverse

https://github.com/niklongstone/regex-reverse

주어진 정규식을 만족하는 임의의 문자열을 생성합니다.

azjezz/psl

https://github.com/azjezz/psl

hhvm/hsl에 영감을 받은 표준 PHP 라이브러리입니다.

Psl의 목표는 PHP 프로그래머를 위해 일관되고 중앙 집중식이며 형식이 잘 지정된 API 세트를 제공하는 것입니다.

github-php/sponsors

https://github.com/github-php/sponsors

GitHub 스폰서 API 작업을 위한 패키지입니다. 후원자 여부를 확인하여 접근통제를 구성할 수 있습니다.

koriym/Koriym.Attributes

https://github.com/koriym/Koriym.Attributes

단일 인터페이스를 통해 PHPDoc 주석 및 PHP 8 속성을 읽을 수 있는 간단한 도구입니다. 동일한 작업에 더욱 발전된 spiral/attributes도 사용할 수 있습니다.

grep.app

https://grep.app/

GitHub에서 빠른 코드 검색을 위한 편리한 도구입니다.

mrsuh/php-generics

https://github.com/mrsuh/php-generics

PHP로 작성된 PHP 제네릭. 이것은 PHP에서 구문 수준 제네릭을 구현하려는 흥미롭고 기능적인 시도입니다.

Symfony

kafkiansky/symfony-middleware

https://github.com/kafkiansky/symfony-middleware

Symfony용 PSR-15 호환 미들웨어.

lexik/LexikTranslationBundle

https://github.com/lexik/LexikTranslationBundle

번역 파일 내용을 데이터베이스로 import/export하고 번역을 편집하기 위한 GUI를 제공합니다.

Helpers for testing your applications based on Symfony components

Symfony 구성 요소를 기반으로 하는 애플리케이션 테스트를 위한 도우미

Symfony Messenger in microservices

https://medium.com/@dmitrii_tarasov/symfony-messenger-in-microservices-message-contracts-and-resilience-b9cc1a95fcf9

메시지 계약 및 탄력성 – 마이크로서비스 및 비동기식 통신에 대한 흥미로운 글입니다.

Ultimate Guide to Symfony Components

https://alex-daubois.medium.com/ultimate-guide-to-symfony-components-2021-7ac9908f8aa2

Symfony Component에 대한 궁극의 가이드. 당신의 프로젝트에서 어떤 component를 왜 써야 하는가.

How to dynamically validate some data with Symfony Validator.

https://jolicode.com/blog/how-to-dynamically-validate-some-data-with-symfony-validator

Symfony Validator로 일부 데이터를 동적으로 검증하는 방법.

Symfony plugin for PhpStorm has just got support for PHP8 Doctrine metadata attributes.

https://twitter.com/BigHaehnchen/status/1436029166403702786

Symfony plugin for PhpStorm이 PHP8 Doctrine metadata 속성을 지원한다는 소식.

Laravel

State of Laravel 2021 survey results

https://stateoflaravel.com/

4,500명의 개발자가 참여한 설문 조사 결과입니다. Laravel Daily에서 비디오 리뷰도 볼 수 있습니다.

lepikhinb/laravel-fluent

https://github.com/lepikhinb/laravel-fluent

이 패키지는 모델 속성을 정의하는 풍부한 표현 방법을 제공합니다. 런타임에 자동으로 형변환을 빌드하고 모델 속성에 기본 type에 따라 자동 완성을 추가합니다.

Creating a RoadRunner plugin for Laravel Octane

https://medium.com/@SlyFireFox/laravel-octane-build-your-first-plugin-for-roadrunner-d8906f0f5926

Go로 만들어진 PHP 어플리케이션 서버인 RoadRunner를 위한 플러그인을 만들어봅니다.

📺 Testing Laravel

https://testing-laravel.com/

Spatie의 유료 테스트 교육. 무료 에피소드도 있습니다 : Testing Middleware,
Cool Laravel Testing Techniques, and Testing a Form.

📺 The Queue Component in Laravel

https://www.youtube.com/watch?v=m-hNL87-lFo&list=PLcjapmjyX17hJZ-shzRMxTus0aMw0EVVB&index=8&t=25s

이제 막 시작하는 사람들을 위한 프레임워크에 대한 비디오 시리즈입니다.

📺 Planning & Kickstarting the Laravel Application

https://www.youtube.com/watch?v=2RlbXNjhQkc&t=168s

Laravel 핵심 팀의 일원인 Mohamed Said의 흥미로운 스트림입니다. 스트림에서 그는 앱을 작성하고, 단계별로 왜 그렇게 하는지 설명합니다.

Christoph Rumpel은 다가오는 모든 스트림에 대한 알림을 받을 수 있는 멋진 웹사이트 larastreamers.com을 만들었습니다.

📺 PHP Roundtable: 10 Years Laravel

https://www.youtube.com/watch?v=eq2YAQpfir0

Taylor Otwell, Matt Stauffer, Eric Barnes가 함께 합니다.

Yii

Yii news 2021, issue 3

https://opencollective.com/yiisoft/updates/yii-news-2021-issue-3

💡 기타 읽을 만한 글

A couple of posts from Larry Garfield with helpful test-writing techniques

유용한 테스트 작성 기술이 포함된 Larry Garfield의 몇 가지 게시물:

Fun with PHPUnit Data Providers

  • Data Providers를 설명하면서 generator를 활용하면 얼마나 더 편해지는지 설명합니다.

Advanced PHPUnit shenanigans

  • Testdox를 활용해 테스트 결과를 단순히 점(.) 하나로 표현하지 않고 문장으로 메시지를 출력할 수 있습니다.
    /**
    * @dataProvider pythagorasProvider
    * @testdox The square of $a plus the square of $b is the square of $c.
    */
    public function validate_triangles(float $a, float $b, float $c): void
    {
    $this->assertSame($c * $c, $a * $a + $b * $b);
    }
  • Data provider에 callable을 전달해 동적 assertion을 만들 수 있습니다.
  • Custom assert 함수를 활용할 수도 있습니다.

Test tip from Matthias Noback: Write self-contained tests

https://matthiasnoback.nl/2021/09/quick-testing-tips-self-contained-tests/

Matthias Noback의 테스트 팁

On using PSR abstractions

https://matthiasnoback.nl/2021/08/on-using-psr-abstractions/

Matthias Noback은 코드를 PSR에 묶거나, 래퍼를 만들거나, 고유한 인터페이스를 작성하는 것이 더 나은지 여부에 대해 설명합니다. Brent Roose이 이에 대해 답변을 하기도 했습니다. 그는 FIG의 진정성과 노력에도 불구하고 그들이 존재하지 않는 문제를 해결하기 위해 노력하고 있다고 믿는다고까지 이야기 합니다. FIG는 목표를 이루었으니 이제 그만 완료 선언을 해야 한다고요.

Creating a public/private multi-monorepo for PHP projects

https://www.smashingmagazine.com/2021/08/public-private-multi-monorepo-php-projects/

PHP 패키지를 비공개로 유지하면서 개발 경험을 더 빠르게 만들기 위해 “다중 모노레포” 접근 방식을 사용하는 방법을 살펴봅니다. 이 솔루션은 PRO 플러그인 제작자에게 특히 유용할 수 있습니다.

All about match expressions from PHP 8.0

https://ryangjchandler.co.uk/posts/all-about-match-expressions

PHP 8.0에서 등장한 match 표현식 정리

📺 A couple of videos about Xdebug 3 from Derick Rethans

Profiling: Analysing Data
Activation and Triggers

🔈 Podcasts

devmode #89 – Should Craft CMS use Yii3 or Laravel? – CraftCMS is a commercial CMS based on Yii2. In this podcast, its developers discuss the Craft CMS ecosystem and its potential transition to Laravel.

PHP Internals News #94 – Nikita Popov discusses RFC Unwrap Reference After Foreach.

PHP Internals News #93Jordan LeDoux discusses the already revoked RFC Never For Parameter Types.