ha-ah

로그, 게으른 로그

PHP Annotated 이미지

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

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


안녕하세요!

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

PHP Annotated 6월호를 편집하는 데 도움을 준 Sergey Panteleev에게 감사드립니다.

News

php.net received a new homepage design!

php.net이 새로운 홈페이지 디자인을 받았습니다!

새로운 모습을 보여주신 Lucas Azevedo와 팀에 감사드립니다.

❗PHP 7.4.30, PHP 8.0.20, and PHP 8.1.7 have been released

PHP 7.4.30 , PHP 8.0.20 , PHP 8.1.7 이 릴리스되었습니다

이것은 지원되는 브랜치에 대한 보안 업데이트입니다. 모든 사용자는 최신 버전으로 업그레이드하는 것이 좋습니다.

PHP 8.2.0 Alpha 1 has been released

PHP 8.2.0 Alpha 1이 릴리스되었습니다

PHP 8.2 릴리스 프로세스를 시작하는 첫 번째 알파가 출시되었습니다. 업데이트는 정해진 일정에 따라 2주마다 릴리스되며 최종 릴리스는 11월 24일 경으로 예상됩니다.
기능 동결(feature freeze)은 7월 19일에 예상되며, 이는 일부 변경 사항이 여전히 릴리스에 포함될 수 있음을 의미합니다. 현재 가장 눈에 띄는 변화는 다음과 같습니다.

전체 변경 사항 목록은 php.watch/versions/8.2를 참조하십시오.

Mac을 사용하는 경우 shivammathur/homebrew-php 덕분에 Nightly 채널을 통해 homebrew로 PHP 8.2를 사용해 볼 수 있습니다 .

그렇지 않으면 Docker 이미지가 번거로움 없이 시도해 볼 수 있는 가장 좋은 옵션일 것입니다.

PER Coding Style has been tagged 1.0.0

PER 코딩 스타일에 1.0.0 태그가 지정되었습니다.

PHP-FIG(@phpfig)의 트윗

PER 코딩 스타일 1.0.0은 PSR-12와 동일합니다. 이 권장 사항은 이제 PHP 언어로 제공되는 모든 새로운 기능을 따라잡기 위해 훨씬 더 빠르게 발전할 것입니다.

작업 그룹 모두를 축하합니다!

PhpStorm 2022.2 Early Access Program Is Open

PhpStorm 2022.2 Early Access Program 공개

Rector의 Built-in 지원, PHP의 제네릭에 대한 많은 개선 사항 등이 있습니다.

Developer Ecosystem Survey 2022

개발자 생태계 설문조사 2022

연례 생태계 설문조사에 참여하여 MacBook Pro, Xbox Series X, PlayStation 5 또는 기타 상품을 받을 수 있는 기회를 잡으십시오.

PHP Core

Core 뉴스의 대부분은 PHP Foundation 의 PHP Core Roundup 시리즈에서 자세히 다룹니다. 이 시리즈의 세 번째 에피소드가 곧 출시될 예정이므로 간략하게만 언급하겠습니다.

✅ RFC: Add true type #PHP 8.2

RFC: 트루 타입 추가 #PHP 8.2

유사 유형이었던 nullfalse에 추가하여 PHP는 이제 true 독립형 유형을 갖게 되며 이는 false에 대응합니다.
자세한 내용 은 이 변경 사항의 작성자인 George P. Banyard와 함께 하는 Derik Rethans의 PHP Internals News 팟캐스트를 들어보십시오.

✅ RFC: Undefined Property Error Promotion #PHP 9.0

RFC: 정의되지 않은 속성 접근 시 오류 발생 #PHP 9.0

기존 E_WARNING이 Error로 승격됩니다.
Magic 메서드로 handler를 통해 지원되는 getter 메서드는 유지됩니다.

✅ RFC: Expand deprecation notice scope for partially supported callables #PHP 8.2

RFC: 부분적으로 지원되는 callable에 대한 지원 중단 알림(deprecation notice) 범위 확장 #PHP 8.2

📊 RFC: Stricter implicit boolean coercion #PHP 8.2

RFC: 더 엄격한 암시적 부울 강제 변환 #PHP 8.2

📊 RFC: Create a global login system for php.net

RFC: php.net용 글로벌 로그인 시스템 생성

RFC는 *.php.net 사이트용 SSO 생성을 제안합니다. 다만 시행 계획이 불투명해 1차 시도를 넘지 못할 가능성이 큽니다.

📊 RFC: Random Extension 5.x #PHP 8.2

RFC: Random Extension 5.x #PHP 8.2

이 RFC와 이전의 시도 이후의 지속적인 노력에 감사드립니다.

🤔 RFC: Fetch properties in const expressions #PHP 8.2

RFC: const 표현식에서 속성 가져오기 #PHP 8.2

enum A: string {    
case B = 'B';
// This is currently not permitted
const C = [self::B->value => self::B];
}

이것이 매우 유용할 수 있는 예가 있습니다. 예를 들어 Symfony and #[Target]을 확인 하십시오.

🤔 [RFC] Short Closures 2.0

[RFC] Short Closures 2.0

원래 Nuno Maduro와 Larry Garfield가 제안했으며 현재 Arnaud Le Blanc가 채택한 이 RFC는 여러 명령문을 허용하여 화살표 함수를 확장하는 제안을 올렸습니다.

fn () {    
$tmp = $a + $b;
return $tmp;
}

Interview with the PHP Foundation Core Developers supplemented with answers from Arnaud Le Blanc.

Arnaud Le Blanc의 답변으로 보충 된 PHP Foundation 핵심 개발자와의 인터뷰.

Tools

Indigo (beta)

Indigo (베타) — 이 도구는 Mac에서 로컬 개발 환경을 구성하고 실행하는 방식을 혁신하는 것을 목표로 합니다.

Easy-ECC 1.0.0

Paragon Initiative Enterprises 팀 은 PHP에서 elliptic curve 암호화 작업을 더 쉽게 해주는 도구인 Easy-ECC 1.0.0과 JWT에 대한 보다 안전한 대안인 PASETO를 출시했습니다.

minicli/minicli

minicli/minicli – CLI 중심 PHP 애플리케이션을 구축하기 위한 최소한의 종속성 없는 프레임워크입니다.

crwlr/query-string

crwlr/query-string – URL용 스위스 군용 칼입니다. HTTP 요청에 대한 쿼리 문자열을 매우 편리하게 생성, 액세스 및 조작할 수 있습니다. 자세한 내용은 기사 를 참조하십시오.

voku/simple_html_dom

voku/simple_html_dom – 현대적이고 단순한 PHP용 HTML DOM 파서.

PHP-CS-Fixer Configurator

PHP-CS-Fixer Configurator – 모든 PHP CS Fixer 옵션과 설명 이 있는 멋진 웹사이트입니다 .

IvanGrigorov/VMValidator

IvanGrigorov/VMValidator – PHP 모델을 검증(validate)하기 위한 attribute 세트입니다.

thecodingmachine/graphqlite

thecodingmachine/graphqlite – 이 도구를 사용하면 PHP 속성/주석을 사용하여 GraphQL API를 선언할 수 있습니다.

exakat/php-static-analysis-tools

exakat/php-static-analysis-tools – 유용한 PHP 정적 분석 도구의 검토 목록입니다. Psalm/PHPStan 뿐만이 아닙니다. PhpStorm의 모든 스마트한 검사기를 CI 파이프라인으로 가져오는 JetBrains의 도구인 Qodana PHP도 있습니다 .

nmcteam/3dash

nmcteam/3dash – PHP용 가벼우 정적 사이트 생성기. SculpinJigsaw도 멋지지만 이 작은 도구는 정말 깔끔하고 API가 매우 간단합니다. 빠르게 예시를 보려면 공식 웹사이트를 확인하세요: 3dash.dev.

PhpStorm

DDEV Integration – IntelliJ IDEs Plugin

DDEV 통합 – IntelliJ IDE 플러그인 – PhpStorm용 DDEV 통합 플러그인 의 베타 버전입니다.

Boost your productivity in Laravel with advanced PhpStorm setup by Dmitry Khorev

https://medium.com/@dkhorev/boost-your-productivity-in-laravel-with-advanced-phpstorm-setup-34a354efbbce

고급 PhpStorm 설정으로 Laravel에서 생산성을 높여보세요.

PhpStorm이 생산성을 위한 완벽한 IDE인 이유

  • Huge list of static code inspections
  • Code auto-format and optimizing imports
  • Best IDE’s navigation tool (“Search Everywhere”)
  • Configurable common file and method templates
  • Laravel model/query integration use cases
  • Git integration

Clean and minimalistic PhpStorm by Brent Roose

Brent Roose의 깨끗하고 최소한의 PhpStorm.

  • Hide all toolbars
  • Light colour schemes
  • Increased font size
  • Code folding
  • Tabs at the bottom
  • Undocked sidebar
  • The navigation bar
  • Distraction free mode
  • Scopes and file colours

Symfony

Symfony 6.1

Symfony 6.1이 출시되었으며 많은 새로운 기능이 포함되어 있습니다 .

Ruud Kamphuis(@Ruud_)의 트윗

Symfony 6.1은 3시간 전에 출시되었습니다. 방금 업그레이드 PR을 병합하고 프로덕션에 제공했습니다 🚀. 모든 것이 원활하게 실행됩니다.
애플리케이션은 ±10년이 넘었고 10k+ 클래스가 있으며 현재 20k rpm을 처리하고 있습니다.
모두 행복한 금요일 보내세요 😎
https://jobs.ticketswap.com

Get certified on Symfony 6 and Twig 3

Symfony 6 및 Twig 3 인증 받기

이제 Symfony 6 및 Twig 3 온라인 자격증(certifications) 시험을 칠 수 있습니다. 두 시험 모두 처음부터 재작업되었습니다.

A Week of Symfony #806 (6-12 June 2022).

A Week of Symfony #806 (6-12 June 2022)

Initializing your Symfony project with solid foundations by Loïc Vernet.

견고한 기반으로 Symfony 프로젝트를 초기화 하기

How to test Symfony routes to make huge refactoring safe by Tomas Votruba.

거대한 리팩토링을 안전하게 만들기 위해 Symfony Route를 테스트하는 방법

Laravel

spatie/laravel-comments-livewire

spatie/laravel-comments-livewire – Spatie의 새로운 유료 Livewire 패키지로 Laravel 애플리케이션의 모델과 주석을 연결합니다.

laravel/vite-plugi

laravel/vite-plugiVite는 빠른 개발 환경을 제공하고 프로덕션용 코드를 번들로 제공하는 최신 프론트엔드 빌드 도구입니다. Laravel은 이제 개발 및 프로덕션용 asset을 로드하기 위한 공식 플러그인 및 Blade 지시문을 제공하여 Vite와 원활하게 통합됩니다.

hasinhayder/hydra

hasinhayder/hydra – 뛰어난 사용자 및 역할 관리 API와 함께 제공되는 Laravel 9x + Laravel Sanctum이 포함된 zero-config API boilerplate입니다.

Laravel Artisan Cheatsheet

Laravel Artisan Cheatsheet – Laravel의 내장 Artisan 명령 및 해당 옵션에 대한 온라인 레퍼런스입니다.

codestudiohq/laravel-totem

codestudiohq/laravel-totem – 이 도구를 사용하면 잘 구성된 대시보드에서 Laravel 일정을 관리할 수 있습니다.

worksome/request-factories

worksome/request-factories – 그 모든 boilerplate 없이도 Laravel에서 요청을 테스트합니다.

35 Laravel Eloquent Recipes by Martin Joo

35 Laravel Eloquent Recipes

Laravel Route Grouping: 6 Techniques to Organize Routes by Povilas Korop

Laravel Route 그룹화: Route 구성을 위한 6가지 기술

How To Implement Laravel Dynamic Scheduling by Ian Kumu

Laravel Dynamic Scheduling 구현 방법

Restructuring a Laravel Controller using Services, Events, Jobs, Actions, and more by Povilas Korop.

Services, Events, Jobs, Actions 등을 사용하여 Laravel 컨트롤러를 재구성합니다.

기타

My PHP enum style guide by Brent Roose.

Brent Roose의 PHP 열거형(enum) 스타일 가이드.

List-o-mania by Mark Baker. An article on PHP’s list construct with some clever tricks and a few of its limitations.

Mark Baker의 List-o-mania. list 몇 가지 영리한 트릭과 몇 가지 제한 사항이 포함된 PHP의 list 구성에 대한 기사입니다 .

The very useful variadic argument by Damien Seguy.

Damien Seguy의 매우 유용한 가변 인수.

Reviewing Property Declaration In PHP by Damien Seguy.

Damien Seguy의 PHP에서 속성 선언 검토.

Community

2022 PHP Conferences List

https://getparthenon.com/blog/2022-php-conferences-list/

Check out these funny t-shirts by Rafael Dohms:

Rafael Doohms재미있는 티셔츠를 확인 하세요 .

재미있는 티셔츠 이미지

Where can you get an elephpant?

코끼리는 어디서 구하나요?

워드프레스에도 사랑스러운 마스코트가 있다는 것을 알고 계셨나요?

WordPress(@WordPress)의 트윗

#Wapuu는 WordCamp Europe의 모든 곳에서 진행됩니다! 당신은 그에 대해 얼마나 많은 다른 사진을 얻을 수 있습니까? 우리가 모두 볼 수 있도록 http://wordpress.org/photos에 게시 하십시오!

📸 아래 사진은 #WordPress 사진 디렉토리 bit.ly/3PMYBe7에서 Nicholas Garofalo의 “Wapuu ready to travel to #WCEU

Yellow Wapuu 이미지

Php_annotated 이미지

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

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


안녕하세요!

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

PHP Annotated 5월호를 편집하는 데 도움을 준 Sergey Panteleev에게 감사드립니다.

News

PHP 8.1.6 and PHP 8.0.19 released

https://www.php.net/ChangeLog-8.php#8.1.6
https://www.php.net/ChangeLog-8.php#8.0.19

활성(active) branch에 비보안 버그 수정 업데이트입니다.

Release managers for PHP 8.2 have been selected!

https://wiki.php.net/todo/php82

PHP 8.2의 릴리스 관리자가 선정되었습니다!

바로 Pierrick CharronSergey Panteleev입니다. PHP 8.1 RM인 Ben Remsey가 새로운 신입 RM을 도울 것입니다.

PHP.Watch 및 Brent의 What’s new in PHP 8.2 게시물에서 PHP 8.2가 어떻게 형성되고 있는지 확인할 수 있습니다. 첫 번째 예비 PHP 8.2 벤치마크는 PHP 8.1에 비해 2.5% 성능 향상을 보여줍니다.

https://www.bleepingcomputer.com/news/security/popular-python-and-php-libraries-hijacked-to-steal-aws-keys/

PHPass 패키지가 어떻게 해킹되었는지 알아보세요. (위 기사와는 조금 다른 내용입니다.)

  • Rust/Python/PHP/Node의 유명 패키지 레지스트리에서 소유자의 이메일이나 연결된 github 계정이 유효하지 않는 패키지를 탈취할 수 있음을 보여주고,
    이메일 계정을 탈취하기 위해 도메인을 구입하거나 폐기된 GitHub 리포지토리를 다시 살렸다고 합니다(사실 폐기된 리포지토리명으로 생성은 안 되는데 아무렇게 만든 뒤 변경하는 방식으로는 가능했습니다). 이렇게 탈취한 뒤 악성코드를 심어 새로운 버전을 올리거나 최신 버전을 수정(이것도 문제)한 뒤 사용자들이 가져가게 합니다.

https://www.php-fig.org/psr/psr-7/meta/#7-errata

PHP-FIG는 PSR-7에 대한 보안 관련 정오표를 게시했습니다. MessageInterface 구현 시 몇몇 문자를 거부하는 등 헤더를 검증해야 합니다.

WordPress 6.0

https://wordpress.org/news/2022/05/arturo/

많은 유용한 기능과 UI 개선이 포함됐습니다.

Moodle 4

https://moodle.com/news/moodle-4-is-here/

인기 있는 오픈 소스 e-러닝 플랫폼의 주요 업데이트입니다.

Developer Ecosystem Survey 2022

https://surveys.jetbrains.com/s3/t-developer-ecosystem-survey-2022

2022년 개발자 에코시스템에 관한 설문조사에 참여하여 MacBook Pro, Xbox Series X, PlayStation 5 또는 기타 상품을 받을 수 있는 기회를 잡으십시오.

PHP Core

Core 뉴스의 대부분은 PHP Foundation의 PHP Core Roundup 시리즈에서 자세히 다룹니다. 시리즈의 두 번째 에피소드가 곧 출시될 예정이므로 간략하게만 언급하겠습니다.

🤔 [RFC] Stricter implicit boolean coercions

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

논의 중.

암시적인 bool 값 변환을 좀 더 엄격하게 제한하고자 합니다.

🤔 [RFC] Expand deprecation notice scope for partially supported callables

https://wiki.php.net/rfc/partially-supported-callables-expand-deprecation-notices

논의 중.

이미 8.2에 accept된 [PHP RFC: Deprecate partially supported callables]의 범위를 확장하고자 하는 추가 RFC입니다. 이 RFC에 대한 자세한 내용은 Julliette와 함께하는 PHP Internals News 팟캐스트를 들어보십시오.

✅ [RFC] Undefined Property Error Promotion

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

PHP 9.0에 Accept 됐습니다.

정의되지 않은 속성에 엑세스하면 이전엔 E_NOTICE, PHP 8.0부터는 E_WARNING, PHP 9.0부터는 error를 throw합니다.

✅ [RFC] MySQLi Execute Query

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

PHP 8.2에 Accept 됐습니다.

매개변수화된 쿼리와 함께 mysqli를 더 쉽게 사용할 수 있습니다.

✅ [RFC] Readonly classes

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

PHP 8.2에 Accept 됐습니다.

Giuseppe Mazzapica(@gmazzap)의 트윗

With https://wiki.php.net/rfc/readonly_classes accepted, having read-only & type-safe simple data structures is going to be very easy in PHP 8.2
readonly class sample code

The PHP Foundation: Interview with Core Developers

https://thephp.foundation/blog/2022/05/06/interview-with-core-developers/

PHP 재단의 핵심 개발자와의 인터뷰 – Sebastian Bergman이 George, Derick, Ilija, Jakub 및 Máté를 인터뷰합니다. 곧 Arnaud의 답변도 알려 드리겠습니다.

opcache 최적화 프로그램

https://www.npopov.com/2022/05/22/The-opcache-optimizer.html

Nikita Popov는 PHP 핵심 엔진에 대한 심층 분석 시리즈를 계속합니다.

Tools

azjezz/psl 2.0

https://github.com/azjezz/psl

PHP 표준 라이브러리 – 현대적이고 일관되고 중앙 집중식이며 type을 충분히 사용하는 PHP용 non-blocking API 세트입니다. 이 주요 업데이트에는 비동기, TCP, UDP, 파일, IO 등과 같은 많은 개선 사항과 새로운 구성 요소가 포함되어 있습니다.

clue/framework-x

https://github.com/clue/framework-x

반응형 웹 애플리케이션을 구축하기 위한 간단하고 빠른 마이크로 프레임워크입니다. ReactPHP 비동기 스택 위에서 실행됩니다.

Christian Lück(@another_clue)의 트윗

@ReactPHP is going to be even more awesome! 🚀
Currently boosting performance from 32000 to 39000 requests/s.
This makes 18 billion requests per month on top 😎 On my laptop! On a single CPU core! 🔥
PHP scales! 💯

MedUnes/php-spx-installer

https://github.com/MedUnes/php-spx-installer

PHP SPX(A simple profiler for PHP)용 설치 프로그램입니다.

bmitch/churn-php

https://github.com/bmitch/churn-php

리팩토링이 필요한 파일을 검색합니다. 경로에 있는 각 PHP 파일을 검사하고 순환적 복잡성과 변경 기록을 기반으로 점수를 부여합니다.

PhpStorm에서는 여러 메트릭을 기반으로 리팩토링 후보를 찾는 built-in Refactoring Opportunities 검사를 활성화할 수 있습니다. 여기에서 자세히 알아보십시오.

Refactoring Opportunities 검사 옵션

역자 주 :
PhpStorm 2021.2부터 들어왔지만, IntelliJ에 PHP plugin을 사용하고 계신 분이면 이 옵션이 안 보일 수 있습니다. 이때는 PHP Architecture plugin을 추가로 설치하시면 됩니다.
아래 플러그인으로도 비슷한 효과를 보실 수 있습니다.

Monolog 3.0

https://github.com/Seldaek/monolog/releases/tag/3.0.0

대부분 cleanup 릴리스입니다. 더 강력한 type을 제공하고 이제 최소 PHP 8.1이 필요합니다.

Tinkerwell 3

https://tinkerwell.app/

The paid PHP code runner received a major update. Learn more.
유료 PHP 코드 러너가 메이저 업데이트 됐습니다. 자세히 알아보기.

Blackfire.io

https://blackfire.io/

PHP 코드에서 병목 현상을 찾기 위한 이 다목적 도구는 이제 오픈 소스 프로젝트에서 무료입니다 .

TomasVotruba/awesome-php-ast

https://github.com/TomasVotruba/awesome-php-ast

A curated list of tools, articles, and books about abstract syntax trees in the PHP world.
PHP 세계의 추상 구문 트리에 대한 도구, 기사 및 책의 선별된 목록입니다.

friendsoftwig/twigcs

https://github.com/friendsoftwig/twigcs

Twig 템플릿의 스타일 체커.

PHPStan 1.7.0

https://phpstan.org/

완전히 static한 리플렉션을 추가하고 @phpstan-consistent-constructor를 구현하고 new static() 문제를 해결하는 또 다른 방법으로 새로운 규칙을 추가한 버전입니다.

역자 주:
현재 블로그에는 1.7에 관한 내용이 없는데, GitHub release 페이지에서 내용을 확인하실 수 있습니다.

Latte 3.0.0

https://blog.nette.org/en/latte-3-an-impressive-leap#

완전히 재작성된 인기있는 템플릿 엔진의 업데이트.

dingo-d/wp-pest-integration-test-setup

https://github.com/dingo-d/wp-pest-integration-test-setup

Pest로된 WordPress 통합 테스트 스위트를 추가하는 패키지입니다. 사용 방법에 대한 자세한 내용은 이 블로그 게시물을 읽어 보세요.

CuyZ/Valinor

https://github.com/CuyZ/Valinor

모든 입력을 강력한 형식의 값 개체 구조로 매핑하는 데 도움이 되는 PHP 라이브러리입니다.

Symfony

what’s coming in Symfony 6.1

https://symfony.com/blog/category/living-on-the-edge/6.1

Symfony 6.1에서 제공 되는 기능을 확인하세요.
attribute를 통한 서비스 자동 연결(autowiring)개선된 라우팅 기능이 커뮤니티에서 가장 인기가 많은 것 같습니다. 지금까지 여러분께 가장 좋았던 것은 무엇인가요?

Experimental: Unpacking message properties as handler arguments in Symfony Messenger

https://angelovdejan.me/2022/05/10/experimental-unpacking-message-properties-as-method-arguments.html

Dejan Angelov의 Symfony Messenger에서 메시지 속성(property)을 핸들러 인수(argument)로 자동으로 전달하는 실험.

역자 주:
PHP attributes를 활용한 포스트 Using custom PHP attributes for registering and configuring Symfony Messenger handlers에서 이어지는 글입니다.

Why do we need Symfony Polyfill (… and why we shouldn’t)

https://thecodest.co/blog/why-do-we-need-symfony-polyfill-and-why-we-shouldnt

Sebastian Luczak의 Symfony Polyfill이 필요한 이유(… 그리고 필요하지 않은 이유).

nbgrp/singlea

https://github.com/nbgrp/singlea

SingleAuth 인증 프레임워크를 기반으로 하는 진정한 SSO 서비스를 제공하는 Symfony 번들 세트입니다.

Laravel

Does Laravel Scale? by Jack Ellis.

https://usefathom.com/blog/does-laravel-scale

“라라벨은 확장할 수 있습니까?” by Jack Ellis.

글쓴이가 운영하는 Fathom Analytics팀은 월 1,570억 개 이상의 요청을 처리할 수 있는 인프라에서 Laravel을 실행합니다.

역자 주:
Laravel이 대규모로 애플리케이션을 처리할 수 없을 거라는 부정적인 시각에 반박합니다.

  • 대부분이 Wikipedia나 Facebook 만큼의 트래픽을 처리할 생각은 아닐 것
  • 라라벨의 벤치마크 점수는 낮지만, 벤치마크는 큰 의미가 없다.
  • 주요 병목 현상의 원인이 되는 데이터베이스, 캐시 등의 외부 서비스 연동에서 발생하는 문제를 해결해야 하고, CDN, Queue system이나 Laravel Octane 같은 도구를 사용할 수도 있다. 커뮤니티 지원도 중요하다.
  • 대규모 서비스를 위한 코드 작성이나 대규모로 배포를 위한 방법도 고민해야 한다.
  • 결론 : Laravel이 99.99994% 이상의 웹 애플리케이션을 위한 환상적인 선택이라는 것

The Ultimate Guide to Getting Started With Laravel

https://blog.freshbits.in/the-ultimate-guide-to-getting-started-with-laravel

Gaurav Makhecha의 Laravel 시작을 위한 궁극의 가이드.
초보자가 처음부터 Laravel을 배울 수 있도록 도와주는 포괄적이고 긴 튜토리얼입니다.

Eloquent Performance: 4 Examples of N+1 Query Problems

https://laravel-news.com/laravel-n1-query-problems

Laravel Daily의 Povilas Korop이 이야기하는 N+1 Query의 4가지 사례

  • Case 1. 일반적인 N+1 Query
  • Case 2. Two Important Symbols.
  • Case 3. “Hidden” Relationship in Accessor.
  • Case 4. Be Careful with Packages.

Laravel 8.43부터 built-in N+1 Query detector가 도입됐습니다!

How to add a spotlight-like search field to your Laravel app by Freek Van der Herten.

https://freek.dev/2251-how-to-add-a-spotlight-like-search-field-to-your-laravel-app

Freek Van der Herten의 Laravel 앱에 스포트라이트 같은 검색 필드를 추가하는 방법.
중첩된 메뉴가 끔찍하기 때문이죠.

Laravel DDD by Steve McDougall.

https://www.juststeveking.uk/getting-started-with-ddd-in-laravel/

Laravel에서 DDD 시작하기.

roelofjan-elsinga/aloia-cms

https://github.com/roelofjan-elsinga/aloia-cms

라라벨에서 drop-in CMS를 구현하기 위한 패키지. 컨텐츠를 저장하기 위해 파일을 사용합니다.

The Laravel Idea plugin for PhpStorm collaborated with Christoph Rumpel to bring

https://laravel-idea.com/

PhpStorm용 Laravel Idea 플러그인. Christoph Rumpel과 협력 하여 📺 비디오 자습서 시리즈를 제공 합니다.

기타

Attribute usage in the top-1000 PHP packages

https://stitcher.io/blog/attribute-usage-in-top-php-packages

Brent Roose의 상위 1000개 PHP 패키지에서 Attribute 사용 여부 조사.
스포일러: 그들 중 20%만이 Attribute를 사용하며 가장 많이 사용되는 Attribute는 #[ReturnTypeWillChange]입니다.

📺 Dealing with deprecations by Brent Roose.

https://stitcher.io/blog/dealing-with-deprecations

Brent는 PHP 8.2에 많이 추가된 deprecation에 효과적으로 대처하는 방법에 대해 설명합니다.

그건 그렇고, PhpStorm에서 #[Deprecated(reason: '', replacement: '')] attribute로 업그레이드하는 방법을 사용자에게 지시할 수 있습니다 - 자세히 알아보기.

Dockerize a PHP Application with CI/CD by Rafie Younes.

https://semaphoreci.com/community/tutorials/dockerizing-a-php-application

How to profile your PHP applications with Xdebug by Vincent Brouté.

https://www.vincentbroute.fr/blog/how-to-profile-your-php-applications-with-xdebug/

Xdebug로 PHP 애플리케이션을 프로파일링하는 방법 .

Much ado about null by Larry Garfield.

https://peakd.com/hive-168588/@crell/much-ado-about-null

왜 당신이 정말로 그 null type을 사용하고 싶은지, 그리고 당신이 그 대신에 무엇을 해야 하는지.

Move that foreach() inside the method by Damien Seguy.

https://www.exakat.io/en/move-that-foreach-inside-the-method/

여러 PHP 함수는 단일 또는 다중 값으로 작동합니다. 예를 들어 array_merge()는 여러 배열을 하나로 병합합니다.
각 요소를 개별적으로 처리하기 위해 동일한 메서드를 여러 번 호출하는 대신 인수 목록을 한 번에 처리하여 약간의 성능 향상을 얻을 수 있습니다.

역자 주:
지난 php-annotated에 소개된 Speeding up array_merge()도 참고하세요.

Steve Bauman(@SteveTheBauman)의 트윗

https://twitter.com/SteveTheBauman/status/1525525749461135361

Today I learned you can unpack conditionally in PHP, pretty neat! 👌
Steve Bauman(@SteveTheBauman)의 트윗

Hadi Hariri(@hhariri)의 트윗

https://twitter.com/hhariri/status/1524018677116506114

“언젠가 여러 구현을 가질 수 있기 때문에 인터페이스를 선언하고 있습니다.”라고 말하는 사람이 있죠.
물론입니다. 그 날이 오면 Extract Interface 리팩토링을 수행하세요. 대부분의 IDE는 한 번의 클릭으로 이를 수행합니다. 그때까지 인터페이스를 삭제하십시오.

Community

friendsofphp.org

https://friendsofphp.org/

가까운 PHP 모임을 찾아보세요! 그들이 마침내 돌아왔습니다! 또한 가상 이벤트를 제공하는 새로운 PHP Mega Meetup GroupMerge PHP도 있습니다.

📺 The PHP Roundtable podcast - Back at the Table in episode 84

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

With Sara Golemon, Joe Ferguson, Ben Ramsey, and Eric Van Johnson.

awesome new paper elephants by Vincent Pontier

https://www.vincentpontier.com/elephpant/categorie-produit/phpaper-toy/?orderby=price

Vincent Pontier의 멋진 새 종이 코끼리 를 확인하세요.

종이 코끼리 이미지

thelia.net/#Elephant

https://thelia.net/#Elephant

고전적인 플러시 천 디자인을 선호한다면 여기 당신의 무리에 추가할 만한 멋진 품목이 있습니다!

플러시 천 코끼리 인형 이미지

Php_annotated 이미지

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

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


News

PHP 7.4.29, PHP 8.1.5, and PHP 8.0.18

https://www.php.net/ChangeLog-7.php#7.4.29
https://www.php.net/ChangeLog-8.php#8.1.5
https://www.php.net/ChangeLog-8.php#8.0.18

내장된 종속성의 업데이트로 인한, Windows 사용자를 위한 보안 릴리스입니다. Windows가 아닌 사용자의 경우 일반적인 버그 수정 업데이트일 뿐입니다. PHP 7.3의경우 보안 문제가 있더라도 업데이트가 더 이상 릴리스되지 않습니다. PHP 7.3 또는 PHP 5.x 버전을 계속 사용하고 있다면 가능한 한 빨리 업데이트하는 것이 좋습니다.

Symfony 팀은 다가오는 Symfony 6.1 릴리스에서 최소 필수 PHP 버전을 8.1로 올렸습니다. Drupal 10 과 Laravel 10에서도 동일한 변화가 이루어졌습니다.

또한 최근 출시된 Ubuntu 22.04 LTS 에는 PHP 8.1이 사전 설치된 상태로 제공됩니다.

Updates from the PHP Foundation

https://opencollective.com/phpfoundation

  • 6명의 후원 개발자가 활발하게 핵심(core) 영역을 유지관리하고 있습니다.
    • PHP Foundation Core Developers를 구하는 것이 2022년의 목표였고 이 6명이 초기 멤버로 활동하게 됩니다.
    • 이 중에는 Xdebug의 Derick Rethans도 있는데, 일주일에 하루 일을 한다는 트윗을 남긴 것으로 보아 위 개발자들이 모두 full-time으로 일을 하는 것은 아닌가 봅니다.
  • php.foundation 웹사이트가 가동 중입니다.
    • 후원사가 많이 늘었네요. OP.GG도 꾸준히 후원하고 있습니다.
  • Core 개발에 대한 통찰력이 담긴 별도의 뉴스레터가 정기적으로 발행될 것입니다. 다음은 초판입니다: PHP Roundup #1.
  • Sebastian Bergmann의 핵심 개발자 인터뷰.

Developer Ecosystem Survey 2022

https://surveys.jetbrains.com/s3/t-developer-ecosystem-survey-2022

JetBrains의 연례 설문조사가 막 시작되었으며 물론 PHP에 대한 섹션도 있습니다. 작년의 결과에서와 같은 것을 볼 수 있을 것입니다. 설문조사에 참여해서 경품을 받을 수 있는 기회를 잡으세요!

News from PHP-FIG

  • Coding Style PER (PHP Evolving Recommendation)은 PHP-FIG에서 공식적으로 승인했으며 PSR-12를 대체합니다. 이것은 “라이브” 표준을 보여주는 최초의 PER 문서입니다. PER 덕분에 PHP에 새로운 구문이 추가될 때마다 다른 PSR 표준을 발표할 필요가 없습니다. 대신 SemVer에 따라 PER이 업데이트됩니다.
  • 새로운 PSR 초안이 승인되었습니다: PSR-22 – Application Tracing.

PhpStorm 2022.1 released

https://blog.jetbrains.com/phpstorm/2022/04/phpstorm-2022-1-release/

Blade, WordPress, ArrayShape annotation 등에 대한 개선 사항이 함께 제공됩니다. 짧은 What’s New 비디오를 확인하거나 전체 스토리를 보려면 블로그 게시물을 읽으십시오.

Composer 2.3 Release

https://blog.packagist.com/composer-2-3/

이 릴리스는 사용자 및 현대화된 내부 코드베이스를 위한 약간의 개선 사항을 제공합니다.

최근에 발견된 취약점도 있었습니다. CVE-2022-24828: Composer Command Injection. composer.json에 있는 URL에 명시적으로 나열된 Git 또는 Mercurial 리포지토리를 제어하는 공격자는 특수하게 조작된 분기 이름을 사용하여 composer 업데이트를 실행하는 시스템에서 명령을 실행할 수 있습니다.

composer self-update를 실행하여 Composer가 최신 상태인지 확인하십시오.

Craft CMS 4

https://craftcms.com/blog/craft-4?ref=phpannotated

인기 있는 오픈 소스 CMS의 주요 업데이트가 릴리스되었습니다.

PHP Core

Core 뉴스의 대부분은 PHP Foundation의 PHP Roundup 시리즈에서 자세히 다루므로 간략하게만 언급하겠습니다.

Last call for PHP 8.2 release managers!

https://externals.io/message/117595#117664

PHP 8.2 릴리스 관리자를 구하는 마지막 요청입니다!
3년 반을 약정할 수 있어야 하며 PHP, Git, 가급적이면 C에 대한 지식이 있어야 합니다. 이미 베테랑 후보자 1명과 신인 후보자 6명이 있습니다.

✅ [RFC] Redacting parameters in back traces #PHP8.2

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

예외 시 back trace 기록에서 민감한 정보를 노출하는 것을 막기 위해 함수의 매개변수에 적용할 수 있는 새로운 표준을 제시했습니다.

✅ [RFC] Allow null and false as stand-alone types #PHP8.2

https://wiki.php.net/rfc/null-false-standalone-types

현재 null은 단일 유형으로 선언할 수 없습니다. false는 더 나아가 전통적으로 null 대신 오류 상태를 전달하기 위해 사용됐고, 이게 union type RFC에 “literal type”으로 소개된 주요 이유였습니다.

이 RFC에선 null과 false를 단일 타입으로 사용할 수 있도록 제안합니다.

✅ [RFC] Deprecate ${} string interpolation #PHP8.2

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

PHP는 큰따옴표( “) 및 heredoc을 사용하여 다양한 방식으로 문자열에 변수를 포함할 수 있습니다.

  • 변수 직접 포함(“$foo”)
  • 변수 외부의 중괄호(“{$foo}”)
  • 달러 기호 뒤의 중괄호(“${foo}”)
  • 가변적인 변수(“${expr}”, (string) ${expr}와 동일한 표현)

옵션 1과 2에는 장단점이 있습니다. 옵션 3과 4는 중복되는 구문으로 인해 쉽게 혼동되고, 3은 1과 2보다 성능이 완전히 떨어지며, 4는 문자열 보간에서 거의 유용하지 않은 완전히 다른 의미를 갖습니다.

이 RFC 는 PHP 8.2에서 옵션 3과 4를 더 이상 사용하지 않고 PHP 9.0에서 제거할 것을 제안합니다.

✅ [RFC] Deprecate and Remove utf8_encode and utf8_decode

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

  • PHP 8.2에서 utf8_encode 및 utf8_decode의 모든 사용은 표준 E_DEPRECATED 진단을 발생시킵니다.
  • PHP 9.0에서는 utf8_encode 및 utf8_decode 함수가 PHP에서 제거됩니다.
  • 문서나 사용 중단(deprecation) 메시지는 사용자가 사용 방법이 올바른지 확인하고 기본 대체제로 mb_convert_encoding를 권장하며 UConverter::transcode와 iconv도 선택지로 나열하도록 권장합니다.

✅ [RFC] Undefined Variable Error Promotion

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

이 RFC는 정의되지 않은 변수에 액세스하는 것이 PHP의 다음 메이저 버전(Target: PHP 9.0)에서 잘못된 동작으로 렌더링되고, 정의되지 않은 변수에 액세스하면 오류 예외가 발생할 것을 제안합니다.

🗳 [RFC] Readonly classes

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

PHP 8.1은 PHP RFC: Readonly properties 2.0을 통해 읽기 전용 속성에 대한 지원을 추가 했습니다. 그러나 특히 많은 속성을 포함하는 경우 (준)불변 클래스를 선언하는 것은 여전히 쉽지 않습니다. 따라서 이 RFC는 readonly 클래스에 대한 지원을 추가할 것을 제안합니다.

투표는 2022-05-11까지인데, 10일 현재 27:6으로 찬성이 우세합니다.

❌ [RFC] Sealed Classes

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

봉인된 클래스는 속성 값 목록에 명명된 클래스에 의해서만 직접 확장될 수 있도록 제안되었으나 투표는 2/3의 찬성표를 얻지 못하고 거부(Decline)되었습니다.

🆕 [RFC] Add true type

https://wiki.php.net/rfc/true-type

위에서 언급한 null and false as standalone types이 통과됨에 따라 true도 독립된 타입으로 승격하자는 제안입니다.

🆕 [RFC] Disjunctive Normal Form Types

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

DNF(Disjunctive Normal Form)는 부울 표현식을 구성하는 표준 방법입니다.

이 RFC 는 합집합과 교집합 유형을 허용하기 위해 DNF 유형을 지원할 것을 제안합니다.

[RFC] final class Collections\Deque

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

최적화된 데이터 구조를 PHP에 추가하려는 계획의 일환으로 첫 번째 제안이 준비되었습니다.
Deque – 이것은 양방향 대기열입니다. 즉, 시작과 끝에서 항목을 추가 및 제거할 수 있습니다. SplQueue또는 SplDoublyLinkedList 대신 사용하여 성능을 향상시키고 메모리 소비를 줄일 수 있습니다.

RFC Introduce a class-string type

https://gist.github.com/cspray/0f4e67e8731a8ea9382147707e75287f

공식 RFC는 아니지만 class-string을 실제 유형으로 만드는 것은 흥미로운 아이디어입니다. 이미 정적 분석기의 주석에서 널리 사용되기 때문입니다.

Tools

CanIPHP.com

https://caniphp.com/

caniuse.com처럼 PHP 기능별로 사용할 수 있는 버전을 찾을 수 있습니다.

clue/stream-filter

https://github.com/clue/stream-filter

PHP에서 스트림 필터링에 대한 간단하고 현대적인 접근 방식입니다.

PHP에서 스트림 필터를 사용하여 이런 미친 짓도 할 수 있고, 반대로 이렇게 실용적인 것도 할 수 있습니다.

(두 예시는 final 키워드를 제거하거나 모든 접근 제한을 푸는 행위를 하고 있어서 저는 둘 다 미친 짓처럼 보이기도…)

sfx101/deck

https://github.com/sfx101/deck

PHP 초보자에게 유용할 수 있는 로컬 웹 개발 환경의 빠른 시작 및 구성을 위한 GUI 도구입니다.

marijnvanwezel/try

https://github.com/marijnvanwezel/try

단일 명령으로 Composer 패키지를 사용해 볼 수 있는 간단한 CLI 도구입니다. 그냥 설치하고 실행 해보세요: try %vendor%/%package%.

frodeborli/moebius

https://github.com/frodeborli/moebius

PHP 버전 8.1 이상을 위한 Golang과 유사한 코루틴. 저자는 자신의 이벤트 루프 구현체와 자체 테스트 프레임워크를 사용했습니다.

Fiber를 사용하고, Swoole과도 비슷해보이지만 별도 extension이 필요 없습니다.

Crell/AttributeUtils

https://github.com/Crell/AttributeUtils

속성(attribute))의 구문 분석 및 관리를 용이하게 하는 유틸리티입니다.

doctrine/annotations 혹은 doctrine annotation interface가 적용된 PHP 8의 속성을 모두 읽을 수 있는 koriym/Koriym.Attributes도 흥미롭습니다.

spatie/visit

https://github.com/spatie/visit

모든 URL의 응답을 아름답게 표시하는 CLI HTTP 클라이언트입니다. colorize(code highlighting)하기 위해 bat과 jq를 사용합니다.

Think of it as curl for humans.

laravel/valet

https://github.com/laravel/valet

Mac용 경량 로컬 개발 환경입니다. Docker 또는 VirtualBox 대신 기본 Nginx와 PHP만 있습니다. 라라벨 뿐만 아니라 모든 프로젝트에서 사용할 수 있으며 v3부터는 폴더(프로젝트)마다 PHP 버전을 다르게 사용할 수 있습니다.

roach-php/core

https://github.com/roach-php/core

PHP를 위한 완벽한 웹 스크래핑 툴킷.

PHPStan 1.6.0

https://phpstan.org/blog/phpstan-1-6-0-with-conditional-return-types

조건부 리턴 타입 및 정수(integer) 마스크를 지원하여 출시되었습니다.

flow-php/etl

https://github.com/flow-php/etl

ReactPHP 또는 Amphp를 통한 비동기 처리를 지원하는 PHP용 ETL(Extract Transform Load) 데이터 처리 라이브러리입니다.

igorhrcek/wp-cli-secure-command

https://github.com/igorhrcek/wp-cli-secure-command/

WordPress 설치를 보호하는 하나의 CLI command.

williarin/wordpress-interop

https://github.com/williarin/wordpress-interop

다른 PHP 응용 프로그램에서 WordPress 데이터베이스에 더 쉽게 액세스할 수 있도록 하는 Doctrine/DBAL 기반 패키지입니다.

sj-i/php-profiler

https://github.com/sj-i/php-profiler
https://github.com/reliforp/reli-prof

php-profiler에서 reliforp/reli-prof로 이름을 바꾸고 있습니다.

순수 PHP(FFI)로 구현된 PHP용 샘플링 프로파일러입니다. flame 다이어그램을 생성하고, top-like 모드(demon mode도 있음)에서 trace 출력을 실행하는 등의 작업을 수행할 수 있습니다.

mrsuh/php-var-sizeof

https://github.com/mrsuh/php-var-sizeof

A function to get the memory size for any variable that promises to be more accurate compared to memory_get_usage(). Requires PHP 7.4 or higher with FFI.

memory_get_usage()에 비해 더 정확한, 모든 변수의 메모리 크기를 가져오는 함수 입니다. FFI를 사용하는 PHP 7.4 이상이 필요합니다.

davidcole1340/ext-php-rs

https://github.com/davidcole1340/ext-php-rs

Rust에서 PHP 확장을 빌드하기 위한 Zend API에 대한 바인딩입니다.

easysoft/phpmicro

https://github.com/easysoft/phpmicro

당신의 CLI 툴과 함께 (PHP에 구애받지 않는) 바이너리로 배포될 수 있도록 정적으로 컴파일된 마이크로 PHP 인터프리터입니다. Marcel Pociot가 프로세스를 자동화하기를 기대합니다!

While other people argue about PHP not being a good choice, I started working on making PHP/Laravel Zero apps truly portable

Symfony

See what’s coming in Symfony 6.1.

https://symfony.com/blog/category/living-on-the-edge/6.1

📺 Harmonious Development with Symfony 6

https://symfonycasts.com/screencast/symfony

이제 Symfony를 시작하기 위한 2시간 이상의 튜토리얼이 SymfonyCasts에서 완전히 무료로 제공됩니다.

Using Symfony Form in WordPress.

https://jolicode.com/blog/using-symfony-form-in-wordpress

WordPress에서 Symfony Form 사용하기

“Symfony: The Fast Track”

https://symfony.com/book

초보자와 숙련된 개발자 모두를 위한 공식 Symfony 책입니다. Symfony 6 기준.

Symfony Station Communiqué – April 29, 2022.

https://www.symfonystation.com/Symfony-Station-Communique-29-April-2022

Laravel

📺 Laravel Origins: The Documentary

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

이 비디오는 Laravel이 왜 생겨났는지, 지난 10년 동안 어떻게 성장했는지, 그리고 Taylor와 더 넓은 Laravel 커뮤니티의 미래에 대한 이야기를 알려줍니다.

Laravel Idea 5.3

https://laravel-idea.com/blog/2022/5-3-release

인기 있는 유료 PhpStorm 플러그인 업데이트.

LaravelProTips.com – A collection of useful articles and tweets.

https://laravelprotips.com/

유용한 기사 및 트윗 모음.

alexeymezenin/laravel-best-practices

https://github.com/alexeymezenin/laravel-best-practices

더 많은 Laravel 모범 사례.

한국어 버전은 2018년에 임영록(cherrypick)님이 번역해주셨습니다. 원래의 저장소는 작년까지도 계속 업데이트 되고 있었네요.

📺 Build a Laravel app and deploy it to production in 5 hours

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

Brent가 시작부터 프로덕션 배포까지의 과정을 5시간 동안 빠르게 진행합니다.

📺 Xdebug 3: Laravel Sail with PhpStorm.

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

Derick Rethans가 Laravel Sail Docker 환경에서 Xdebug를 활성화하고 설정하는 방법을 보여줍니다.

Yii

Yii news 2022, issue 1.

https://opencollective.com/yiisoft/updates/yii-news-2022-issue-1

Interview Questions For Yii 2

대부분은 일반적으로 PHP에 관한 것이며 모든 구직자에게 유용할 수 있습니다.

기타

Pascal Landau의 PHP 개발자용 Docker에 대한 포괄적인 게시물

https://www.pascallandau.com/docker-php-tutorial/

2022년 PHP 8.1 애플리케이션을 위한 Docker 시작하기, PHP 8.1에서의 PhpStorm, Docker 및 Xdebug 3 등 그의 웹 사이트에서 더 확인해보세요.

Posts on naming constructors by Andreas Möller and by Stefan Priebsch.

Naming constructors(생성자에 이름을 지어주기)에 관한 두가지 글입니다.

Matthias Verraes의 Named Constructors in PHP에서 출발하는 글입니다. 기본 생성자 하나만 제공되는 PHP에서 constructor 대신 도메인을 충분히 표현하는 static method로 overloading이 안 되는 문제를 보완하는 방식입니다.

class SomeValueObject
{
private function __construct(
...
) {
...
}

public static function fromInt(int $value): self
{
...
}

public static function fromString(string $value): self
{
...
}
}

How the Middleware Pattern works and can easily be applied in PHP.

https://doeken.org/blog/middleware-pattern-in-php

미들웨어 패턴이 작동하는 방식과 PHP에서 쉽게 적용할 수 있는 방법.

How To Mock Functions That Have External HTTP Requests.

https://hermanradtke.com/how-to-mock-functions-that-have-external-http-requests/

외부 HTTP 요청이 있는 함수를 mocking하는 방법.

Writing Readable PHP

https://writing-readable-php.com/

Freek Van der Herten과 Christoph Rumpel의 유료 강좌로, 여러분과 여러분의 동료 및 미래의 자신을 위해 코드를 즐겁게 읽을 수 있는 간단한 팁을 제공합니다.

PHP Tricks: Multi-value match()

https://peakd.com/hive-168588/@crell/php-tricks-multi-value-match

하나의 match 표현식(PHP 8.0 이상)에서 여러 값을 비교할 수 있다는 것을 알고 계셨습니까? 이와 같이:

function mayFriend(User $u1, User $u2, Group $group): FriendPermission
{
return match ([$u1->inGroup($group), $u2->inGroup($group)]) {
[true, true] => FriendPermission::Allow,
[true, false] => FriendPermission::WithApproval,
[false, true] => FriendPermission::WithApproval,
[false, false] => FriendPermission::Deny,
};
}

Interfaces are not class templates

https://www.exakat.io/en/interfaces-are-not-class-templates/

메서드가 없는 유효한 인터페이스를 활용하는 방법을 설명합니다.

Speeding up array_merge().

https://www.exakat.io/en/speeding-up-array_merge/

배열을 합치기 위해 loop 안에서 여러번 array_merge를 호출하지 말고, array_merge가 여러 인자를 받을 수 있으므로 한번에 실행하라고 조언합니다.
여러 인자를 받을 수 있는 implode(), array_sum()도 마찬가지의 효과가 있습니다.
최신 버전의 PHP를 쓰기만해도 성능 개선 효과를 볼 수 있습니다.

All the Dynamic Syntaxes in PHP – Good source for interview questions?

https://www.exakat.io/en/all-the-dynamic-syntaxes-in-php/

PHP의 동적 구문.

Solving Open Source Supply Chain Security for the PHP Ecosystem

https://paragonie.com/blog/2022/01/solving-open-source-supply-chain-security-for-php-ecosystem

PHP 생태계를 위한 오픈 소스 공급망 보안 해결. Paragon IE 사람들의 계획(initiatives)에 대한 흥미로운 게시물입니다. 그들은 이제 앱과 종속성을 안전하게 업데이트하기 위해 Gossamer라는 도구를 개발하고 있습니다. 이전에는 PHP 코어에 libsodium을 도입 하고 JWT에 대한 더 안전한 대안인 Paseto를 만들고 다른 도구도 개발했습니다.

Service locator: an anti-pattern.

https://stitcher.io/blog/service-locator-anti-pattern

라라벨의 파사드나 헬퍼 함수가 Service locator 패턴을 기반으로 만들어져있고, 여기에서 발생하는 문제를 설명합니다. 이런 문제는 의존성 주입이 해결한다고 결론을 냅니다.

(Brent가 2018년 stitcher에 쓴 글인데, 왜 지금 추천을 했는지는 모르겠네요.)

📺 Xdebug 3: Debugging Unit Tests with PhpStorm.

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

Derick Rethans의 강의 영상입니다.

📺 Learn PHP The Right Way – Full PHP course in 88 videos for free.

https://www.youtube.com/playlist?list=PLr3d3QYzkw2xabQRUpcZ_IBk9W50M9pe-

88개 동영상이 포함된 전체 PHP 과정을 무료로 제공합니다.

Generics

PHP는 최근에 제네릭 관련 활동을 많이 보였으므로 이 포스트에서 제네릭 관련 섹션을 제공합니다.

  • 📺 먼저 Brent의 Generics에 대한 비디오 시리즈 Generics in PHP를 확인하세요.
  • 더 자세히 알아보려면 Generics 구현 접근 방식에 대한 게시물에 관심이 있을 수 있습니다 .
  • PHP로 구현하는 흥미로운 프로젝트를 시도해보세요 : mrsuh/php-generics. 흥미롭게도 Reddit 에서는 성능을 위해 PHP에서 런타임 유형 검사를 삭제하는 것에 대한 토론이 있었습니다. 위의 도구는 타입 제거 방식(Type erasure)을 구현하므로 이론적으로는 다음과 같이 성능 관련 사례로 사용할 수 있습니다 : composer dump-generics --type=type-erasure.
  • 제네릭의 주요 응용 프로그램 중 하나는 컬렉션입니다. Comparing PHP Collections이라는 글을 확인하십시오.
  • 그리고 마지막으로 @SerafimArts의 재미있는 작품을 소개합니다.

generics gif by SerafimArts

Community

(PHP 뽕 주의)

📺 PHP isn’t dead, featuring the Laravel Origins cast.

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

PHP is definitely the best array-oriented programming language

https://twitter.com/savant/status/1519785011381161984

“PHP doeSNt sCaLE”

https://twitter.com/levelsio/status/1520354529421983745

Php_annotated 이미지

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

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


News

The PHP Foundation Update, January 2022

https://opencollective.com/phpfoundation/updates/the-php-foundation-update

PHP 재단은은 PHP 언어의 장수와 번영을 보장하는 것을 사명으로 하는 비영리 조직으로 11월 말에 작업을 시작했습니다.

우리는 이미 첫 번째 결과를 얻었습니다. 핵심 개발자들의 후원 신청이 접수되어 처리 중입니다.

재단 팀은 월간 업데이트를 게시할 예정이므로 Twitter @thephpf를 구독하면 최신 뉴스를 받아볼 수 있습니다.

PHP 재단에 대한 자세한 내용은 Joe Watkins, Sara Golemon 및 Sebastian Bergmann이 진행하는 Voices of the ElePHPant Ep 366 팟캐스트를 확인하십시오.

PHP 8.0.15, PHP 8.1.2, PHP 7.4.27

https://www.php.net/ChangeLog-8.php#8.0.15
https://www.php.net/ChangeLog-8.php#8.1.2
https://www.php.net/ChangeLog-7.php#7.4.27

최신 PHP branch의 버그 수정이 릴리스되었습니다. PHP 7.4의 경우 마지막 정기 릴리스이며, 이제부터는 PHP 7.4 branch는 보안 업데이트만 발행됩니다.

PHP version stats: January, 2022

https://stitcher.io/blog/php-version-stats-january-2022

다음은 packagist.org에 따른 PHP 버전에 대한 몇 가지 새로운 통계입니다. 버전 8.1이 나온 지 두 달밖에 안됐지만 이미 9.1%의 점유율을 기록했습니다. 그러나 여전히 PHP 7.4(44%)가 많이 있습니다.

Usage Statistics 이미지

[RFC] User Defined Operator Overloads

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

PHP에 연산자 오버로딩을 추가하자는 제안이 투표를 통과하지 못했습니다. 그러나 저자 Jordan LeDoux와 함께하는 PHP Internals News 팟캐스트에서 자세한 내용을 들어볼 수 있습니다.
Jordan은 또한 PHP용 RFC를 만드는 방법에 대한 매우 철저한 지침을 발표했습니다.

그동안 lisachenko/z-engine 및 FFI 덕분에 연산자 오버로딩을 이미 PHP에서 사용할 수 있습니다. 행렬에 대한 연산자 구현의 예는 lisachenko/native-php-matrix를 참조하십시오.

Releases

thephpleague/flysystem 3.0.0

https://github.com/thephpleague/flysystem

파일 시스템 작업을 위한 인기 라이브러리의 메이저 업데이트입니다. 자세한 내용은 블로그 게시물을 확인하세요.

Cycle 2.0

https://spiralscout.com/blog/meet-cycle-2-0

Cycle의 두 번째 메이저 릴리스 - 전통 방식 및 데몬화된 PHP 애플리케이션 모두에서 사용할 수 있는 PHP용 DataMapper 및 ORM입니다.

ankitpokhrel/tus-php 1.0

https://github.com/ankitpokhrel/tus-php

재개 가능한 파일 업로드를 위한 개방형 프로토콜인 tus.io의 서버 및 클라이언트 구현. 이 프로토콜은 Vimeo 및 Cloudflare 등에서 사용됩니다.

Infection PHP 0.26.0

https://infection.github.io/2022/01/10/whats-new-in-0.26.0/

PHP mutation 테스트 프레임워크에 대한 업데이트입니다. 새 버전은 HTML 보고서, 추가되거나 수정된 줄만 변형하는 등을 기능을 추가합니다.

Doctrine ORM 2.11

https://www.doctrine-project.org/2022/01/11/orm-2.11.html

이 업데이트는 열거형, 가상 컬럼, 읽기 전용 속성, 중첩 속성 등에 대한 지원을 제공합니다.

Roave/BetterReflection 5.0

https://github.com/Roave/BetterReflection/releases/tag/5.0.0

향상된 리플렉션 API: 클래스를 로드하지 않고도 클로저 등에서 정보를 얻을 수 있습니다.
새 버전은 PHP 8.1 지원을 추가하고 더 나은 성능을 제공합니다.

Tools

viewi/viewi

https://github.com/viewi/viewi

PHP와 HTML만을 사용하여 반응형 애플리케이션을 만들기 위한 강력한 도구입니다. 본질적으로 이것은 서버 측 템플릿 엔진 + 프론트엔드 프레임워크입니다. 그러나 핵심은 모든 구성 요소와 논리를 PHP로 설명한 다음 도구가 이를 기본 JS로 변환한다는 것입니다.

프로젝트 웹사이트 viewi.net작동 메커니즘을 자세히 설명하고 코드 예제를 제공합니다. 단계별 자습서를 따라할 수도 있고 Symfony와 통합하는 방법을 확인할 수도 있습니다.

Roach PHP

https://roach-php.dev/

인기 있는 Python 라이브러리인 Scrapy에서 영감을 받은 웹 스크래핑 도구입니다.

symfony/html-sanitizer

https://github.com/symfony/html-sanitizer

신뢰할 수 없는 HTML을 정리하고 XSS로부터 보호하는 새로운 컴포넌트입니다. HTML Purifier의 좋은 대안이 될 수 있습니다.

EventSaucePHP/ObjectHydrator

https://github.com/EventSaucePHP/ObjectHydrator

원시 데이터(예: JSON)를 객체로 변환해주는 라이브러리입니다.

ajthinking/archetype

https://github.com/ajthinking/archetype

PHP 파일/클래스를 수정하기 위한 간단한 인터페이스입니다.

framjet/php-enum-bitmask

https://github.com/framjet/php-enum-bitmask

PHP 8.1의 열거형을 BitMask로 사용하기.

beyondcode/httpdump

https://github.com/beyondcode/httpdump

HTTP 요청을 디버깅하기 위한 Laravel 애플리케이션(web hook 디버깅 등). 임의의 URL을 만들고 그곳으로 가는 모든 요청을 훌륭하게 덤프합니다. httpdump.app에서 작동하는 것을 볼 수 있습니다.

spatie/ignition

https://github.com/spatie/ignition

Laravel의 많은 사람들에게 친숙하지만 이제 프레임워크에 독립적인 디버깅 오류 페이지를 표시하기 위한 이 라이브러리가 업데이트되었으며 모든 애플리케이션에서 사용할 수 있습니다.

디버깅을 위한 오류 페이지를 만들 수 있는 이 라이브러리는 Laravel의 많은 것과 비슷하지만, 이제 프레임워크에 독립적이어서 어느 어플리케이션에서나 사용할 수 있습니다. Overview 블로그 게시물을 확인하세요.

chevere/xr

https://github.com/chevere/xr

Spatie/ray에서 영감을 받은 ReactPHP의 디버그 서버이지만 데스크톱 애플리케이션 대신 CLI 명령으로 실행합니다. 비디오 데모.

JustSteveKing/php-sdk, Sammyjo20/Saloon

https://github.com/JustSteveKing/php-sdk
https://github.com/Sammyjo20/Saloon

동일한 아이디어를 가진 두 개의 유사한 라이브러리: 서비스용 SDK 생성을 단순화하거나 공통 스타일로 다른 API에 접근할 수 있게 구성합니다.

AliSaleem27/wordle-cl

https://github.com/AliSaleem27/wordle-cli

인기 있는 5글자 단어 추측 게임 Wordle의 CLI 버전입니다.

staabm/phpstan-dba

https://github.com/staabm/phpstan-dba

PDO, MySQLi 및 Doctrine/DBAL에서 SQL 쿼리의 유효성을 확인하는 PHPStan용 extension입니다. 데모.

flow-php/etl

https://github.com/flow-php/etl

PHP 애플리케이션에서 사용할 Extract Transform Load 패턴의 구현입니다. 자세한 내용은 작성자의 스레드를 확인하세요.

Symfony

The symfony-cli tool has been open-sourced

https://github.com/symfony-cli/symfony-cli

Symfony 관련 작업 외에도 이 도구에는 MAMP/WAMP의 최신 대안으로 사용할 수 있는 로컬 서버가 포함되어 있습니다. 여러 버전의 PHP를 지원하고(각 프로젝트에서 자체적으로 지정할 수 있음) Docker, 로컬 도메인 및 자동화된 HTTPS와 통합됩니다. 이 도구는 Go로 구현되며 Linux, macOS 및 Windows에서 사용할 수 있습니다.

A better way to quickly start Symfony projects

https://symfony.com/blog/a-better-way-to-quickly-start-symfony-projects

Introducing the Symfony 6 Certification – 90 minutes for 75 questions from 15 topics.

https://symfony.com/blog/introducing-the-symfony-6-certification

15개 주제에서 75개 질문에 대해 90분 동안 시험을 치고 Symfony 6 인증서를 받아보세요.

Organizing your Symfony project tests

https://www.strangebuzz.com/en/blog/organizing-your-symfony-project-tests

테스트를 용도(+속도)에 맞게 아래와 같이 디렉토리를 구분하고 별도로 실행할 수 있게 구성했습니다.

  • Unit tests
  • Integration tests
  • Api tests
  • Functional tests
  • End-to-end tests
  • External tests

The key concepts of Symfony’s Security package in 5 minutes

https://alex-daubois.medium.com/symfonys-security-key-concepts-in-5-minutes-e18033c26b35

Symfony 6 Security component를 설명합니다.

  • User, password and roles
  • User Providers
  • Firewalls
  • Voters and ACL
  • Authenticators, passports and badges

Symfony Messenger 💛 systemd

https://jolicode.com/blog/symfony-messenger-systemd

Use PHP Enums as Doctrine type in Symfony

https://smaine-milianni.medium.com/use-php-enums-as-doctrine-type-in-symfony-85909aa0a19a

Build Symfony and Doctrine ORM Applications with ease using Ecotone

https://blog.ecotone.tech/build-symfony-application-with-ease-using-ecotone/

norberttech/static-content-generator-bundle

https://github.com/norberttech/static-content-generator-bundle

Symfony 애플리케이션에서 정적 HTML 페이지를 생성합니다.

Using custom PHP attributes for registering and configuring Symfony Messenger handlers

https://angelovdejan.me/2022/01/09/custom-php-attributes-for-symfony-messenger-handlers.html

JSON Columns and Doctrine DBAL 3 Upgrade

https://dunglas.fr/2022/01/json-columns-and-doctrine-dbal-3-upgrade/

Laravel

Laracon Online is on Feb 9, and it’s free

https://laracon.net/

컨퍼런스는 보통 유료지만 이번 Laracon Online Winter는 유튜브에서 무료로 중계됩니다.

Building a multi-room chat application with Laravel and Centrifugo

https://centrifugal.dev/blog/2021/12/14/laravel-multi-room-chat-tutorial

Laravel과 Centrifugo로 멀티룸 채팅 애플리케이션 구축하기

Centrifugo : real-time messaging server).

Managing Laravel services

https://downing.tech/posts/managing-laravel-services

Clean Integrations 시리즈 중 세 번째입니다.

  1. Automating Tweets when publishing a new post
  2. Testing APIs and Services in Laravel
  3. Managing Laravel services

Laravel Pseudo-Daemons

https://aaronfrancis.com/2020/laravel-pseudo-daemons

Laravel command의 한계를 극복하고자, Supervisor 구성 없이 코드에 의해 제어되는 유사-데몬을 만든 경험을 공유합니다. 2020년 글이네요.

Primitive Types in Controllers and Closure Routes

https://laravel-news.com/primitive-types-in-controllers-and-closure-routes

How to scale Laravel project on AWS without breaking the bank.

https://laravel-news.com/primitive-types-in-controllers-and-closure-routes

LaravelDaily/Laravel-Roadmap-Learning-Path

https://github.com/LaravelDaily/Laravel-Roadmap-Learning-Path

간단한 것부터 복잡한 것까지 라라벨을 배우기 위한 체계적인 자료 모음입니다.

Building an API using TDD in Laravel

https://laravel.io/articles/building-and-api-using-tdd-in-laravel

Efficient Pagination Using Deferred Joins

https://aaronfrancis.com/2022/efficient-pagination-using-deferred-joins

-- Page 3
select * from users order by created_at desc limit 15 offset 30;

Pagination 구현 시 위와 같이 쿼리하곤 하는데, 이 경우 database에선 모든 row를 읽은 후 offset 이후의 값을 응답합니다. 이를 더 효율적으로 가져오려면 커서 기반으로 조회해야 하는데,

-- Page 3 (Assuming the max ID from page two was 72.)
select * from users where id > 72 order by id limit 15;

Laravel 문서에는 오프셋과 커서 사이의 절충점에 대한 몇 가지 좋은 컨텍스트가 있습니다.
https://laravel.com/docs/8.x/pagination#cursor-vs-offset-pagination

이 글에서는 지연된 조인으로 offset/limit이 적용될 때까지 요청된 열에 대한 액세스를 연기하는 기술입니다.

select * from contacts          -- The full data that you want to show your users.
inner join ( -- The "deferred join."
select id from contacts -- The pagination using a fast index.
order by id
limit 15 offset 150000
) as tmp using(id)
order by id -- Order the single resulting page as well.

이 글에서는 이 아이디어를 Laravel로 구현하는 예제와 더 나은 성능을 위한 MySQL 튜닝 아이디어 그리고 많은 이들의 성능 개선 간증이 이어집니다.

45 New Laravel Tips 2022

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

Yii

Yii 1.1.25

https://www.yiiframework.com/news/419/yii-1-1-25-is-released

Yii 프레임워크의 첫 번째 버전은 활발히 개발되지 않지만 호환성을 위한 수정은 계속 나오고 있습니다. 이 업데이트는 PHP 8.0에 대한 몇 가지를 수정합니다.

The first stable releases for some Yii 3 components have also been released

기타 읽을 만한 글

Trying out PHP after 7 years

https://www.kode-krunch.com/2021/12/trying-out-php-after-7-years.html

7년 전 Java에만 집중하기 위해 PHP를 떠났던(당시 PHP 사용하던 버전은 5.3) 개발자가 천지개벽한 PHP 생태계를 만나 이제 쓸만 하다고 생각한다는 내용.

자신의 경험을 토대로 Symfony Demo를 다시 만들어 본 경험을 2부작으로 게시하기도 했습니다.
PHP: Symfony Demo meets Modular, Microservice-ready Architecture - Part 1, Part 2

7년 전에 PHP 커뮤니티에 PHP 언어가 오늘날의 모든 기능을 가질 것이라고 말하면 그들은 당신이 미쳤다고 생각할 것입니다.

PHP in 2022

https://stitcher.io/blog/php-in-2022

Brent Roose가 쓰는 PHP 생태계 overview.

매년 “PHP in 20XX” 포스트를 쓰는 것은 이번이 네 번째이며, 올해만큼 흥분한 적이 없었다는 것을 인정해야 합니다.

PHP 8.1

열거형
생성자에서 new 사용
readonly properties

PHP에 추가된 최신 기능을 확인하시려면 PHP 2021 3분 요약 비디오를 보고 오셔도 좋습니다.

Static Analysis

PHP의 정적 분석이 크게 성장하고 있습니다.

PHP에서 정적 분석이 중요한 이유와 이에 대해 열광하는 이유에 대해 간단히 읽고 싶다면 우리는 런타임 유형 검사가 필요하지 않습니다라는 블로그 게시물을 확인할 수 있습니다.

The PHP foundation

2개월 전, PHP 세계는 2021년의 가장 큰 뉴스일 수도 있는 꽤 큰 뉴스를 받았습니다. 가장 활동적인 핵심 유지 관리자 중 한 명인 Nikita가 LLVM 작업을 위해 자리에서 물러나지만 동시에 PHP core 개발을 지원할 수 있게 몇몇 대기업이 지원하는 새로운 이니셔티브도 생겼습니다.

요컨대, PHP core 개발 자금을 지원하는 유일한 목표를 가진 비영리 PHP Foundation이 있습니다. 이 이니셔티브는 이미 프로젝트에 10만 달러를 약속한 JetBrains가 주도합니다. 다른 많은 사람들과 함께 이제 $329,920.75를 모았습니다. 좋은 시작!

  • 이 글을 번역하는 시점에는 $386,384.93 USD, 연간 추정 예산은 $468,509.68 USD입니다.

JetBrains의 블로그 게시물에서 재단의 사명과 목표에 대해 자세히 알아볼 수 있습니다 .

The ecosystem

Packagist는 이제 300만 개 이상의 등록된 버전과 300,000개 이상의 패키지가 있습니다. 보시다시피 생태계는 계속 성장하고 성장하며 2022년에도 다르지 않을 것입니다.

Packagist에 등록된 패키지 현황 그래프

최근에 Packagist는 500억 회 이상의 설치(install)를 처리하는 이정표를 통과했습니다.
축하해요 Packagist!

Async PHP

Async 커뮤니티의 흥미로운 개발 중 하나는 Amp와 ReactPHP의 개발자가 함께 모여 Revolt PHP라는 fiber 호환 이벤트 루프 구현을 만들었다는 것 입니다.

Serverless PHP

Matthieu Napoli는 PHP 개발자에게 이 비교적 새로운 PHP 사용 방법에 대해 교육하는 것을 그의 사명으로 삼고 있으며 꽤 잘하고 있는 것 같습니다. 서버리스 PHP를 쉽게 만들기 위한 그의 오픈 소스 프로젝트인 Bref를 확인 하거나 2022년 서버리스 PHP에 대한 그의 visual course을 확인할 수 있습니다.

Heaps explained in PHP

https://doeken.org/blog/heaps-explained-in-php

PHP에서 heap을 사용하는 방식을 보여줍니다.
🤷 힙은 언제 유용합니까?

  • 가장 높은(또는 가장 낮은) 값에 직접 액세스
  • 많은 삽입 및 제거 작업
  • 배열 정렬
  • 우선 순위 대기열

이를 훌륭하게 구현한 Real world example은 revolt/event-loop package에서 찾을 수 있습니다.

이 글을 읽기 위해 Tree에 대한 약간의 지식은 유용하기 때문에 Trees and Tree Traversal in PHP를 먼저 읽는 것이 좋습니다 .

Implementation of Chain of Responsibility Design Pattern in PHP

https://orangesoft.co/blog/chain-of-responsibility-design-pattern-in-php

PHP에서 Chain of Responsibility 디자인 패턴 구현

             Chain of Responsibility:
+-------------------------------------------+
+-------+ | +---------+ +---------+ +---------+ | +--------+
| Input | -> | | Handler | -> | Handler | -> | Handler | | -> | Output |
+-------+ | +---------+ +---------+ +---------+ | +--------+
+-------------------------------------------+

async & await at the edge with ReactPHP

https://blog.wyrihaximus.net/2021/12/async-and-await-at-the-edge-with-reactphp/

Fiber를 지원하는 PHP 8.1이 출시되었습니다! ReactPHP maintainer 중 한 명이 사용 방법에 대해 씁니다.

PHP Benchmark: include() vs file_get_contents()

https://konstantin.blog/2021/php-benchmark-include-vs-file_get_contents/

Opcache 설정을 조정하면 include()가 file_get_contents()보다 빠를 수 있습니다.

Where does my validation live?

https://blog.frankdejonge.nl/where-does-validation-live/

유효성 검증을 어느 레이어(Controller Layer, Service Layer, Domain Layer)에 넣어야 할지, 각각 어느 점이 좋은지 설명합니다.

  • Controller validation: shapes and types
  • Service validation: from types to concepts concepts
  • Domain Layer: guarding invariants

How to build maintainable PHP applications

https://blog.ecotone.tech/how-to-build-maintainable-php-applications/

유지 관리 가능한 PHP 애플리케이션을 구축하고 프레임워크에서 비즈니스 로직을 분리하는 방법.

Making sense of the 8 log levels in PHP

https://darkghosthunter.medium.com/php-making-sense-of-the-8-log-levels-ddd27c4719a

여덟 레벨을 모두 설명하는데 저자 자신은 4개만 쓴다고 합니다.

  • Debug(디버그): 앱의 내부 작동을 보여주는 모든 것.
  • Error(오류): 발생해서는 안 되는 일이 발생했습니다.
  • Alert(경고): 단기적으로 앱 상태를 위험에 빠뜨리는 모든 것.
  • Emergency(긴급 상황): 응용 프로그램의 모든 부분이 작동을 멈췄습니다.

Overriding vendor classes

https://downing.tech/posts/overriding-vendor-classes

포크를 생성하지 않으려면 composer.json에서 autoloading을 적절하게 구성할 수 있습니다. 또는 옵션으로 cweagans/composer-patches와 함께 패치를 사용할 수도 있습니다.

Accessing private properties in PHP

https://www.lambda-out-loud.com/posts/accessing-private-properties-php/

Closure::bind를 통한 리플렉션 및 액세스 대신 객체를 배열로 캐스팅할 수 있습니다(하지만 그래야 할까요?).

@AllaertPatrick의 트윗

https://twitter.com/AllaertPatrick/status/1478323931924860928

때때로 코드에서 무슨 일이 일어나고 있는지 이해하기 위해 생성된 opcode를 살펴보는 것이 유용할 수 있습니다. phpdbg -p* file.php 명령이 도움이 될 것입니다.

AllaertPatrick에서 공유된 이미지

Community

PHP in 7 minutes

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

Brent Roose의 영상.

What kind of language is PHP in 2022? Find out in 7 minutes!

Php_annotated 이미지

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

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


PHP 8.1 RC3이 출시 되었습니다. 열거형(enumeration)을 사용하는 첫 패키지도 이미 사용할 수 있습니다.

Magento의 커뮤니티 포크가 발표되었습니다.

PSR 외에도 PER이라는 새로운 유형의 권장 사항이 있습니다.

Symfony 6은 가능한 모든 곳에 타입을 선언합니다. 업데이트 방법은 무엇입니까?

PHP 8.2에서는 최적화된 새로운 데이터 구조와 독립형(standalone) null 타입이 제안되었습니다.

실제로는 취약점이 아니긴 하지만, disable_functions과 관련된 PHP 취약점이 게시되었습니다.

⚡️ News

PHP 8.1 RC 3

세 번째 릴리스 후보가 예정대로 발표되었습니다. PHP 8.1의 새로운 기능에 대한 개요는 What’s new in PHP 8.1 그리고 PHP 8.1: before and after 게시글을 참조하세요. 전체 변경 목록은 PHP.Watch에서 확인할 수 있습니다.

이제 PHP 8.1용 마이그레이션 가이드도 나왔습니다.

Mac에서 homebrew를 통해 php:8.1-rc-cli와 같은 이미지를 docker로 시도해보거나 그냥 3v4l.org를 둘러볼 수도 있습니다.

열거형(enumeration)을 사용하는 첫 패키지도 이미 사용할 수 있습니다.
alexanderpas/php-http-enum는 HTTP 응답 메시지의 상태 코드 및 텍스트가 포함된 열거형입니다.

PHP 8.0.11, 7.4.24 and 7.3.31

https://www.php.net/ChangeLog-8.php#8.0.11
https://www.php.net/ChangeLog-7.php#7.4.24
https://www.php.net/ChangeLog-7.php#7.3.31

보안 취약점 CVE-2021-21706 수정을 지원하는 업데이트.

이 수정 사항은 ZipArchive::extractTo가 Windows에서 특정 파일 경로 이름으로 대상 디렉토리 외부에 zip 아카이브를 추출하게 하는 버그를 해결합니다.

The Future of Magento

https://www.mage-os.community/blog/the-future-of-magento

Magento 커뮤니티 구성원의 이 편지는 커뮤니티 조직에서 운영하는 Magento 포크가 있을 것이라고 발표했습니다. 목표는 Magento의 장기적인 오픈 소스 수명을 보장하는 것입니다.

이전에 Adobe가 Magento를 마이크로서비스로 분해할 계획이라고 발표했습니다. 이것이 정확히 어떻게 일어날지는 불분명합니다. 이것이 포크가 생성되는 이유입니다. 후자가 열려 있는 한 Adobe의 Magento와 호환됩니다.

PhpStorm 2021.3 Early Access Program Is Open

https://blog.jetbrains.com/phpstorm/2021/09/phpstorm-2021-3-early-access-program-is-open/

PhpStorm 2021.3 Early Access 프로그램이 한창 진행 중입니다. 매주 JetBrains에서는 공식 릴리스 전에 새로운 기능을 사용해 볼 수 있는 새로운 빌드를 게시합니다.

다가오는 주요 릴리스에는 PHP 8.1에 대한 완전한 지원, 제네릭에 대한 많은 개선 사항, 배포를 위한 새로운 옵션, 업데이트된 디버거 인터페이스 등이 포함될 것입니다.

PER Workflow – PHP-FIG

https://www.php-fig.org/bylaws/per-workflow/

PHP-FIG는 PHP Evolving Recommendations의 아이디어를 승인했습니다. PSR 표준 외에도 영구적으로 변경 및 보완할 수 있는 권장 사항인 PER이 있습니다.
예를 들어 코드 스타일의 경우 새로운 언어 기능을 반영하는 새로운 규칙을 추가할 수 있습니다.

“Vulnerability” (not) in PHP to bypass disable_functions

한 연구원이 최근 php.ini의 disable_functions 지시문에 의해 설정된 제약 조건을 우회하는 방법을 발표했습니다.

disable_functions를 사용하여 PHP 스크립트에서 특정 기능의 사용을 금지할 수 있습니다. 예를 들어 system, exec, proc_open 및 shell_exec가 외부 프로그램에 대한 호출을 차단하는 것을 금지할 수 있습니다.
(그건 그렇고, eval()은 함수가 아니라 언어 구조이기 때문에 금지할 수 없습니다.)

disable_functions는 보안 기능이 아니며 보안을 위해 그것에 의존하는 것은 나쁜 생각이기 때문에 우회 문제는 취약점이라고 할 수 없습니다.

이게 PHP의 보안 문제가 맞다고 하는 글에 Nikita Popov(aka nikic)가 reddit에 댓글을 남겼습니다.
많은 스크립트 언어들처럼 PHP 구현이 임의의 공격자가 제어하는 코드를 안정적으로 샌드박싱하는 것이 주요 목표는 아니며, 보안 문제인지 여부는 위협 모델(threat model)에 따라 판단할 수 있는데 서버에 올라간 PHP 프로젝트에 관한 한 원격 공격자를 위협 모델로 상정한다고 합니다. 아래 내용에서 정확한 표현으로 확인하세요.

Whether something is a security issue depends on your threat model. As far as the PHP upstream project is concerned, our threat model is a remote attacker. We consider the case where the attacker has ability to execute arbitrary PHP code on the server a lost cause.

Of course, for a shared hosting provider that does not use any OS-level separation between clients, this is a security issue. As far as the PHP project is concerned, this is a fundamentally insecure deployment method. You may use it at your own risk.

This is a matter of practicality, because the PHP implementation is very far removed from reliably sandboxing arbitrary attacker-controlled code. There are some languages that have this as a hard design constraint (the most important being JavaScript), but for other scripting languages this is not a primary goal (definitely not for PHP, and I would strongly suspect not for Python or Ruby either, though I’m not sure on that count).

If we wanted to move in that direction, the first step would be to promote all remaining engine notices/warnings to exceptions, because there is a large class of interrupt vulnerabilities caused by them (to the point that addressing other issues would be somewhat “pointless” from a security perspective). One of my bigger regrets for PHP 8.0 is that we did not make undefined variables an exception.

PHP에서 보안 문제로 간주되는 것과 그렇지 않은 것에 대해 자세히 알아보십시오: wiki.php.net/security.
이 문서에선 다음과 같은 문제가 보안 문제 버그로 분류됩니다.

  • 사용자가 승인되지 않은 작업을 실행할 수 있도록 허용하거나
  • 보안 경계를 넘거나
  • 액세스할 수 없는 데이터에 액세스하거나
  • 시스템의 접근성 또는 성능에 심각한 영향을 미치는 경우

그리고 문제를 더 자세히 이해하는 데 관심이 있다면 disable_functions가 작동하는 방식과 그렇게 악용하는 방식(메모리 손상을 통한 우회)에 대한 멋진 분석이 있습니다. 그리고 다른 하나는 이러한 문제를 자동으로 검색하는 방법을 설명합니다.

또한, 인기 있는 Laravel 프로젝트인 fiveai/Cachet에서 발견된 실제 RCE(Remote Code Execution) 취약점 분석을 확인하십시오: Laravel Configuration Injection을 통한 코드 실행.

composer/composer 2.1.9

https://github.com/composer/composer/releases/tag/2.1.9

이 업데이트는 Windows의 취약점을 수정합니다(CVE-2021-41116). Windows 사용자는 반드시 업데이트해야 합니다.

PHPOpenDocs.com

https://phpopendocs.com/about

PHP 관련 콘텐츠를 위한 커뮤니티 사이트를 만드는 실험입니다.

PHP 버전별로 그룹화된 기여자 목록이 있는 유용한 후원 페이지와 PHP 코드 구조 및 PHP 코어에 기여를 시작하는 방법에 대한 리소스에 대한 많은 링크가 있는 Internals 섹션이 이미 있습니다.

🐘 PHP Internals

New data structures in PHP

PHP는 list, 연관 배열, 큐, 스택 등으로 사용할 수 있는 범용 배열 데이터 구조를 가지고 있습니다.

이 다재다능함은 사실은 해시 테이블을 사용하여 달성됩니다. 그러나 이 다재다능함은 추가 메모리 사용량과 미묘한 성능 오버헤드를 대가로 합니다.

SPL(Standard PHP Library)은 보다 전문화된 데이터 구조를 가지고 있지만 그 자체로 무거운 감이 있습니다.

Tyson Andre는 PHP에 최적화된 새로운 데이터 구조를 추가할 것을 제안합니다.

이를 달성하기 위한 한 가지 옵션은 널리 사용되는 php-ds/ext-ds 확장에서 구조를 추가하는 것이지만 작성자는 이 아이디어를 지지하지는 않습니다. GitHub의 이 스레드는 토론의 세부 사항에 대한 정보를 제공합니다.

현재로서는 두 개의 RFC가 있습니다. 이러한 구조 및 기타 구조의 구현은 TysonAndre/pecl-teds 확장에서 사용할 수 있습니다.

[RFC] final class Vector

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

벡터 구조 – 연속된 인덱스 0, 1, 2 등의 요소 집합입니다. 현재 배열보다 절반의 메모리가 필요하고 유사한 SPL 구조보다 빠르게 작동합니다.

API의 관점에서 보면, 이것은 ArrayAccess, IteratorAggregate 및 Countable 인터페이스를 가진 클래스입니다. RFC에는 아래와 같은 식의 final class를 추가하자는 내용이 나옵니다.

final class Vector implements IteratorAggregate, Countable, JsonSerializable, ArrayAccess
{
...

ArrayAccess처럼 사용할 수도 있죠.

$values = new Vector();
for ($i = 0; $i < $n; $i++) {
$values[] = $i;
}

[RFC] final class Deque

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

Deque는 양방향 큐(doubly-linked queue)입니다. 즉, 시작과 끝에서 요소를 추가 및 제거할 수 있습니다. SplQueueue 또는 SplDoublyLinkedList 대신 사용하면 성능 및 메모리 소비가 즉시 개선되는 것을 볼 수 있습니다.

Deque는 메모리 관리에 대한 알려진 문제로 인해 대형 어레이를 사용하는 장기 실행 애플리케이션에 사용하기에도 적절합니다.

[RFC] Allow null as standalone type

https://wiki.php.net/rfc/null-standalone-type

George Peter Banyard는 타입 선언에서 null을 사용하는 기능을 추가할 것을 제안합니다.

첫째, 이것은 PHP의 타입 시스템의 완전성에 대한 누락된 부분입니다. mixed 타입과 never 타입이 추가됐고, union과 intersection이 있지만 unit 타입은 누락되었습니다.

둘째, 이 타입은 타입 힌트에 대한 일부 엣지 케이스를 다루고 정적 분석을 개선합니다.
예를 들어 현재로서는 유사타입(pseudotype)인 false를 union에서 사용할 수 있지만 함수가 false|null을 반환하도록 지정할 수는 없으며 bool|null만 반환할 수 있습니다.

How opcache works

https://www.npopov.com/2021/10/13/How-opcache-works.html

Nikita Popov는 항상 블로그 게시물을 작성하지는 않지만, 블로그 게시물을 작성할 때는 개념을 명확하고 자세하게 설명합니다.

🛠 Tools

Xdebug 3.1.0

https://xdebug.org/announcements/2021-10-04

인기 있는 PHP 디버거가 업데이트되었습니다. PHP 8.1, 많은 수정 사항 및 약간의 사소한 기능에 대한 지원이 함께 제공됩니다. 이 확장 프로그램 개발자인 Derick Rethans의 Xdebug 3에 대한 이 비디오 시리즈를 놓치지 마십시오.

spiral/roadrunner 2.4

https://github.com/spiral/roadrunner

Golang으로 작성된 PHP 애플리케이션 서버의 대규모 업데이트입니다. 이 릴리스에는 대기열(queue), 키-값 저장소 및 Temporal(분산형 오케스트레이션 도구)과의 통합에 대한 지원이 포함됩니다. 더 자세히 보려면 여기로.

brick/date-time

https://github.com/brick/date-time

날짜 및 시간 작업을 위한 immutable 클래스 집합입니다.

php-runtime/runtime

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

Runtime 컴포넌트는 애플리케이션 부트스트랩 로직을 전역 상태와 분리하므로 PHP-FPM, ReactPHP, Swoole 등과 같은 환경에서 아무 변경 없이도 애플리케이션을 실행할 수 있습니다.

원래 Symfony의 구성 요소였으나, 이제는 GitHub에서 별도의 조직(organization)이 될 정도로 훌륭하다고 여겨집니다.

rindow/rindow-neuralnetworks

https://github.com/rindow/rindow-neuralnetworks

Python Keras를 기반으로 하는 신경망 교육 프레임워크입니다. 해당 문서에 따르면 GPU 지원은 실험 모드 및 Windows에서만 사용할 수 있습니다.

piko-framework/router

https://github.com/piko-framework/router

또 다른 PHP 라우터인 이 라우터는 기수 트리(radix tree)를 기반으로 하며 벤치마크에 따르면 Symfony 라우터보다 빠릅니다.

nunomaduro/termwind

https://github.com/nunomaduro/termwind

Tailwind CSS 스타일 구문으로 콘솔 프로그램의 출력 형식을 지정하기 위한 PHP 8+ 패키지입니다.

icanhazstring/random-issue-picker

https://github.com/icanhazstring/random-issue-picker

Hacktoberfest에 참여하고 싶지만 어디서부터 시작해야 할지 모르겠다면 GitHub 또는 GitLab에서 무작위 문제를 선택하는 도구가 있습니다.

Symfony

Preparing your applications and bundles for Symfony 6

https://symfony.com/blog/preparing-your-apps-and-bundles-for-symfony-6

Symfony 5.4 및 6.0은 11월에 출시될 예정입니다. 차이점은 Symfony 5.4에는 더 이상 사용되지 않는 기능이 모두 포함되지만 Symfony 6.0에서는 모두 제거된다는 것입니다. 또한 Symfony 5.4 및 6.0 모두 가능한 경우 모든 메서드 속성, 인수 및 반환 값에 PHP 유형 선언이 추가됩니다.

Symfony 구성 요소를 사용하는 앱을 업데이트하는 방법을 알아보려면 Symfony Core 팀 구성원이 작성한 이 자세한 게시물을 확인하세요. Symfony 6: PHP 8 Native Types & Why We Need YOU.

you will no longer need flex.symfony.com

https://symfony.com/blog/symfony-flex-is-going-serverless

Symfony Flex의 경우 더 이상 flex.symfony.com이 필요하지 않습니다. 모든 레시피는 이제 github.com/symfony/recipes에 있습니다.

A week of Symfony #771 (4-10 October 2021)

https://symfony.com/blog/a-week-of-symfony-771-4-10-october-2021

Laravel

Working with fixture data in your tests.

https://dyrynda.com.au/blog/working-with-test-fixtures

정적 테스트 fixture를 다루는 방법을 이야기 합니다.

Strategies for decreasing the number of queries in a Laravel app.

https://freek.dev/2075-strategies-for-decreasing-the-number-of-queries-in-a-laravel-app

Laravel 앱에서 쿼리 수를 줄이기 위한 전략을 소개합니다.

📺 Laravel Worldwide Meetup #10:

A Little Bit of AWS Lambda, and Pest to Perfection.

📺 Converting a PHPUnit testsuite to Pest

https://www.youtube.com/watch?v=81-r9THrJhI

📺 Let’s Build an Online Store – A nice series of streams.

https://www.youtube.com/watch?v=-0C04evVV9A&list=PLKJBt7aeK3k8Ry6aNd4wUOvfXtlnQh5-O&index=1&t=5s

💡 기타 읽을 만한 글

The Road to PHP: Static Analysis

https://road-to-php.com/static

정적 분석에 대한 Brent Roose의 10일 뉴스레터입니다.

Testing tips from Matthias Noback:

One Class, One Test?

https://matthiasnoback.nl/2021/09/quick-testing-tips-one-test-per-class/

테스트가 없던 시절로 돌아가는 건 싫고, 실행하기 쉬운 규칙을 만들어 생각없이 테스트를 추가하는 게 정말 도움이 되겠느냐는 글.

Testing Anything; Better Than Testing Nothing?

https://matthiasnoback.nl/2021/09/testing-anything-better-than-testing-nothing/

없는 것보다는 나으니 아무거나 테스트하려는 사람들을 말리며, 테스트를 작성하지 말고 좋은 테스트를 작성하라고 합니다. 그렇게 하는 동안 테스트 작성이 재미있고 쉽고 효과적인지 확인하라고 하네요. 켄트백은 “테스트는 두려움을 지루함으로 변화시켜주는 프로그래머의 돌이다.”라고 했는데 말이죠…

어쨌든 이를 위해 다음에 투자해야 한다고 합니다.

  • 특정 테스트를 매우 빠르게 실행하는 데 도움이 되는 테스트 도구
  • 빠른 결과를 제공하는 테스트
  • 다른 데이터가 제공될 때 코드가 어떻게 동작하는지 보여주기 위해 더 많은 테스트 케이스를 추가하는 것은 정말 저렴해야 합니다.

이런 게 “클래스 하나에 테스트 하나” 규칙이나 request 날리고 DB 확인하는 테스트(make-request-then-look-in-DB)보다는 나을 거라고 합니다.

Write Unit Tests Like Scenarios

https://matthiasnoback.nl/2021/09/write-unit-tests-like-scenarios/

읽기 좋은 테스트를 위해 시나리오를 작성하듯 코드를 작성하라는 조언입니다.
예시로 저자는 Give/When/Then 스타일로 작성합니다. naming 규칙에도 신경써야 하며 더 높은 추상화 수준에서 “왜”에 집중하며(해당 동작의 이유) 테스트를 작성하길 원합니다.

What happens when we clone objects?

https://doeken.org/blog/what-happens-when-we-clone

clone을 사용하면 어떤 일이 벌어질까?

Either data structure.

https://marcosh.github.io/post/2021/09/24/either-why-or-how.html

Either 단일 데이터 유형/클래스에서 무언가가 두 가지 중 하나일 수 있다는 사실을 설명할 수 있는 데이터 구조입니다.
이를 구현하는 예제를 Haskell과 PHP로 구현합니다.

creating an Option type in PHP

https://ryangjchandler.co.uk/posts/creating-an-option-type-in-php

PHP에 Option 추가하기.

null이나 nil 개념이 없는 Rust의 Option에서 아이디어를 얻어 Option type을 만드는 과정을 보여줍니다. PHP 8.0 이상.

Generic 지원은 PHPStan의 지원을 받습니다.

현재 PHP의 enum으로는 구현이 완벽하진 않고, RFC: Tagged Unions가 도입된다면 좀 더 Rust의 Option에 가까운 구현을 할 수 있다고 합니다…만, PHP 8.1을 목표로 한 RFC는 이 글을 번역하는 시점에 Draft 상태로 남아있습니다.

The €13.000 Video Course Launch That Made Me Believe In Myself Again

https://christoph-rumpel.com/2021/9/the-video-course-launch-that-made-me-belive-in-myself-again

Christoph Rumpel이 어떻게 masteringphpstorm.com 코스를 시작했는지에 대한 몇 가지 세부 정보를 공유합니다.

Generative art with PHP

https://www.binarymoon.co.uk/2021/09/creating-generative-art-with-php/

Ben Gillbanks는 코드를 사용하여 간단한 아바타에서 픽셀 아트 도시에 이르기까지 이미지를 만드는 방법을 설명합니다.

픽셀 아트 도시 이미지

A game on FFI: quasilyte/kphp-game

https://github.com/quasilyte/kphp-game

KPHP는 PHP 컴파일러입니다. PHP의 제한된 하위 집합을 PHP보다 빠르게 실행되는 기본 바이너리로 컴파일합니다.

KPHP 팀의 사람들은 FFI에 대한 실험적 지원을 구현하고 데모로 FFI를 사용하여 작은 게임을 만들었습니다.

놀랍게도 KPHP-FFI는 기존 PHP의 FFI와 호환되므로 일반 PHP 7.4 이상에서도 게임을 실행할 수 있습니다.

PHP의 FFI에 대한 완전한 가이드(Complete guide to FFI in PHP)에서 다른 FFI 응용 프로그램에 대해 자세히 읽어보십시오.

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.

Php_annotated 이미지

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

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


PHP 8.1이 두 번째 베타 버전에 도달했으며 변경 사항 목록이 확정되었습니다. 결정이 필요한 것은 지금 투표 중인 Nullable Intersection types 뿐입니다.

한편, PHP internals에서는 이미 다음 릴리스의 기능에 대해 논의하고 있습니다. 2022년에 출시될 PHP 8.2의 처음 두 RFC에 대해 알아보려면 계속 읽어보시기 바랍니다.

PHP 8.1이 파이버를 갖게 됨에 따라 두 개의 인기 있는 PHP용 비동기 프레임워크가 힘을 합치고 공통의 추상화 위에서 함께 작업하기로 합의했습니다.

⚡️ News

PHP 8.1.0, Beta 2

https://www.php.net/archive/2021.php#2021-08-05-2

베타 릴리스는 PHP 8.1의 활발한 개발 단계가 끝났다는 신호이며, 이는 새로운 기능 및 변경 사항 목록이 최종적인 것으로 간주될 수 있음을 의미합니다(Nullable Intersection types 제외). 세 번째이자 마지막 베타 버전은 8월 19일 입니다.

Peter Kokot의 PHP 8.1 departures 이미지

PHP 8.1에는 어떤 기능이 추가될까요?
가장 주목할만한 변경 사항을 요약했습니다.

  • Enums (RFC).
  • First-class callables (RFC).
  • Readonly properties (RFC).
  • New operator in initializers (RFC).
  • Brand new never type for return values (RFC).
  • Fibers (RFC).
  • Final constants in classes (RFC).
  • Spread operator supporting string array keys (RFC).
  • Deprecation of implicit non-integer-compatible float to int conversions (RFC).
  • Deprecation of serializable interfaces (RFC).
  • Explicit octal notation with the 0o prefix (RFC).
  • Restricted usage of $GLOBALS (RFC).

더 자세히 알고 싶다면 PHP 8.1 “이전” 및 “이후” 예제를 훌륭히 모은 글을 확인하세요.

Brent Roose의 The Road to PHP 8.1이라는 10일짜리 뉴스레터도 있습니다.

모든 변경 사항에 대한 전체 설명은 PHP.Watch: php.watch/versions/8.1 에서 볼 수 있습니다 .

PHP.Watch에는 Directory Uploads in PHP 8.1라는 게시물도 있습니다 . PHP 8.1의 경우 $_FILES 배열에는 사용자의 디렉토리 구조 경로가 있는 full_path 섹션이 포함됩니다. 이것은 디렉토리 업로드를 지원하는 데 필요합니다.

ReactPHP and Amp join forces

PHP 8.1에 파이버가 추가되면서 비동기 PHP 코드가 조금 더 쉽고 예뻐졌습니다. 비동기 PHP용으로 널리 사용되는 두 라이브러리의 유지관리자들(maintainers)이 RevoltPHP 프로젝트를 발표했습니다. 그들은 공통의 이벤트 루프를 만들고 fiber 추상화를 공유하여 구현할 계획입니다.

Revolt PHP(@revoltphp)의 트윗

With Fiber in 8.1 a new age dawns for #PHP. @AsyncPHP and @ReactPHP are joining forces through @RevoltPHP collaborating on a shared event loop and Fiber abstraction. Stay tuned!

PhpStorm 2021.2 has been released

https://blog.jetbrains.com/phpstorm/2021/07/phpstorm-2021-2-release/

제네릭 지원, 열거형(enums), 배열 모양 및 이 릴리스에 도입된 기타 모든 것에 대한 모든 세부 정보가 포함된 이 블로그 게시물을 확인하십시오.

PHP

  • Basic support for generics in PHP
  • PHP 8.1 Enums
  • One-line array shapes
  • New inspections and quick-fixes
  • Refactoring opportunities inspections
  • Formatter improvements
  • Reworked Extract Method refactoring

IDE

  • Actions on save
  • New Terminal options
  • Run tests before commit
  • Browser pages reload on save
  • Automatic clean-up of caches and log directories
  • Advanced settings

Code With Me

  • Screen sharing

PHP 7.4.22, PHP 8.0.9

https://www.php.net/ChangeLog-7.php#7.4.22
https://www.php.net/ChangeLog-8.php#8.0.9

현재 branch에 대한 보안 및 버그 수정 업데이트.

🐘 PHP Internals

[RFC] Nullable Intersection types

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

Type intersection에 관한 RFC르 채택한 직후 Nikolas Grekas(Symfony core)가 의견을 게시했습니다. 그는 intersection을 nullable로 만들 수 있는 기능이 없으면 훨씬 덜 흥미롭다고 말했습니다.

기술적으로 PHP 8.1 branch는 이미 동결되었지만(frozen) PHP 팀은 이 제안에 예외를 적용하기로 결정했습니다.

class Foo
{
public (X&Y)|null $bar;

function setBar((X&Y)|null $bar = null): (X&Y)|null
{
return $this->bar = $bar;
}
}

Syntax choice is also put to a vote: ?X&Y or (X&Y)|null.
구문 선택도 투표에 포함됩니다: ?X&Y 또는 (X&Y)|null.

[RFC] Unwrap reference after foreach

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

현재 버전의 PHP에는 foreach 루프에 대한 전용 scope가 없습니다. 이것은 매우 직관적이지 않은 결과를 가져옵니다. foreach 루프가 끝난 후에도 $value의 reference와 배열의 마지막 요소에 대한 참조가 유지됩니다.

문제는 다음 예를 통해 쉽게 설명됩니다.

$array = [0, 1, 2];
foreach ($array as &$value) { /* ... */ }
// without calling unset($value),
// $value still points to the last element: $array[2]

foreach ($array as $value) {
// $array[2] will be updated each time with the values of $array
}
var_dump($array);

// Before RFC:
>
array(3) {
[0] => int(0)
[1] => int(1)
[2] => &int(1)
}

// After RFC:
> array(3) {
[0] => int(0)
[1] => int(1)
[2] => int(2)
}

이 RFC는 논리적으로는 문제 없지만 버그가 있어 보이는 동작을 수정하도록 제안합니다. foreach 루프 후에 $value에 대한 참조가 제거됩니다.

[RFC] Never For Parameter Types

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

PHP 8.1에는 never라는 새로운 반환값 유형이 있습니다. PHP 8.2의 경우 never를 매개변수 유형으로 사용할 수 있도록 하는 제안이 이미 있습니다.

RFC의 저자인 Jordan LeDoux는 never가 추상 클래스와 인터페이스에서 유용할 것이라고 생각합니다. 매개변수를 어떤 방식으로든 입력해야 함을 지정하는 데 사용할 수 있습니다.

이것은 제네릭의 동작을 모방하는 데 도움이 될 수 있습니다. 그러나 정적 분석기 및 PhpStorm에 대해서는 여전히 PHPDoc의 type description에 의존해야 합니다.

interface CollectionInterface {
public function add(never $input): self;
}

class A implements CollectionInterface {
public function add(int $input): self {}
}

🛠 Tools

frontdevops/php-evil

https://github.com/frontdevops/php-evil

eval()을 비활성화하는 extension. eval()은 함수가 아닌 언어 구조이므로, disable_functions로는 막을 수 없습니다. 그래서 저자는 자신만의 작은 extension을 만들어야 했습니다.

beyondcode/expose 2.0

https://github.com/beyondcode/expose/releases/tag/2.0.0

ngrok의 대안으로, 로컬 환경의 서비스를 전 세계에 몰래 서비스 하기 위한 멋진 도구입니다. 웹훅을 테스트하거나 앱을 시연하는 데 유용해야 합니다.

EcotoneFramework

https://github.com/ecotoneframework

PHP에서 DDD, CQRS 및 이벤트 소싱을 하기 위한 흥미로운 서비스 버스입니다. 속성을 통해 PHP 8 이상에서 작동하며 Laravel 및 Symfony에 대한 훌륭한 문서 및 통합 기능이 있습니다. 다음은 CQRS 구현의 예 입니다.

PHP-CSS-Parser

https://github.com/sabberworm/PHP-CSS-Parser

PHP로 작성된 CSS 파일용 파서. 이를 통해 CSS 파일을 데이터 구조로 추출하고 해당 구조를 조작하고 (최적화된) CSS로 출력할 수 있습니다.

Psalm 4.9.0

https://github.com/vimeo/psalm/releases/tag/4.9.0

저자인 Matt Brown 이 프로젝트를 떠난 후의 첫 번째 커뮤니티 릴리스입니다.

ergebnis/composer-normalize

https://github.com/ergebnis/composer-normalize

composer.json파일을 멋지게 보이게 하는 Composer용 플러그인입니다.

paragonie/paseto 2.0 – Stateless-token, a safe alternative to JWT.

https://github.com/paragonie/paseto/releases/tag/v2.0.0

JWT의 안전한 대안인 Stateless-token.

결함이 있는 JOSE(Javascript Object Signing and Encryption) 대신 안전한 Paseto(Platform-Agnostic SEcurity TOkens) 표준을 사용하자고 합니다.

JOSE 표준에 어떤 결함이 있는지는 여기서 확인해보세요.

chrome-php/chrome v1.0.0

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

헤드리스 모드에서 Chrome/Chromium을 제어하기 위한 패키지입니다.

darsyn/ip

https://github.com/darsyn/ip

Doctrine을 위한 헬퍼를 포함한, IP 주소 작업을 위한 Immutable value objects

MadLisp

http://madlisp.com/

PHP로 작성된 Lisp 인터프리터.

Symfony

The Symfony team now provides support in the Discussions section on GitHub.

https://github.com/symfony/symfony/discussions/42363

Symfony 팀은 이제 GitHub의 토론 섹션에서 도움(support)을 제공합니다.

Scaling the Symfony Demo app to the extreme with Varnish.

https://jolicode.com/blog/scaling-the-symfony-demo-app-to-the-extreme-with-varnish

Varnish를 통해 Symfony Demo app을 극단적으로(소수의 사용자에서 수만 명의 동시 사용자로) 확장해봅니다.

Symfony Lock

https://medium.com/geekculture/symfony-lock-dealing-with-shared-resources-concurrency-and-parallelism-f4df66a744de

공유 리소스, 동시성, 병렬성을 다룹니다.

A way to centrally handle Doctrine/Symfony access control.

https://medium.marco.zone/doctrine-symfony-centralized-access-control-d1f4717734e5

Doctrine/Symfony 액세스 제어를 중앙에서 처리하는 방법

How to use cascade delete in Doctrine

https://medium.com/accesto/how-to-delete-not-to-delete-yourself-accesto-blog-9c252f684db5

Doctrine에서 cascade 삭제를 사용하면서 모든 데이터를 잃지 않는 법.

A week of Symfony #763 (9-15 August 2021).

https://symfony.com/blog/a-week-of-symfony-763-9-15-august-2021

Laravel

Laracon Online

https://laracon.net/#schedule

9월 1일로 예정되어 있습니다.

laravelexamples.com

https://laravelexamples.com/

Laravel Daily YouTube 채널 작성자의 Laravel에 대한 유용한 예제 카탈로그입니다 .

LaravelDaily/Laravel-Roadmap-Learning-Path

https://github.com/LaravelDaily/Laravel-Roadmap-Learning-Path

어떤 개발 경험 수준에도 도움이 될 멋진 Laravel 교육 자료 모음입니다.

Building an app to scale on Laravel Vapor.

https://dyrynda.com.au/blog/scaling-on-laravel-vapor

Laravel Vapor에서 앱을 확장하는 방법.

Immutable dates in Laravel.

https://dyrynda.com.au/blog/laravel-immutable-dates/

Taylor Otwell(@taylorotwell)의 트윗

This week’s 8.53.0 release includes new “immutable_date” and “immutable_datetime” casts for Eloquent!

Carbon을 다루면서 흔히 하는 실수가 있죠.

$start = Carbon\Carbon::now();
$end = $start->addDay();
$end->diffForHumans($start); // 1 second before

Carbon을 쓰는 대신 CarbonImmutable을 사용하면 이 문제를 피할 수 있습니다.

$start = Carbon\CarbonImmutable::now();
$end = $start->addDay();
$end->diffForHumans($start); // 1 day after

Carbon\Carbon이나 Illuminate\Support\Carbon 대신 Illuminate\Support\Facades\Date로 바꿔주는 식으로 변경해줄 수도 있습니다.

📺 60+ Laravel collection methods in 15 minutes.

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

15분 안에 60 개 이상의 Laravel Collection method를 살펴봅니다.

📺 What’s new in Laravel v8.53.0

https://www.youtube.com/watch?v=8Iz1UqSbpwA

Laravel YouTube 채널 에서 더 많은 동영상을 확인하세요.

Yii

Yii framework team continues to release packages for the upcoming Yii 3: yiisoft/data-response, yiisoft/view, yiisoft/yii-view, yiisoft/mailer.

PhpStorm

i18n Ally

https://plugins.jetbrains.com/plugin/17212-i18n-ally

번역을 위한 문자열을 쉽게 작업할 수 있는 PhpStorm용 플러그인입니다. Laravel 및 Symfony에 대해 자동으로 구성되며 Yii, CodeIgniter 및 CakePHP에 대해 수동으로 구성할 수 있습니다.

Laravel Idea 4.4

https://laravel-idea.com/blog/2021/4-4-release

큰 업데이트가 있었답니다.

📺 Source diving the PhpStorm Pest plugin

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

Oliver Nybroe가 PhpStorm 플러그인 개발 방법을 보여주는 멋진 스트림 녹화.

💡 기타 읽을 만한 글

We don’t need runtime type checks

https://stitcher.io/blog/we-dont-need-runtime-type-checks

Sarah Golemon, Rasmus Lerdorf 및 Nikita Popov의 인용문과 함께 Brent Roose의 PHP 유형 시스템에 대한 흥미로운 사색입니다.

얼마 전, PHP의 제네릭이 조만간 나오지 않을 것이라는 것이 분명해졌고, 주요 이유 중 하나는 이를 구현하는 두 가지 방법이 있으며 둘 다 심각한 문제가 있다는 것입니다. 런타임 성능에 미치는 영향이 너무 크거나 구현이 너무 복잡하여 제대로 작동하지 않습니다. 두 접근 방식 모두 런타임 유형 검사 구현을 가정했습니다.

Sarah Golemon은,
(Hack이 이미 수행하고 있는) 런타임에 무시되는 제네릭이 대부분의 PHP 개발자에게 익숙하지 않은 패러다임 전환이라고 보며, 이런 변화는 5년 이상 걸릴 것이라고 생각합니다.

Brent는,
우리가 원하는 경우 PHP의 런타임 타입 체크를 해제하고 그 결과를 스스로 처리할 수 있어야 하며, 이런 시나리오에서는 정적분석기를 사용해야 한다고 말합니다.
이를 위해 이상적으로는 PHP가 built-in, opt-in 정적분석기와 함께 배포되어야 할 거라고 이야기 합니다.

Nikita는,
런타임에 지워지는 제네릭을 “비겁한 탈출구”라고 불렀습니다. 런타임에 지워지는 제네릭이 지원된다면 PHP의 유형 시스템 내에서 일부 부분은 런타임에 확인되고 다른 부분은 정적으로 확인되는 엄청난 불일치가 있음을 의미하기 때문입니다.

Brent가 런타임에 지워지거나 무시되는 제네릭에서 시작해야 하는 건 아니고, 먼저 런타임 유형 검사가 없는 PHP가 필요하고 그 위에 빌드하는 것을 이야기 했을 때는 그도 긍정적으로 생각했지만, PHP를 완전히 재설계 하지 못한다는 제약 안에서 일해야 하므로 힘들다고 답변했습니다.

Brent는 PHP internals에서 정적 분석 측면을 더 탐구하기를 바란다며 글을 마칩니다.

다음은 Joe Watkins의 주제에 대한 또 다른 의견입니다.

Joe Watkins(@krakjoe)의 트윗

Removing types from #PHP, even at runtime:

  1. fundamentally changes the dynamic nature of PHP
  2. will complicate the type system considerably
  3. is not a solution to the complexity of a generics implementation
    Source: I’ve experimented.
    TL;DR it isn’t happening …

(내가 해봤는데 그거 안 돼)

The evolution of a PHP object throughout the years

https://stitcher.io/blog/evolution-of-a-php-object

data transfer objects가 PHP 버전업에 따라 수년 간 어떻게 변화했는지 보여줍니다.

글의 예제를 단순화해서 2014년과 2021년을 비교해보았습니다.

August 2014: PHP 5.6

class BlogData
{
/** @var \DateTimeImmutable|null */
private $publishedAt;

/**
* @param \DateTimeImmutable|null $publishedAt
*/
public function __construct(
$publishedAt = null
) {
$this->publishedAt = $publishedAt;
}

/**
* @return \DateTimeImmutable|null
*/
public function getPublishedAt()
{
return $this->publishedAt;
}
}

November 2021: PHP 8.1

class BlogData
{
public function __construct(
public readonly ?DateTimeImmutable $publishedAt = null,
) {}
}

Functional programming and PHP 8

https://not-a-number.io/2021/functional-programming-and-php-8/

강력한 loophp/fpt(Functional Programming Toolbox) 툴 사용법을 예제와 함께 보여줍니다.

phpschool.io: PHP 8 Appreciate

https://www.phpschool.io/blog/2021/07/24/introducing-php-8-appreciate

PHP 8을 배우기 위한 CLI 워크숍.

b-viguier/php-emoji

https://github.com/b-viguier/php-emoji

이모지로 PHP 배열 함수를 설명합니다.

php-emoji 예시 이미지

📺 Videos

📺 What’s new in PHP 8.1 – Enums

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

Marcel Pociot의 열거형에 대한 자세한 둘러보기.

📺 Event Sourcery Full Course – CQRS and Event Sourcing.

https://www.youtube.com/playlist?list=PLQuwqoolg4aI6v1GvtRg3NgT0PBBHVqii

CQRS 및 이벤트 소싱.

📺 PHP Roundtable 82

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

전설적인 PHP 팟캐스트의 귀환. Sammy K를 응원 하고 새로운 호스트 Eric Van Johnson을 환영합니다!

Php_annotated 이미지

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

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


Composer의 통계에 따르면 PHP 8.0이 추진력을 얻고 있으며 더 많이 채택되고 있습니다.

한편, PHP internals에선 번들로 제공되는 PHP 확장의 네임 스페이스, 새로운 never 유형, 더 이상 사용되지 않을 일부 기능을 포함한 PHP 8.1에 대한 많은 변경 사항을 수용했습니다.

PHP 8.1 릴리스 관리자(release managers)가 선택됐으며 속성 접근자(property accessors), 순수 교차 유형(pure intersection types) 및 final 상수(final constants)를 포함하여 몇 가지 흥미로운 제안이 논의 중입니다.

⚡️ News

PHP Versions Stats – 2021.1

https://blog.packagist.com/php-versions-stats-2021-1-edition/

Composer가 packagist.org에 연결할 때 전송하는 데이터를 기반으로하는 전통적인 통계 기록:

  • PHP 7.4: 45.92% (+3.31)
  • PHP 7.3: 21.30% (-5.75)
  • PHP 7.2: 12.89% (-2.39)
  • PHP 8.0: 9.44% (+9.17)
  • PHP 7.1: 5.21% (-2.24)

PHP is available on Google Cloud Functions

https://cloud.google.com/blog/products/application-development/php-comes-to-cloud-functions

Google Cloud의 서버리스 플랫폼은 이제 PHP를 정식으로 지원합니다. GoogleCloudPlatform/functions-framework-php를 사용하면 PHP 7.4 기반 런타임에서 function을 실행할 수 있습니다.

Composer Command Injection Vulnerability

https://blog.packagist.com/composer-command-injection-vulnerability/

이번 Composer의 취약점은 Mercurial이 설치된 시스템에만 영향을줍니다. 그러나 수정 사항이 포함된 2.0.13 및 1.10.22 버전으로 즉시 업데이트하는 것이 좋습니다. 취약점에 대한 더 자세한 기술 분석을 확인하십시오.

Follow up on git.php.net attack

https://externals.io/message/113981

공격자들은 Rasmus Lerdorf와 Nikita Popov를 대신하여 두 개의 커밋을 PHP 소스에 푸시했습니다. 문제는 신속하게 감지되고 해결되었습니다. 악성 코드는 사용자에게 전달되지 않았습니다.

git.php.net 서버는 HTTPS를 통한 커밋을 허용하고 md5 해시를 secret으로 허용하는 다이제스트 인증을 사용한 것으로 나타났습니다. 모든 contributor의 해시 데이터베이스는 master.php.net에서 공격자에 의해 획득되었으며, 아마 원래는 손상된 서버일 것입니다.

결과적으로 모든 개발이 GitHub로 완전히 옮겨져 언어 개발자의 삶이 더 편해졌습니다.

PHP 7.4.19, PHP 8.0.6

https://www.php.net/ChangeLog-7.php#7.4.19
https://www.php.net/ChangeLog-8.php#8.0.6

With a fix in PDO_pgsql.

🐘 PHP Internals

✅ [RFC] never type

PHP 8.1에는 반환 값에 never라는 새로운 type이 추가됩니다.

never type으로 선언된 함수 또는 메서드는 값을 반환하지 않을 것임을 나타내며 예외를 throw하거나 die(), exit(), trigger_error() 유형의 호출로 종료됩니다.

이는 bottom type이며 다른 모든 type의 하위 type이며 Python, Rust, Kotlin 및 TypeScript에 유사한 type이 있습니다. 이 type은 정적 분석을 향상시킵니다.

function redirect(string $uri): never {
header('Location: ' . $uri);
exit();
}

function redirectToLoginPage(): never {
redirect('/login');
}

RFC는 이름부터 noreturn으로 제안이 됐지만, 투표로 최종 never로 결정됐습니다. RFC의 Naming 섹션 참고하세요.

자세한 내용은 PHP.Watch에서 보거나 Matt Brown과 Ondřej Mirtes가 함께 하는 PHP Internals News podcast에서 들을 수 있습니다.

✅ [RFC] Deprecate implicit non-integer-compatible float to int conversions

https://wiki.php.net/rfc/implicit-float-int-deprecate

PHP 8.1에서는 float가 int로 변환되고 소수 부분이 손실되면 E_DEPRECATED 알림이 발생합니다. 나중에 PHP 9.0에서는 TypeError가 발생합니다.

function acceptInt(int $i) {
var_dump($i);
}
acceptInt(3.1415);
> int(3) // Deprecation notice

George Peter Banyard와 함께 하는 🔈 PHP Internals News podcast #83에서 자세히 알아보세요.

✅ [RFC] Phasing out Serializable

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

PHP 8.1에서는 Serializable 인터페이스가 더 이상 사용되지 않습니다. 클래스가 오직 이 인터페이스만 사용하는 경우, 즉 클래스에 새로운 매직 메서드인 __serialize() 및 __unserialize()가 추가로 없는 경우 deprecation 알림이 발생합니다.

✅ [RFC] Namespaces in bundled PHP extensions

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

이것은 더 깨끗한 PHP를 향한 작은 발걸음입니다! Extension의 새로운 심볼(클래스, 인터페이스 등)은 이제 네임 스페이스를 사용해야합니다.

여기 예시가 있습니다. resource type은 PHP에서 사실상 더 이상 사용되지 않으며 기존의 모든 리소스가 천천히 object로 마이그레이션되고 있습니다. PHP 8.1에서 일부 리소스는 다음 네임 스페이스 클래스로 대체됩니다.

IMAPConnection -> IMAP\Connection
FTPConnection -> FTP\Connection
LDAP -> LDAP\Connection
LDAPResult -> LDAP\Result
LDAPResultEntry -> LDAP\ResultEntry
PgSql -> PgSql\Connection
PgSqlResult -> PgSql\Result
PgSqlLob -> PgSql\Lob

✅ [RFC] Add return type declarations for internal methods

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

PHP 8.0에 내장된 대부분의 메소드는 매개 변수를 받고 유형 선언을 반환합니다. 그러나 문제는 public non-final 메서드의 반환 값과 같이 사용자 코드에서 재정의 될 수 있는 경우입니다.

class SomeStandardClass
{
public function method(): int {}
}

class UserClass extends SomeStandardClass
{
public function method() {}
}

// Fatal error: Declaration of UserClass::method() must be compatible with SomeStandardClass::method()

공변(covariance) 규칙에 따라, 재정의된 메소드에 다른 반환 type을 추가할 수 있지만, 메소드 시그니처가 다르면 하위 호환이 깨집니다. PHP 프로젝트 리더들은 아직 큰 하위 호환 문제를 일으키지 않도록 장기적/점진적으로 마이그레이션을 할 수 있게 지원하기로 했습니다.

PHP 8.1에서 모든 내부 메서드는 누락된 type도 가져옵니다. 사용자 코드에서 재정의 된 경우 사용 중단 알림이 표시됩니다.

class MyDateTime extends DateTime
{
public function modify(string $modifier) { return false; }
}

// Deprecated: Declaration of MyDateTime::modify(string $modifier) should be compatible with DateTime::modify(string $modifier): DateTime|false

Release managers for PHP 8.1 have been selected

https://wiki.php.net/todo/php81#release_managers

이번 릴리스에서는 세 명의 release manager가 있습니다.
경험이 풍부한 Joe Watkins (pthreads, parallel, pcov)와 두 명의 신참 인 Patrick Allaert (blackfire.io) 및 Ben Ramsey (ramsey/uuid)의 세 명의 관리자가 있습니다. Ben과 Patrick이 함께 하는 PHP Internals News podcast #84를 확인하십시오.

New proposals for PHP 8.1:

[RFC] Partial Function Application

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

Partial Function Application은 일부 인수만 함수 호출에 바인딩되고 나머지 인수는 나중에 전달될 매개 변수로 남아있는 경우입니다.

예를 들어, 여기 전체 함수가 있습니다.

function whole($one, $two) {
/* ... */
}

이 전체 함수를 기초로 부분 함수가 있습니다.

$partial = whole(?, 2);

이제 이 부분 함수의 시그니처는 아래와 같습니다.

function($one) {
/* ... */
}

이게 왜 필요하죠?

첫째, 이제 모든 함수 또는 메서드에 대한 참조를 가져 와서 Callable이 예상되는 곳에 전달할 수 있습니다. 예를 들어 다음과 같이 할 수 있습니다.

array_map(Something::toString(?), [1, 2, 3]);
array_map(strval(?), [1, 2, 3]);

// 아래 코드 대신
array_map([Something::class, 'toString'], [1, 2, 3])
array_map('strval', [1, 2, 3]);

둘째, 결과적으로 파이프 연산자 |>를 구현할 수 있습니다.

$result = "Hello World"
|> htmlentities(?)
|> explode(?);

RFC 및 구현에 대해 Larry Garfield, Joe Watkins, Levi Morrison 및 Paul Crovella에게 감사드립니다.

[RFC] Property Accessors

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

Nikita는 속성 접근자의 구현을 완료했으며 현재 제안은 공식적으로 논의 중입니다.

결론은 기존의 getter 및 setter는 사용하기 편리하지 않으며 매직 메서드 __get 및 __set은 구체적이지 않다는 것입니다. 새로운 접근자는 이러한 문제를 해결하기위한 것입니다.

C#에서 영감을 얻은 문법:

class Foo {
public $prop {
get { /* ... */ }
set { /* ... */ }
}
}

이를 사용하여 읽기 전용 속성을 구현할 수 있습니다.

class User {
public string $name { get; }

public function __construct(string $name) {
$this->name = $name;
}
}

비대칭 액세스를 지정할 수 있습니다. 즉, 읽기 및 쓰기를 위해 별도로 공개 또는 비공개로 설정할 수 있습니다.

class User {
public string $name { get; private set; }

...
}

또는 유효성 검사 또는 기타 작업을 위한 완전히 구현된 메소드로 사용할 수 있습니다.

class Foo {
public int $bar {
get {
error_log('Getting $bar');
return $this->bar;
}
set {
assert($bar > 42);
$this->bar = $bar;
}
}
}

[RFC] Pure intersection types

https://wiki.php.net/rfc/pure-intersection-types

통합 유형은 PHP 8.0에 추가되었으며 이 RFC는 교차 유형 추가를 제안합니다.

구문은 TypeA & TypeB이며, 이는 변수가 TypeA 및 TypeB의 인스턴스여야 함을 의미합니다.

class A {
private Traversable&Countable $countableIterator;

public function setIterator(Traversable&Countable $countableIterator): void {
$this->countableIterator = $countableIterator;
}

public function getIterator(): Traversable&Countable {
return $this->countableIterator;
}
}

이 제안을 “순수 교차 type”이라고합니다. union type의 조합은 지원되지 않으며 향후 고려할 수 있도록 남아 있기 때문입니다. 복잡한 유형에 대한 별칭도 미래를 위해 남아 있습니다.

[RFC] Deprecate ticks

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

PHP에는 틱 매커니즘이 있습니다 : declare(ticks=1). 원래 pcntl 신호를 추적하는 데 필요했습니다. 이제 pcntl_signal() 및 pcntl_async_signals()를 대신 사용할 수 있습니다. 이것이 PHP 8.1에서 틱을 폐기하고 PHP 9에서 완전히 제거하라는 제안이 있었던 이유입니다.

[RFC] Final class constants

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

이 RFC의 작성자는 상수에 대한 final 수정자를 제안하므로 자식 클래스에서 재정의 할 수 없습니다.

class Foo
{
final public const X = "foo";
}

class Bar extends Foo
{
public const X = "bar";
}

// Fatal error: Bar::X cannot override final constant Foo::X

흥미로운 사실은 인터페이스 상수는 이미 final이라는 것입니다.

PHP 소스에 기여하고 싶은 사람들을위한 몇 가지 추가 링크

Using CLion with php-src

  • PHP 8.1의 릴리스 관리자 중 하나인 Ben Ramsey의 지침입니다.

How to compile PHP from source on Debian/Ubuntu

  • Beginner’s guide on PHP.Watch.

🛠 Tools

spatie/data-transfer-object v3

https://github.com/spatie/data-transfer-object

spatie가 PHP 8에서 type이 정의된 DTO를 쉽게 만들기 위한 패키지를 만들었습니다.

spatie/fork

https://github.com/spatie/fork

pcntl_fork를 위한 래퍼로 PHP 스크립트를 병렬로 간단하고 편리하게 실행할 수 있습니다. 이 블로그 게시물과 이 비디오에서 자세히 알아보십시오.

phpbench/phpbench 1.0.0

https://github.com/phpbench/phpbench/releases/tag/1.0.0

코드를 벤치마킹하는 데 유용한 도구입니다. 새 버전에는 PHP 8 지원을 포함하여 많은 업데이트가 있습니다.

Dan Leech와 함께 📺 Release Radar #10에서 더 알아보세요.

rybakit/phpunit-extras

https://github.com/rybakit/phpunit-extras

테스트를 더 깔끔하게 만들 PHPUnit을 위한 커스텀 annotation과 expect*() 메소드.

infection 0.23.0

https://infection.github.io/2021/05/13/whats-new-in-0.23.0/#Pest-Test-Framework-support

Mutation 테스트 지원 도구가 업데이트 됐습니다. 이제 pestphp/pest를 지원합니다.

captainhookphp/captainhook

https://github.com/captainhookphp/captainhook

PHP 프로젝트를 위한 Git hook 관리. 예를 들어, 스타일 검사를 쉽게 설정하거나 저장소로 푸시하기 전에 테스트를 실행할 수 있습니다.

0xABADCAFE/php-demo-engine

https://github.com/0xABADCAFE/php-demo-engine

재미로 만든 PHP의 데모씬 엔진. 콘솔에 ASCII 기호가있는 그래픽을 표시합니다.

demoscene sample graphic

Symfony

Laravel

Yii

PhpStorm

💡 기타 읽을 만한 글

Upgrading a Project to PHP 8.0

https://medium.com/oro-development/upgrade-to-php-8-64f770ae4479

PHP 7.4에서 8.0으로 업그레이드 할 때의 업데이트 계획 및 코드베이스를 주요 잠재적 어려움에 대한 설명.

작성자가 업그레이드 했던 코드는 Symfony 4.4 LTS, 300만 이상의 LoC, 60만 PHP class, test 코드 포함, vendor 제외.

결론

  • 오픈 소스 커뮤니티는 PHP 릴리스를 적극적으로 모니터링하고 새로운 버전의 PHP에 대한 지원을 라이브러리에 추가합니다.
  • composer.json에서 실제로 지원되는 PHP 버전 만 나열하면 composer가 기본 제공하는 종속성 분석기(composer why-not php 8) 덕분에 프로젝트에서 이런 라이브러리를 사용하는 개발자에게 큰 도움이됩니다.
  • PHPStorm은 코드 작성을위한 뛰어난 IDE 일뿐만 아니라 코드베이스를 최신 버전의 PHP로 마이그레이션하는 데 도움이되는 정적 코드 분석 도구를 제공합니다. (작성자는 전체 코드 혹은 특정 디렉토리를 기준으로 정적 분석 도구를 사용했고 PhpStorm이 가장 많이 도움이 됐다고 합니다)
  • 자동화 된 테스트를 통한 높은 적용 범위는 마이그레이션 프로세스를 크게 단순화합니다. (그럼요!)
  • 새로운 주요 버전의 PHP로 업그레이드하는 것은 언뜻보기에 그리 어렵지 않습니다. (설마요!)

Do not mock what you do not own

https://thephp.cc/articles/do-not-mock-what-you-do-not-own

소유하지 않은 것은 mocking하지 말 것. 대체된 종속성을 제어하지 않으면, 다른 것도 제어가 안 되기 시작할 겁니다.

Named-entity recognition in PHP

https://www.we-rc.com/blog/2021/04/04/named-entity-recognition-in-php

RubixML을 사용하여 간단한 ML 문제를 해결하는 예입니다.

Using exceptions and retries when working with network services.

https://blog.frankdejonge.nl/back-the-func-off/

실패를 수용하는 추상 레이어 디자인을 소개합니다.

controller같은 사용자 레이어에서 아래와 같은 코드는 DatabaseException 같은 구현 세부 사항을 알아야 하기 때문에 추상화 누출 사고가 납니다.

try {
$this->fleet->markUnavailable($command->carId());
} catch (DatabaseException $e) {
// handle exception
}

아래 코드처럼 뒤에 어떤 구현이 있는지 몰라도 이해할 수 있게 Exception을 대체하는 방식을 소개합니다.

final class UnableToMarkCarUnavailable extends RuntimeException
{
public function because(string $reason, Throwable $previous): self
{
return new self(
"Unable to mark car unavailable. $reason",
0,
$previous
);
}
}

그리고 HTTP 기반 API는 광범위한 네트워크 관련 문제에 노출되기 때문에, 서비스 재시도 매커니즘을 두어야 한다고 말합니다. 이때 재시도 매커니즘을 사용자 레이어 안에 배치할지 구현 레이어 안에 배치할 지는 각각 장단점이 있습니다. 점진적으로 간격을 늘려주는 back-off 전략이 필요하다면 eventsauce/backoff 패키지를 사용할 수도 있습니다.

Algorithmic complexity (big O notation) of built-in PHP functions.

https://stackoverflow.com/questions/2473989/list-of-big-o-for-php-functions/2484455#2484455

내장 PHP 함수의 알고리즘 복잡성 (big O 표기법).

몇 가지 흥미로운 점

  • isset / array_key_exists가 in_array / array_search 보다 훨씬 빠르다
  • +(union)이 array_merge보다 훨씬 빠르다(보기도 좋다). 물론 동작 방식은 다르지만.
  • shuffle은 array_rand와 동일한 Big-O tier에 존재한다.
  • array_pop / array_push는 array_shift / array_unshift 보다 빠르다. 재 인덱스 때문.

참고로 2010에 쓴 답변입니다.

https://blog.exussum.co.uk/licence.html

Packagist에서 가장 인기있는 패키지와 해당 라이선스 살펴보기. 많은 인기있는 패키지에는 라이선스가 없거나 잘못 설정되어 있습니다.

📺 Videos

Modern PHP with Rasmus Lerdorf

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

PHP의 아버지가 약간의 Etsy의 코드와 PHP 8에 대해 이야기합니다.

Videos from Derick Rethans on Xdebug 3

🔈 Podcasts

PHP Ugly podcast:
#236: – Memory Leaks.
#235: – Ugly Hot Tub PHP Coding.

PHP Release Radar:
Episode #9 – With Andreas Braun discussing Doctrine Cache 2.0.

PHP Internals News podcast:
Episode #82 – About auto-capturing multi-statement closures (RFC) with Larry Garfield and Nuno Maduro.
Episode #79 – About the new operator in initializers with Nikita Popov.

🙌 Community

PHP’s bus factor is 2

https://blog.krakjoe.ninja/2021/05/avoiding-busses.html

Joe Watkins는 PHP 소스에 대해 충분히 알고있는 사람은 두 사람뿐이므로 PHP에 새로운 기능을 추가 할 때이 점을 고려해야합니다. 그는 또한 코어에서 작업하는 더 많은 개발자가 필요하다고 말합니다.

Php_annotated 이미지

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

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


⚡️ News

PHP 8.0.3, PHP 7.4.16

https://www.php.net/ChangeLog-8.php#8.0.3
https://www.php.net/ChangeLog-7.php#7.4.16

지원되는 branch의 정규 버그 수정 업데이트입니다.

xdebug.cloud

https://xdebug.cloud/

Docker, Vagrant 또는 클라우드 서비스를 사용할 때와 같이 더 복잡한 네트워크 구성에서 PHP 애플리케이션의 디버깅을 단순화하는 것을 목표로하는 Xdebug 작성자의 새로운 유료 서비스입니다.

WordPress share exceeds 40% among the top 10 million sites

https://w3techs.com/technologies/overview/content_management

워드 프레스 점유율은 상위 1000 만 사이트 중 40%를 초과합니다. w3techs에서 통계를 뽑기 위해 사용하는 방법론역사적 추세에 대해 자세히 알아보십시오.

New PSR ClockInterface standard proposed for consideration

https://github.com/php-fig/fig-standards/pull/1224/files?short_path=bc896a1#diff-bc896a1185817987d25269d5ba746546487d954744deaf3d8ff608f9babc17df

인터페이스는 테스트에서 쉽게 모킹되는, 현재 시간을 가져오는 단일 방법이 필요합니다.

namespace Psr\Clock;

interface ClockInterface
{
/**
* Returns the current time as a DateTimeImmutable Object
*/
public function now(): \DateTimeImmutable;
}

PSR-11 Container Interface updates published

https://github.com/php-fig/container

다른 표준과 마찬가지로 두 가지 버전이 한 번에 출시되었습니다. 1.1은 매개 변수 유형을 추가하고 2.0은 반환 유형을 포함합니다.

Composer 1.x is no longer supported

https://blog.packagist.com/deprecating-composer-1-support/

2021년 5월부터 packagist.org의 이전 API에 대한 액세스가 제한됩니다.

🐘 PHP Internals

✅ [RFC] Enumerations

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

PHP 8.1에는 오랫동안 기다려온 열거형(enum)이 들어갑니다!

enum RfcStatus {
case Draft;
case UnderDiscussion;
case Accepted;
}

function setRfcStatus(RfcStatus $status) :void {
// ...
}

setRFCStatus(RfcStatus::Accepted); // Ок
setRFCStatus('Draft'); // TypeError

열거형 기능이 마음에 들면 RFC 작성자인 Ilija ToviloLarry Garfield를 후원 해주십시오.

Brent Roose의 글이나 php.watch에서 더 자세히 알아보세요.

Symfony는 이미 열거형 지원을 추가하기 위해 티켓을 열었습니다.

✅ [RFC] Deprecate passing null to non-nullable arguments of internal functions

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

현재 버전의 PHP에서 표준 함수는 매개 변수가 nullable하지 않은 경우에도 오류없이 인수로 null을 허용 할 수 있습니다.

이 불일치를 수정하기 위해 PHP 8.1에서 내장 함수는 Deprecation 알림을 표시하고 PHP 9에서는 TypeError를 발생시킵니다. 예를 들어, 3v4l.org/OVoa0A 이 예제에선,

<?php

str_contains("", null);
// > No errors

function _str_contains ( string $haystack , string $needle ) : bool
{
return true;
}

_str_contains("", null);

내장 함수 str_contains를 사용한 str_contains( "", null);와 같은 코드는 TypeError가 발생하지 않는데,
직접 구현한 _str_contains()함수는 TypeError가 발생합니다. PHP 9에서는 내장 함수에도 이 규칙이 동일하게 적용됩니다.

✅ [RFC] Array unpacking with string keys

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

배열 풀기는 문자열 키가 있는 배열을 포함하여 PHP 8.1에서 일관되게 작동합니다.

$array1 = ['a' => 'apple', 'p' => 'pear'];
$array2 = ['b' => 'banana', 'o' => 'orange'];
$array = [...$array1, ...$array2];
// The same as:
$array = array_merge($array1, $array2);

❌ [RFC] PHP\iterable\any() and all() on iterables

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

반복자(iterable)에 대한 any() 및 all() 함수를 추가하라는 제안이 투표를 통과하지 못했습니다.

❌ [RFC] var_representation() : readable alternative to var_export()

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

var_export에 대한 대안을 추가하려는 아이디어도 공감받지 못했으므로 지금은 비공식적인 대안인 brick/varexporter를 사용할 수 있습니다.

🗳 [RFC] Fibers

https://wiki.php.net/rfc/fibers#vote

Fibers에 대한 투표가 시작되었습니다. 요컨대, 비동기 PHP 코드를 더 쉽게 작성하기 위해 노력하는 generator에 작지만 중요한 개선입니다. 예를 들면 다음과 같습니다.

Amp(@asyncphp)의 트윗

Amp v3로 동시에 실행되는 두 개의 #fiber를 만드는 것은 이렇게 간단합니다. #PHP

<?php

use function Amp\{ async, await, delay };

await([
async(function () {
delay(1100);
echo "Later\n";
}),
async(function () {
delay(1000);
echo "First\n";
}),
]);

스케줄러가 RFC에서 제거되었으므로 Fiber API는 이제 최소한의 기능을 제공하며 Ruby의 유사한 기능과 닮았습니다.

Swoole 관리자(maintainer)의 제안에 대해 몇 가지 합리적인 논쟁이 있었습니다. krakjoe/parallel 확장의 저자인 Joe Watkins의 글도 마찬가지입니다.

아직까지 Fiber는 Swoole 또는 Parallel과 모순되지 않는, 비동기 기능으로 향하는 현실적인 단계에 있다고 보입니다.

2021-03-22까지 투표가 예정되어 있고, 현재 46:13으로 통과가 유력합니다.

🗳 [RFC] mysqli bind in execute

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

Kamil Tekiela는 mysqli를 개선하기 위한 이니셔티브를 계속합니다. 이 RFC는 mysqli_stmt::execute()에 새로운 선택적 매개 변수를 추가 할 것을 제안합니다. 현재는 참조로 전달된 변수만 허용하는 mysqli_stmt::bind_param()을 별도로 호출해야 합니다.

2021-03-27까지 투표가 예정되어 있고, 현재 26:0으로 통과가 유력합니다.

[RFC] New in initializers

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

현재 PHP 버전에서 속성, 매개 변수, 상수의 기본값과 같은 초기화 값은 상수 값만 가질 수 있습니다.

상수가 아닌 값이 필요한 경우 속성은 생성자에서 초기화 할 수 있으며 인수는 메서드의 본문에서 초기화 할 수 있습니다. 상수를 사용하면 그러한 옵션이 전혀 없습니다.

Nikita Popov는 객체를 속성, 매개 변수, 상수 및 정적 변수에 대한 기본값으로 사용할 수 있도록 제안합니다.

static $x = new Foo();

const C = new Foo();

class Bar
{
public const CONSTANT = new Foo();
public static Foo $staticProperty = new Foo();

#[Assert\All([new Assert\Uuid()])]
public array $uuids = [];

public function __construct(
private Logger $logger = new NullLogger()
) {}
}

function test($param = new Foo()) {}

현재 제안은 new 연산자로 제한되지만 구현을 통해 향후 다른 표현식에 대한 지원을 확장 할 수 있습니다.

추가 보너스(의도적이었을까요? 🤔)는 객체가 속성에 허용된다는 것입니다. 이는 중첩된 속성의 문제를 해결합니다.

[RFC] CachedIterable (rewindable, allows any key&repeating keys)

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

Tyson Andre는 캐싱 반복자(iterator)를 추가할 것을 제안합니다. 반복의 상태를 저장하고 내부적으로 키와 값의 변경 불가능한(immutable) 사본을 포함합니다.

[RFC] Namespaces in bundled PHP extensions

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

번들 PHP 확장에서 제공하는 모든 클래스와 함수는 현재 전역 네임 스페이스에 있습니다(한 가지 예외가 있음).

이 RFC는 번들 확장이 있는 네임 스페이스 사용에 대한 규칙을 제안합니다. 기본적으로 확장 이름은 네임 스페이스로 사용해야하며 PHP 접두사는 필요하지 않습니다. 예를 들어 OpenSSLCertificate는 OpenSSL\Certificate가 될 수 있습니다.

그러나 지금까지는 추가된 새 심볼에만 적용되며 기존 함수 및 클래스의 마이그레이션은이 RFC의 영향을 받지 않습니다. 그러나 아래 예는 가능한 미래의 변화를 보여줍니다.

str_contains() -> String\contains()
in_array() -> Array\contains().

[RFC] noreturn type

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

Psalm과 PHPStan의 저자는 noreturn이라는 새로운 유형을 PHP에 추가할 것을 제안합니다. 이것은 함수가 항상 exit(), die(), trigger_error()를 호출하는 등의 예외를 던지거나 실행을 종료함을 나타내는 유형입니다.

function redirect(string $uri): noreturn {
header('Location: ' . $uri);
exit();
}
function redirectToLoginPage(): noreturn {
redirect('/login');
}

Hack과 Python에도 비슷한 유형이 있으며 Psalm, PHPStan 및 PhpStorm에서도 attribute인 #[NoReturn] 또는 .phpstormmeta.php의 exitPoint()를 통해 사용되었습니다.

PhpStorm

Mastering PhpStorm

https://masteringphpstorm.com/

Christoph Rumpel의 비디오 코스!

PhpStorm 2021.1 EAP

https://blog.jetbrains.com/phpstorm/2021/03/phpstorm-2021-1-eap-6/

이 Early Access Program이 곧 종료됩니다. 이번 릴리스는 새로운 기능을 추가하는 대신 안정성과 성능에 중점을 둡니다. 그러나 새로운 inspection 및 quick-fix들, 에디터에서 HTML 및 PHP 미리보기, JSONPath 지원, 오디오 및 비디오 호출을 통한 페어링 프로그래밍 등을 시도 할 수 있습니다.

Setup Step Debugging in PHP with Xdebug 3, Docker Compose, and PhpStorm

https://matthewsetter.com/setup-step-debugging-php-xdebug3-docker/

🛠 Tools

spiral/RoadRunner v2.0.0

https://github.com/spiral/roadrunner/releases/tag/v2.0.0

Golang으로 작성된 PHP 어플리케이션 서버(Nginx+FPM 대용)의 첫 메이저 릴리스.

azjezz/psl

https://github.com/azjezz/psl

hhvm/hsl에서 영감을 얻은 PHP 용 표준 라이브러리.

renoki-co/php-k8s

https://github.com/renoki-co/php-k8s

이 패키지를 사용하면 PHP 내에서 Kubernetes 리소스를 관리 할 수 ​​있습니다.

Comparison of markdown libraries for PHP

https://php.watch/articles/php-markdown-libraries

아래 네 가지 markdown 라이브러리의 성능 벤치마크, 확장의 용이성, 다양한 기능 및 특성을 비교합니다.

phpize.online

https://phpize.online/

3v4l.org와 유사하지만 SQL을 지원하는 PHP 코드 공유 도구입니다.

Symfony

symfony/runtime

https://github.com/symfony/runtime

새로운 실험적 구성 요소는 애플리케이션을 전역 상태에서 분리하고 PHP-FPM, CLI, PHP-PM, Swoole 등에서 변경없이 실행할 수 있도록합니다.

symfony/panther 1.0

https://github.com/symfony/panther

E2E 테스트 및 스크래핑을 위한 Selenium WebDriver 기반의 Symfony component입니다.

In In Symfony 6, the minimum version of PHP will be 8.0

https://github.com/symfony/symfony/issues/40389

Symfony 6에서 PHP의 최소 버전은 8.0입니다.

Symfony packages are not tagged anymore

https://symfony.com/blog/symfony-packages-are-not-tagged-anymore-when-nothing-changes-between-versions

버전 간에 아무것도 변경되지 않으면 Symfony 패키지에 더는 태그가 지정되지 않습니다.

How to use the Symfony Lock component effectively

https://developer.happyr.com/symfony-lock-and-messenger-component

Messenger를 예로 들어 Symfony Lock 구성 요소를 효과적으로 사용하는 방법.

Laravel

Laravel Octane

https://twitter.com/LaraconOnline/status/1372250802882977792

Laracon Online에서 Taylor Otwell은 Swoole 또는 RoadRunner 위에 고성능 Laravel 어플리케이션을 실행하는 범용 패키지를 선보였습니다.

Testing HTTP middleware in Laravel

https://www.kai-sassnowski.com/post/testing-http-middleware-in-laravel/

라라벨에서 HTTP middleware를 테스트하기.

A thread with tips on Laravel performance

https://threadreaderapp.com/thread/1356292193032368128

100일 동안 라라벨 성능에 관한 팁을 올리는 트윗을 모아보실 수 있습니다.

글을 올리는 계정은 Enlightn인데, 성능과 보안을 높이는 패키지를 서비스하는 것 같습니다.

Enlightn은 Laravel 앱 코드를 스캔하여 성능, 보안 등을 개선하기위한 실행 가능한 권장 사항을 제공합니다.

RCE vulnerability in Laravel debug mode

https://www.ambionics.io/blog/laravel-debug-rce

file_get_contents / file_put_contents 및 수동 FTP 모드를 사용한 공격 방식 조사.

  • Laravel <= v8.4.2 debug mode: Remote code execution (CVE-2021-3129)
    문제는 facade/ignition component에 있었습니다.

Laravel 7 support has ended

https://laravelversions.com/

Laravel 7은 지원이 종료됐습니다. 그러나 Laravel 6는 LTS이며 2022년 9월까지 지원됩니다.

spatie/laravel-remote

https://github.com/spatie/laravel-remote

spatie/ssh를 사용하여 원격 서버에서 Artisan 명령을 실행합니다. Freek Van der Herten과 함께 이 📺 스트림에서 자세히 알아보세요. 그는 이 동영상에서 이 패키지를 처음부터 작성합니다.

Step-by-Step Guide to Building Your First Laravel Application

https://laravel-news.com/your-first-laravel-application

첫 번째 Laravel 애플리케이션 구축을 위한 단계별 가이드.

Yii

Yii news 2021, issue 1

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

Fresh releases of Yii 3 components

기타 읽을 만한 글

Complete guide to FFI in PHP

https://thephp.website/en/issue/php-ffi/

PHP FFI에 대한 완전한 가이드!

Character escape sequences and numeric notations in PHP

https://php.watch/articles/php-character-escape-sequences-numeric-notations

PHP의 문자 이스케이프 시퀀스 및 숫자 표기법.

Unit testing tips by examples in PHP

https://github.com/sarven/unit-testing-tips

PHP 예제로 보는 단위 테스트 팁.

When to use empty in PHP?

https://beberlei.de/2021/02/19/when_to_use_empty_in_php_i_say_never.html

언제 empty를 사용하는가?

Benjamin Eberlei는 결코 쓸 일이 없을 거라고 하네요.

PHP 8: Observability Baked Right In

https://www.datadoghq.com/blog/engineering/php-8-observability-baked-right-in/

Tracing 기능을 위한 내부(internal) API에 대한 기사입니다.

When Objects Are Not Enough

https://www.tonysm.com/when-objects-are-not-enough/

OOP에 대한 흥미로운 생각.

PHP benchmarks on arm64 vs x86_64

https://fraudmarc.com/arm64-vs-x86_64-for-php/

ARM을 사용하는 AWS는 20% 저렴하고 경우에 따라 더 빠릅니다.

Moving From Nginx+FPM to Swoole Has Increased Our PHP API Performance by 91%

https://eldadfux.medium.com/moving-from-nginx-fpm-to-swoole-has-increased-our-php-api-performance-by-91-40f62e51a064

Nginx + FPM에서 Swoole로 이동하여 PHP API 성능이 91% 향상되었다고 합니다. appwrite/appwrite 사용에 관한 이야기입니다.

Appwrite is an end-to-end backend server for Web, Mobile, Native, or Backend apps packaged as a set of Docker microservices.

How Laminas CI automation works

https://mwop.net/blog/2021-03-12-laminas-ci.html

Laminas CI 자동화 작동 방식 – 200개 이상의 패키지를 지원하고 테스트하고 릴리스하는 GitHub Actions에 관한 이야기입니다.

📺 Videos

🔈 Podcasts

php[architect] podcast #50

https://www.phparch.com/podcast/mezzio-framework-functional-programming-software-dependency-security/

Mezzio 프레임 워크, 함수형 프로그래밍 및 소프트웨어 종속성 보안에 대해 논의했습니다.

PHP Ugly podcast

https://phpugly.simplecast.com/

  • #227: – Math is Hard.
  • #226: – Help Wanted, PHP Release Manager.

PHP Internals News podcast

https://phpinternals.news/

  • #75 – With Nikita Popov on deprecating null, array unpacking, restrict globals usage, and phase out serializable.
  • #76 – Another one with Nikita Popov about restricting the use of globals, and phasing out serializable.
  • #77 – With David Gebler about the fsync() function added to PHP 8.1.
  • #78 – With Andreas Heigl on moving PHP documentation to Git.

Php_annotated 이미지

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

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


⚡️ News

PHP 8.0.2, 7.4.15, 7.3.27

https://www.php.net/ChangeLog-8.php#8.0.2
https://www.php.net/ChangeLog-7.php#7.4.15
https://www.php.net/ChangeLog-7.php#7.3.27

8.0과 7.4는 SoapClient에 관한 보안 수정 사항을 포함한 다양한 버그 수정이 있었습니다. 7.3 branch에는 보안 수정 사항만 반영되었습니다.

7.2와 이전 버전의 PHP는 더이상 지원받을 수 없습니다. 이전 버전을 사용하고 계시다면 PHP 7.4로 업그레이드 하는 걸 고려해보세요.

PHP-FIG published updates for PSR-6 and PSR-13 standards.

PHP-FIG가 PSR-6PSR-13 표준의 업데이트를 게시했습니다.

PSR 진화 계획(PSR evolution plan)에 정의된 것처럼 두가지의 새로운 버전을 받았습니다.
두 경우 모두 첫 번째 버전은 인수에 유형을 추가하고 두 번째 버전은 이를 반환 값에 추가합니다. 업데이트에는 union type을 사용하거나 return type에 static을 쓰기 때문에 PHP 8 이상이 필요합니다.

PHP-FIG @phpfig의 트윗

두 경우 모두 첫 번째 릴리스는 인수에 유형을 추가하고 두 번째 릴리스는 반환 유형을 추가합니다.
이는 상속과 Liskov의 원칙 제약의 조합으로 인해 최종 사용자가 모든 것을 한 번에 지원하도록 구현하기 불가능하게 합니다.

이 PSR의 사용자라면, 먼저 기존 버전과 함께 신규 두 버전 중 첫번째 버전을 바로 지원할 수 있고, 이후에 새로운 두 버전을 지원하도록 바꿀 수 있습니다. 예를 들어:

psr/link:^1.0 (now, 1.1 already compatible!)
psr/link:^1.1|^2.0 (then)

psr/cache: ^1.0 (now)
psr/cache: ^1.0|^2.0
psr/cache: ^2.0|^3.0

PhpStorm 2021.1 Early Access Program has started

https://blog.jetbrains.com/phpstorm/2021/02/phpstorm-2021-1-eap-2/

다가올 업데이트의 새로운 기능을 먼저 경험해보세요.

  • PHP 설정이 이제 최상위로 올라왔습니다.
  • 새로운 quick-fix: “Invert ‘if’ statement”
    • if문에서 “Invert ‘if’ statement” 옵션을 선택하면 조건문을 반대로 바꾸어 줍니다
  • http:// 링크에 not safe하다는 highlight와 https://로의 quick-fix 제공
  • Split view에서 탭 더블클릭으로 에디터를 최대화
  • bugfix : Debugging WSL2 projects with Docker (WI-53396 +86)

Developer Ecosystem Survey 2021 from JetBrains

https://surveys.jetbrains.com/s3/developer-ecosystem-survey-2021-sh

JetBrains의 2021년 개발자 Ecosystem 설문조사가 진행 중입니다. 조금 길지만 PHP section이 포함되어 있습니다. 몇 가지 PHP 인사이트를 추가로 보려면 작년 결과도 확인해보세요.

part-of-devecosystem-2020-php-image

🐘 PHP Internals

[RFC] Object keys in arrays

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

Nikita Popov는 객체를 일반 배열의 키로 사용할 수 있도록 제안합니다.

$obj1 = new stdClass;
$obj2 = new stdClass;

$array = [];
$array[$obj1] = 1;
$array[$obj2] = 2;

var_dump($array[$obj1]); // int(1)
var_dump($array[$obj2]); // int(2)

이렇게 제안하는 이유는 열거형(Enumerations) RFC에서 enum의 값이 객체이기 때문입니다. 따라서 이들을 배열의 키로 사용할 수 없습니다.

그러나 배열을 받아들이는 모든 함수는 정수 또는 문자열 키를 기대하기 때문에 이러한 변경은 중요합니다.

[RFC] Object scoped RNG Implementations

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

의사 난수를 생성하기 위한 rand() 및 mt_rand() 함수는 동일한 시드 값 srand()에 대해 동일한 시퀀스를 생성합니다. 그러나 그들은 전역 상태를 사용합니다. 즉, 서로 다른 시드 값을 가진 여러 생성기를 만들어 동시에 사용할 수 없습니다.

Go Kudo는 전역 상태 문제를 해결하기 위해 의사 난수 시퀀스 생성기와 함께 작동하는 객체 API를 추가 할 것을 제안합니다.

$seed = 1234;
$rng = new RNG\MT19937($seed);
$array = [1, 2, 3, 4, 5];

shuffle($array, $rng);

[RFC] Change Default mysqli Error Mode

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

mysqli 개선 이니셔티브의 일환으로 이 RFC는 “오류에 대한 예외 발생 모드”를 default로 하는 첫 번째 단계를 제안합니다. 현재 이 결과는 다음과 같이 실행함으로 얻을 수 있습니다:

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

mysqli를 사용하는 주요 오픈 소스로는 CodeIgniter, WordPress, phpMyAdmin 등이 있습니다.

Inheritance Cache

https://externals.io/message/113091

Dmitry Stogov는 상속 캐싱을 구현하는 pull request를 제시했습니다.

캐시는 Symfony “Hello World” 애플리케이션의 성능을 8% 향상시킵니다. 그리고 그 결과를 얻기 위해 아무것도 할 필요가 없습니다. PHP 버전을 업데이트하고 opcached가 활성화되어 있는지 확인하십시오.

PHP 클래스는 각각 컴파일되고 (opcache에 의해) 캐시되는데, “연결(linking)”은 매 request마다 run-time에 수행되었습니다.

상속 캐시는 모든 종속 클래스(부모, 인터페이스, trait, property type, 호환성 검사에 관계하는 method type)의 고유한 집합에 대해 한 번 “연결(linking)”을 수행하고 결과를 opcache 공유 메모리에 저장합니다.
이 패치의 일환으로 불변 클래스(unresolved 상수, typed property 및 공변 타입 검사)에 대한 제한을 제거했습니다. 따라서 이제 opcache에 저장된 모든 클래스는 “불변”합니다.
필요하다면 프로세스 메모리에 지연 로드 될 수 있습니다만 일반적으로 한 번만 발생합니다(첫 번째 연결시).

[RFC] Property Accessors (early draft)

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

Nikita는 각 속성에 대해 별도의 getter/setter 접근자를 제공하는 제안 초안을 만들었습니다.

이 RFC는 몇 가지 기능을 추가 할 것을 제안합니다.

비대칭적인 액세스 수정자를 선언하는 기능:

class User {
public string $name { get; private set; }
// или вот так (또는 이렇게)
public string $prop { public get; private set; }
}

read-only properties 선언:

class Test {
// Read-write property.
public $prop { get; set; } // the same as `public $prop;`

// Read-only property.
public $prop { get; }
}

guard라는 키워드로 유효성 검사를 추가하는 기능:

class User {
public string $name {
guard {
if (strlen($value) === 0) {
throw new ValueError("Name must be non-empty");
}
}
}
}

2013년에 PHP 5.5에 대해 비슷한 제안이 논의되었지만, 투표에서 실패했습니다.

현재로서는 아직 내부에서 논의되지 않은 아주 초반의 draft이므로 공식 발표를 기다려보면 좋겠습니다.

🗳 [RFC] var_representation() : readable alternative to var_export()

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

var_export() 함수는 오랫동안 불만의 대상이었습니다. 적어도 배열 구문을 array()에서 []로 변경하라는 제안이 있는 RFC 있었습니다.

이제 var_export()의 결함을 수정하는 새로운 함수를 간단히 소개하는 제안이 올라왔습니다.

var_representation($value, int $flags=0) :string

이 글을 뒤늦게 번역하는 2월 27일 시점에는 이미 투표가 끝났고, 최종 결과는 9:10으로 거절(Declined) 상태가 됐습니다.

🗳 [RFC] Enumerations

  • 사실은 ✅ [RFC] Enumerations

https://wiki.php.net/rfc/enumerations#voting

열거형(Enumerations)에 대한 투표가 진행되고 있고, 매우 유망하다는 소식을 번역하는 시점이 너무 늦다보니… 이미 투표에서 44:7로 통과 되었고, 8.1 버전에 반영될 예정입니다.

✅ [RFC] Array unpacking with string keys

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

문자열 키를 가진 배열을 분해하는 방식에 관한 제안이 통과되었습니다. 8.1 버전에 반영될 예정입니다.

❌ [RFC] Dump results of expressions in php -a

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

거절(Declined) 됐습니다.

New in PHP 8.1

https://stitcher.io/blog/new-in-php-81

Brent Roose의 변경 사항이 생기면 업데이트 되는, PHP 8.1의 새로운 기능에 대한 개요입니다. 더 자세한 정보를 원하시면 php.watch에서 변경 사항 목록을 확인하십시오.

PHP RFC Watch에서 새로운 RFC 및 투표를 팔로우 할 수도 있습니다.

🛠 Tools

fabpot/local-php-security-checker

https://github.com/fabpot/local-php-security-checker

알려진 취약성이 있는 의존성이 있는지 composer.json을 확인합니다. FriendsOfPHP/security-advisories가 취약성 데이터베이스로 사용됩니다.

funivan/PhpClean

https://github.com/funivan/PhpClean

모든 곳에 유형을 선언하고, 불필요한 주석이 없고, 상속 대신 합성(composition)을 사용하는 등 흥미로운 inspection을 많이 추가한 PhpStorm 용 플러그인. 이 소개글로부터 더 자세히 알아보세요.

wasmerio/wasmer-php

https://github.com/wasmerio/wasmer-php

PHP 용 WebAssembly 런타임. 확장을 사용하면 PHP에서 wasm 바이너리를 실행하고 사용할 수 있습니다. 예를 들어 Rust 라이브러리를 가져와 Wasm으로 컴파일하고 Composer 패키지처럼 PHP의 모든 플랫폼에서 사용할 수 있습니다. 성능도 꽤 좋습니다. 이 블로그 게시글에서 이에 대해 자세히 알아볼 수 있습니다.

temporalio/sdk-php

https://github.com/temporalio/sdk-php

진행중인 작업임에도 불구하고, Uber에서 사용하는 이벤트 소싱 엔진인 temporal.io를 위한 매우 흥미로운 PHP-SDK입니다.

다음은 누적(cumulative) 트랜잭션의 예입니다.

#[Workflow\WorkflowInterface]
class LoopWorkflow
{
private array $values = [];
private array $result = [];
private $simple;

public function __construct()
{
$this->simple = Workflow::newActivityStub(
SimpleActivity::class,
ActivityOptions::new()->withStartToCloseTimeout(5)
);
}

#[SignalMethod]
public function addValue(
string $value
) {
$this->values[] = $value;
}

#[WorkflowMethod(name: 'LoopWorkflow')]
public function run(
int $count
) {
while (true) {
yield Workflow::await(fn() => $this->values !== []);
$value = array_shift($this->values);

$this->result[] = yield $this->simple->echo($value);

if (count($this->result) === $count) {
break;
}
}

return $this->result;
}
}

여기선 RoadRunnerreactphp/promise를 사용합니다.

vimeo/php-mysql-engine

https://github.com/vimeo/php-mysql-engine

순수 PHP로 구현한 MySQL 쿼리 시뮬레이터 (엔진). 이 도구에 대한 게시글에서 Matt Brown은 이 엔진을 구현하여 Vimeo에서 테스트를 두 배 빠르게 실행하는 방법에 대해 이야기합니다.

cweagans/composer-patches

https://github.com/cweagans/composer-patches

의존하는 대상에 패치를 적용할 수 있는 Composer 용 플러그인입니다. 이는 변경 사항이 너무 구체적이고 패키지/프레임워크에 대한 완전한 PR을 보내긴 적절하진 않고, 포크를 유지하고 싶지도 않은 경우에 유용합니다.

Symfony

chaos-php/chaos-monkey-symfony-bundle

https://github.com/chaos-php/chaos-monkey-symfony-bundle

Symfony 앱 용 Chaos Monkey 같은 라이브러리. 응용 프로그램의 안정성을 테스트하기 위해 모든 종류의 극한 상황을 재현합니다.

A week of Symfony #736 (February 1-7 2021)

https://symfony.com/blog/a-week-of-symfony-736-1-7-february-2021

Elasticsearch – the right way in Symfony.

https://jolicode.com/blog/elasticsearch-the-right-way-in-symfony

Symfony에서 Elasticsearch를 제대로 쓰기

Laravel

Laravel adds parallel testing capabilities

https://blog.laravel.com/laravel-parallel-testing-is-now-available

Laravel v8.25부터 paratestphp/paratest 기반의 병렬 테스트 기능을 추가합니다. 병렬로 실행되도록 테스트를 조정하는 방법에 대한 이 블로그 게시물을 읽어보세요.

Laravel: New Release Schedule

https://blog.laravel.com/updates-to-laravels-versioning-policy

이제 메이저 버전이 6개월 마다가 아니라 1년에 한 번 릴리스 됩니다. 일정은 laravelversions.com에서 확인할 수 있습니다.

📺 Building a multi-domain multi-tenant SaaS app with JetStream

https://www.youtube.com/watch?v=5CjWPU7lns4

by Julien Bourdeau.

📺 Laravel Worldwide Meetup #5

Yii

New components of the upcoming Yii 3

기타 읽을 만한 글

Getting started with mutation testing

https://johnbraun.blog/posts/mutation-testing

Maks RafalkoInfection PHP를 사용하여 Mutation Test를 하는 방법을 설명합니다.

Mutation Testing은 기존 테스트 스위트에 대해 실행되는 소스 코드에서 돌연변이를 생성합니다. 이러한 테스트 중 어느 것도 실패하지 않으면 이 소스 코드(변이)가 약하게 테스트되었다는 신호입니다.

Colliding PHP arrays

https://sorin.live/colliding-php-arrays/

PHP의 배열이 DoS 공격을 수행하는 해시 테이블이라는 사실을 이용하는 방법에 대한 흥미로운 게시물입니다.

PHP의 배열은 사실 내부적으로는 해시 맵으로 구현되어 있고, 그 구현 방식이 해싱 충돌에 의한 서비스 거부(collision denial of service) 공격에 취약하다는 사실은 오래된 뉴스이고 많은 프로그래밍 언어에서 공통적으로 발견됩니다.
이 글은 이 원리를 설명하며 $_POST, $_GET and $_COOKIE를 통한 공격과 이를 방지하기 위한 max_input_vars 설정까지 설명합니다.

2011년에 Nikita가 쓴 PHP 배열에 2 ^ 16 = 65536 값을 삽입하는 데 예상되는 0.01 초 대신 30 초가 걸리는 방법에 대한 유사한 게시물을 기초로 작성했습니다.

php.watch: PHP Curl Security Hardening

https://php.watch/articles/php-curl-security-hardening

이 글 PHP에서 cURL을 사용할 때 안전하지 않을 수 있는 장소를 식별하고 자신을 보호하는 방법에 대해 설명합니다.

Summary

  • Limit Curl Protocols
  • Do not enable automatic redirects unless absolutely necessary
  • If redirects are enabled enabled, limit allowed protocols (if different from #1 above)
  • If redirects are enabled, set a strict limit
  • Set a strict time-out
  • Do not disable certification validation, or enforce it
  • Disable insecure SSL and TLS versions

Build a Telegram bot in PHP

https://pretzelhands.com/posts/build-a-telegram-bot-in-php

PHP로 Telegram 봇을 빌드하고 beyondcode/expose를 사용하여 로컬에서 테스트합니다.

How to build a dynamic GitHub profile

https://hackernoon.com/how-to-build-a-dynamic-github-profile-with-github-actions-and-php-h5g34cr

GitHub Actions와 PHP로 동적으로 GitHub profile을 만드는 법.

Webshell was hidden in an infected PHP script in whitespace characters

https://blog.sucuri.net/2021/02/whitespace-steganography-conceals-web-shell-in-php-malware.html

Webshell은 감염된 PHP 스크립트에 공백 문자로 숨겨져 있습니다. 감염된 서버에서 발견된 백도어 분석.

Contract Tests

https://www.kai-sassnowski.com/post/contract-tests/

인터페이스의 모든 구현에서 일관된 동작을 보장하기 위해 테스트를 작성하는 방법.

Benchmarks of different frameworks and CMSs with PHP 5.6, 7.*, and 8.0

https://kinsta.com/blog/php-benchmarks/

PHP 5.6, 7.* 및 8.0을 사용하는 다양한 프레임워크 및 CMS의 벤치마크.

📺 Videos

8 Things You’ll ❤️ About PHP 8

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

by Gary Clarke.

Xdebug 3: Diagnostics

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

Xdebug가 동작하지 않을 때 해야할 것

Refactoring PHP Platform – LiveStream #3

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

from Christoph Rumpel.

How to use the terminal in PhpStorm by Christoph Rumpel.

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

PhpStorm에서 터미널 사용하기.
Christoph가 진행할 다른 강의도 확인해보세요: Mastering PhpStorm.

Live-coding a Bref Queue

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

Bref의 저자인 Matthieu Napoli가 AWS Lambda에서 PHP로 SQS와 EventBridge를 활용한 “Bref Messaging” 라이브러리를 소개합니다.

Creating generative art with PHP

https://www.youtube.com/watch?v=-qi4OCC7oOM

PHP로 예술 작품을 만들면서 Blackfire.io로 프로파일링하기.

PHP Release Radar:

  • Episode 2: PHP 8 – Sara Golemon과 Gabriel Caruso가 8.0, PHP 확장의 기본 사항 및 프로젝트에 참여하는 다양한 방법에 대해 논의합니다.
  • Episode 3: Psalm 4 – Psalm의 저자인 Matt Brown와 함께.
  • Episode 4: XDebug 3 – Derick Rethans과 함께.

🔈 Podcasts

PHP Ugly podcast:

  • #222: – PHP Security Tools.
  • #221: – The PHP Big Short.

PHP Internals News podcast:

0%