PHP Annotated – September 2022

PHP Annotated 이미지

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

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


안녕하세요!

PHP Annotated 9월호에 오신 것을 환영합니다. 여기에서 선별된 뉴스, 기사, 도구 및 비디오를 포함하여 지난 한 달 동안 PHP 세계에서 일어난 가장 흥미로운 일을 따라잡을 것입니다.

News

PHP 8.2 RC 3 has been released

PHP 8.2 RC 3이 출시되었습니다.
일정에 따라 또다른 RC가 출시되었습니다. 다음 RC 4는 10월 13일에 출시될 예정입니다.
PHP 8.2에 추가될 기능에 대한 자세한 목록은 PHP.Watch 또는 stitcher.io를 참조하십시오.

또한 플래시 뉴스레터인 The Road to PHP 8.2를 확인하십시오 .

PHP 7.4.32, PHP 8.0.24, and PHP 8.1.11 have been released

PHP 7.4.32, PHP 8.0.24PHP 8.1.11이 출시되었습니다.

❗️현재 지원되는 브랜치의 보안 릴리스입니다. 모든 사용자는 업그레이드하는 것이 좋습니다.

PhpStorm 2022.3 EAP Is Open!

PhpStorm 2022.3 EAP가 공개되었습니다!

다음은 PhpStorm용 Early Access Program의 일부로 이미 시도해볼 수 있습니다.

  • 새 UI에 대한 베타 액세스
  • 전체 PHP 8.2 지원
  • 빠른 수정 미리보기
  • 기타 등등

PHP Core

Core 뉴스의 대부분은 PHP Foundation의 PHP Core Roundup 시리즈에서 자세히 다룹니다 . Roundup 시리즈의 여섯 번째 에피소드에서 PHP Core 팀의 모든 최신 개발 사항을 찾을 수 있으므로 간략하게만 언급하겠습니다.

📊 RFC: json_validate #PHP 8.3

RFC: json_validate

이 RFC에서 Juan Carlos Morales는 문자열에 유효한 JSON이 포함되어 있는지 확인하는 새 함수 json_validate()를 추가할 것을 제안합니다.

var_dump(json_validate('{ "test": { "foo": "bar" } }')); // true

📣 RFC: Improve unserialize() error handling #PHP 8.3

RFC: unserialize() error handling 개선

Tim Düsterhus는 직렬화 해제가 실패할 때 throw되는 새로운 UnserializationFailedException 추가를 제안합니다.

try {    $result = unserialize($serialized);
var_dump($result);
} catch (\UnserializationFailureException $e) {
// unserialization failed
}

📣 RFC: StreamWrapper Support for glob() #PHP 8.3

RFC: glob()에 대한 StreamWrapper 지원

Timmy Almroth는 glob() 함수를 지원하는 StreamWrappers 구현을 제안합니다.

glob('vfs://*.ext')

☝️ RFC: Deprecations for PHP 8.3

RFC: Deprecations for PHP 8.3

PHP 8.3의 사용 중단(deprecation) 및 제거(removal)에 대해 고려해야 할 기능을 나열하는 포괄적인 RFC입니다.

  • Passing negative $widths to mb_strimwidth()
  • The NumberFormatter::TYPE_CURRENCY constant
  • MT_RAND_PHP
  • Global Mersenne Twister

Tools

play.phpsandbox.io

play.phpsandbox.io – 아무것도 설치하지 않고 브라우저에서 바로 Composer 패키지를 사용해 보세요. 훌륭하네요!

matthiasnoback/php-ast-inspector

matthiasnoback/php-ast-inspector – 추상 구문 트리를 위한 단계별 디버깅(step-debugger)을 지원하는 커맨드라인 도구입니다. 사용하는 방법.

kladskull/xEroS

kladskull/xEroS – 100% PHP로 작성된 비트코인과 유사한 블록체인. 교육용으로 좋습니다.

sfx101/deck

sfx101/deck – 클릭 한 번으로 Docker 기반 로컬 개발 환경을 가동할 수 있는 데스크탑 도구입니다.

cspray/annotated-container

cspray/annotated-container – PHP 8 Attribute를 사용해 자동 연결되고(autowired) 기능이 풍부한 PSR-11 호환 컨테이너를 만들기 위한 종속성 주입 프레임워크!

Spring Boot에서 영감을 받은 프로젝트라고 합니다.

<?php declare(strict_types=1);

namespace Acme\AnnotatedContainerDemo;

use Cspray\AnnotatedContainer\Attribute\Service;

#[Service]
interface BlobStorage {
public function store(string $key, string $contents) : void;
public function retrieve(string $key) : ?string;

}

#[Service]
class FilesystemBlobStorage implements BlobStorage {
public function store(string $key, string $contents) : void {
file_put_contents($key, $contents);
}
public function retrieve(string $key) : ?string {
return @file_get_contents($key) ?? null;
}
}

#[Service]
class BlobStorageConsumer {
public function __construct(public readonly BlobStorage $storage) {}
// Some API methods that would interact with the BlobStorage instance
}

phparkitect/arkitect

phparkitect/arkitect – 이 도구를 사용하면 PHP 코드베이스에 대한 아키텍처 제약 조건을 정의하여 CI에서 실행할 수 있습니다.

openai-php/client

openai-php/client – OpenAI API와 상호 작용할 수 있는 클라이언트입니다.

OpenAI의 GPT-3 API에 액세스하는 다른 방법이 필요한 경우 orhanerday/open-ai도 있습니다.

WordPress/wordpress-wasm

WordPress/wordpress-wasm – WebAssembly 마법 덕분에 브라우저에서 WordPress를 실행합니다..

nadrad/h-m-m

nadrad/h-m-m – Hackers Mind Map – 마인드 맵 작업을 위한 간단하고 빠른 키보드 중심 터미널 기반 도구입니다.

흥미로운 점은 이것이 말 그대로 종속성이 없는 단일 PHP 파일이라는 것입니다!

h-m-m screenshot

Symfony

Revisiting Lazy-Loading Proxies in PHP by Nicolas Grekas.

PHP의 Lazy-Loading Proxies 재방문 by Nicolas Grekas.

Symfony 의 유지 관리 정책과 ocramius/proxy-manager의 유지 관리 정책 사이의 비호환성 때문에 운영하는 포크(friendsofphp/proxy-manager-lts)는 최대한 수정을 자제하고 있었지만, 최근 두가지 trait를 추가하게 된 배경을 설명합니다.

Symfony ParamConverter: the best friend you don’t know yet by Thomas Bertrand.

Symfony ParamConverter: 아직 모르고 있지만 가장 친한 친구 by Thomas Bertrand.

Designing Symfony Validator the TDD way by Mike Zukowsky.

TDD 방식으로 Symfony Validator를 디자인하기 by Mike Zukowsky.

Solving the modern applications dilemma with Symfony UX by Titouan Galopin.

Symfony UX로 최신 애플리케이션 딜레마를 해결합니다 - by Titouan Galopin.

Asserting the output of Symfony console commands by Andreas Möller.

Symfony 콘솔 명령 출력 확인 by Andreas Möller.

CQRS with Symfony Messenger by Adrian Garay.

Symfony Messenger를 사용한 CQRS by Adrian Garay.

StenopePHP/Stenope

StenopePHP/Stenope – Symfony용 정적 웹사이트 구축 도구. 본격적인 Symfony 앱을 만든 다음 원하는 위치에 정적 페이지로 배포할 수 있습니다.

phpsword/sword-bundle

phpsword/sword-bundle – Symfony를 사용한 최신 WordPress 개발. roots/bedrock과 같은 추가 기능이 있는 WordPress 대신 Sword는 WordPress를 포함하는 Symfony 프레임워크입니다. Sword란 무엇입니까?에서 자세히 알아보십시오.

Laravel

👨‍🏫 Laracon Online

Laracon Online - Laravel 커뮤니티의 모든 대화는 YouTube에서 볼 수 있습니다. 무엇보다도 Celeb Porzio는 Livewire의 미래를 발표했고 Taylor Otwell은 Laravel 팀의 새로운 학습 사이트인 Laravel Bootcamp를 발표했습니다.

📺 What’s new in Laravel 9.31.0

What’s new in Laravel 9.31.0 – Christoph Rumpel의 간결한 비디오 overview.

Working with OS process in PHP by Steve (King) McDougall.

PHP에서 OS 프로세스 작업 by Steve (King) McDougall.

Drawbacks behind Laravel Facades by Grzegorz Korba.

Laravel Facade 이면의 단점 by Grzegorz Korba.

A Deep Dive Into Laravel Queues by Farhan Hasin Chowdhury.

Laravel 대기열(Queue)에 대한 심층 분석 by Grzegorz Korba.

Laravel의 Job, Queue, Worker에 대한 완전한 가이드.

Sammyjo20/laravel-haystack

Sammyjo20/laravel-haystack – 매우 간단하지만 강력한 데이터베이스 기반 작업 체인입니다.

dietercoopman/mailspfchecker

Dietercoopman/mailspfchecker – 주어진 이메일 주소를 대신하여 주어진 메일 서버를 통해 이메일을 보낼 수 있는지 확인하는 패키지 - 사용법.

ksassnowski/venture 4.0.0

ksassnowski/venture 4.0.0 – Laravel 앱에서 복잡한 비동기 워크플로를 만들고 관리하기 위한 패키지입니다.

YorCreative/Laravel-Scrubber

YorCreative/Laravel-Scrubber – 운영 보안 정책을 위반하는 민감한 정보가 개발자에 의해 실수로 또는 다른 방식으로 누출되는 것을 방지하는 패키지입니다. - 사용법.

hotmeteor/receiver

hotmeteor/receiver – Laravel용 드롭인 웹훅 처리 라이브러리입니다.

dedoc/scramble

dedoc/scramble – Laravel용 자동 OpenAPI 문서 생성기. PHPDoc 주석이 필요하지 않습니다.

findapr.io

findapr.io – 기여할 오픈 소스 Laravel 및 PHP 프로젝트를 찾는 데 도움이 되는 사이트입니다.

Other Frameworks

spiral/framework v3.0.0

spiral/framework v3.0.0 - RoadRunner 제작자의 프레임워크 주요 업데이트.

PHP 8.1이 필요하며 새로운 필터 및 유효성 검사, 작업 직렬화, 오류 핸들러, 대기열 및 콘솔 인터셉터, 이벤트 디스패처(PSR-14), 주입 가능한 열거형, 더 유연한 라우터, 최적화된 부트로더 및 더 나은 성능을 제공합니다.

Phalcon PHP Framework reached its major 5.0 release.

Phalcon PHP 프레임워크가 major 5.0 릴리스에 도달했습니다.
Phalcon은 PHP 확장으로 제공되기 때문에 독특한 프레임워크입니다. 그러나 로드맵에 따르면 팀은 기존 모델로 전환하기로 결정했으며 다음 주요 릴리스는 PHP 패키지로 계획하고 있습니다.
5.0의 새로운 기능에 대한 자세한 목록은 업그레이드 페이지를 확인하십시오.

api-platform/api-platform 3.0

api-platform/api-platform 3.0 – Symfony를 기반으로 구축된 이 성숙한 프레임워크를 통해 REST 및 GraphQL API 등을 생성할 수 있습니다.

Appwrite 1.0

Appwrite 1.0 – 최신 웹 또는 모바일 애플리케이션을 구축하는 데 필요한 API를 제공하는 오픈 소스 서비스로서의 백엔드 솔루션의 주요 안정적인 릴리스입니다.

작년에 Appwrite는 nginx+php-fpm에서 Swoole로 마이그레이션 하여 91%의 성능 향상을 경험했습니다.

James Brooks(@jbrooksuk) 트윗

어떤 프레임워크가 가장 좋은지 논하기에는 인생이 너무 짧습니다.
자신에게 좋은 것을 사용하고 계속 진행하십시오. 👍🏻

기타

Asymmetric visions by Brent Roose.

Brent Roose의 비대칭 비전.

비대칭 가시성(Asymmetric Visibility) RFC는 좋은 RFC이고 유연하고 Readonly properties을 완전히 대체합니다.
Brent가 우려하는 건 RFC 자체의 문제가 아니라 이 RFC가 readonly property를 완전히 대체하면서, readonly property가 사라질지 모르는 두려움이라고 합니다. 겨우 1년 전에 추가된 기능의 존속 여부가 불안해지는 것에 대한 우려이죠. 게다가 이미 작년에 Nikita의 유사한 아이디어에 관해 많은 논의를 했었고, readonly property가 use case의 90%는 커버할 수 있고 이 정도면 충분다고 결론이 났다고 합니다. 비대칭 가시성은 2년 전 readonly property에 관해 많은 논의를 했을 때 결정했어야 할 문제라고 생각한다고 합니다.

이 글의 마지막에는 readonly가 해결하지 못하는 문제를 연구가 이루어지고 있다고 그 예시를 소개하기도 합니다.

Increase code coverage successively by Andreas Heigl.

Andreas Heigl의 코드 coverage 범위를 연속적으로 늘리십시오.

phpcov를 이용해 새로 기여한 코드에 대한 테스트를 포함하도록 강제하는 방법을 소개합니다.

Testing Randomness of PHP Random Number Functions by Ayesh Karunaratne.

Ayesh Karunaratne의 PHP 난수 함수의 무작위성 테스트.

운영 체제나 프로그래밍 언어 런타임은 다양한 알고리즘을 사용하여 난수를 생성합니다. 동전 던지기처럼 실생활에서 볼 수 있는 진짜 난수 생성기에 비해 이런 의사(Pseudo) RNG(난수생성기, Random Number Generator)는 초기 “시드” 값에 의존하고 초기 시드 값과 알고리즘을 아는 것만으로도 난수의 전체 스트림을 예측하기에 충분합니다.

이 글에서 PHP 8.2 이후 제공되는 난수 생성기의 무작위성을 측정하기 위해 GD 확장을 사용해 임의의 X 및 Y 좌표에 단일 픽셀을 배치하여 이미지를 그립니다.
미리 결정된 시도 횟수에서 대부분 픽셀 분포가 균일한 이미지는 “진정한” RNG에 가까운 난수 생성기를 나타냅니다. 순수하게 시드 값을 기반으로 하는 값을 생성하는 RNG(예: Mersenne Twister)는 시드가 동일하게 유지되는 경우 동일한 출력을 생성해야 합니다.

다양한 RNG를 소개하고 실험하지만 마지막에는 random_int/random_bytes를 추천하네요.

모든 난수 생성 목적에 대해 random_int 및 random_bytes 함수를 사용하는 것은, 예외로 실패하기도 하고(안전하지 않은 알고리즘을 자동으로 기본값으로 설정하는 대신) PHP 7.0 이후의 모든 PHP 버전에서 지원되기 때문에 권장됩니다.

Granular interfaces by Sebastian De Deyne.

Sebastian De Deyne의 세분화된 인터페이스.

SOLID의 I에 관한 글.

Adding the last types to PHP code by Damien Seguy.

Damien Seguy의 PHP 코드에 마지막 유형 추가하기.

99.9% 타이핑을 향한 여정은 예상보다 길었고 몇 가지 가벼운 함정이 나타났습니다.

  • 보이지 않는 유형
  • 이전보다 더 많은 캐스팅
  • 기본값 처리
  • 임시값 관리
  • resource와의 씨름
  • 캐시 메커니즘으로 저글링

The three nothings of PHP by Damien Seguy explaining the difference between null, void, and uninitialized.

Damien Seguy의 PHP의 세 가지 빈 값(nothing) : null, void, uninitialized의 차이점을 설명.

Is it a DTO or a Value Object? by Matthias Noback.

그건 DTO입니까? Value Object입니까? by Matthias Noback.

Matthias Noback의 기준

  • DTO
    • 원시 데이터(문자열, 부울, 부동 소수점, null, 이러한 것들의 배열)를 보유하는 객체
    • 비즈니스 관점에서 실제로 의미가 있다고 보장하지 않음
    • 값의 정확성에 대한 보증을 제공하지 않음 : 문자열은 비어 있을 수 있고, 정수는 음수일 수 있습니다
    • DTO는 데이터가 애플리케이션에 들어가는 위치와 애플리케이션을 나가는 위치의 두 곳에서만 사용해야 합니다
  • Value Object
    • 하나 이상의 값 또는 값 객체를 래핑 하는 객체
    • 도메인 관점에서 의미가 있음을 보장
    • 값의 정확성에 대한 증거를 제공 : 문자열은 더 이상 비어 있지 않으며 숫자가 올바른 범위에 있는지 확인됩니다
    • 값 객체는 값이 우리의 기대와 일치하는지 확인하고 다시 확인하고 싶지 않은 모든 위치에 사용됩니다

참고 : ValueObject by Martin Fowler

Can we consider DateTimeImmutable a primitive type?

DateTimeImmutable을 원시(primitive) type으로 고려할 수 있습니까?

Matthias Noback은 “그렇지 않다”고 결론지었습니다. Andreas Möller는 더 나아가 자신의 Enhancing types 블로그 게시물에서 그건 단순한(simple) type이라고 제안합니다.

바로 위 Matthias Noback의 글에서 DTO가 오직 원시(primitive) type의 값만 보유한다고 했는데, 그렇다면 DateTimeImmutable도 원시 type으로 분류할 수 있는지 고찰하는 글입니다.

이어 소개된 Andreas Möller의 글에서는 “정교한(sophisticated) 원시 type” 혹은 “단순한(simple) type”으로 부를 수 있을 것이라고 이야기 합니다. Ted M. Young은 이를 비제약 type이라고 표현하며 원시 type에 대한 집착을 버려라는 발표(Stop Obsessing About Primitives])를 하기도 했습니다.
글 마지막에 소개된 것처럼 원시 type에 집착하지 않고, 더 적절한 type을 찾아갈 필요가 있습니다.

Named arguments by Sebastian De Deyne.

Sebastian De Deyne의 명명된 인수(Named arguments).

How PHP engine builds AST by Anton Sukhachev.

PHP 엔진이 AST 를 구축하는 방법 by Anton Sukhachev.

Pholyglot (PHP to PHP+C polyglot transpiler)

Pholyglot (PHP에서 PHP+C로의 다중 언어 번역기) – PHP의 하위 집합을 입력으로 사용하고 PHP와 C 모두에서 실행할 수 있는 다중 언어 코드를 출력하는 작은 취미 프로젝트 변환기입니다.

Plotting the memory of a PHP process with Gnuplot by Grégoire Paris.

Gnuplot로 PHP 프로세스의 메모리를 플로팅하기 by Grégoire Paris.

Gnuplot는 “a portable command-line driven graphing utility”라고 합니다.

Say hello to TLDR

Marcel Pociot(@marcelpociot)의 트윗

특정 코드 조각이 무엇을 하는지 궁금해 한 적이 있습니까?

TLDR plugin을 확인해보세요.

TLDR 이미지

Video

📺 PHP For Beginners

초심자를 위한 PHP – 누군가가 “2022년에 PHP를 어떻게 배우나요?”라고 묻는다면 Jeffrey Way의 이 과정이 답입니다.

📺 PHP in 1 minute by Brent Roose.

1분 동안 살펴보는 모던 PHP by Brent Roose.

PHP is not dead.

📺 PHP is breaking my code! by Brent Roose.

PHP가 내 코드를 깨고 있습니다! by Brent Roose.

동적 속성은 PHP 8.2에서 더 이상 사용되지 않으며 커뮤니티는 이에 대해 분열되어 있습니다.

📺 Pest From Scratch with Luke Downing.

처음부터 따라하는 Pest with Luke Downing.

Conferences

대면 이벤트가 한창입니다. 다음의 대규모 PHP 행사를 확인하세요.

다음 PHP 밋업이 언제인지 궁금 하시다면? – Tomas Votruba는 그의 사랑스러운 friendsofphp.org 모임 수집기로 여러분을 안내합니다.