ha-ah

로그, 게으른 로그

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:

Php_annotated 이미지

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

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


⚡️ News

PHP 8.0.1, 7.4.14, 7.3.26

https://www.php.net/ChangeLog-8.php#8.0.1
https://www.php.net/ChangeLog-7.php#7.4.14
https://www.php.net/ChangeLog-7.php#7.3.26

url_parse()에 있던 취약점 CVE-2020-7071를 수정한 버전입니다. 8.0과 7.4는 또한 많은 수정 사항이 있지만, 7.3은 이제 보안 관련 수정 만 제공됩니다(security-fixes-only).

github.com/php/doc-base

https://github.com/php/doc-base

모든 PHP 문서가 Git으로 옮겨왔습니다 : github.com/php/doc-base

PhpStorm 2020.3

https://blog.jetbrains.com/phpstorm/2020/12/phpstorm-2020-3-release/

여러분이 놓쳤을까봐 이야기 하는데, PHP 8, PHPStan, Psalm, Xdebug 3, Tailwind CSS, 그리고 pair programming을 지원하는 새로운 PhpStorm이 출시 됐습니다.

저(번역자)는 재택 근무 시 팀원들과 같이 코드볼 때 가끔 사용하는데 (화면 공유에 비해서) 정말 편합니다.

PHP Versions Stats – 2020.2

https://blog.packagist.com/php-versions-stats-2020-2-edition/

Packagist.org에 연결할 때 Composer가 보내는 데이터를 기반으로 한 전통적인 통계 모음.

  • PHP 7.4: 42.61% (+22.55)
  • PHP 7.3: 27.05% (-3.00)
  • PHP 7.2: 15.28% (-12.21)
  • PHP 7.1: 7.45% (-4.1)
  • PHP 5.6: 2.71% (-2.28)
  • PHP 7.0: 2.70% (-1.30)

The Online PHP Conference 2021

https://thephp.cc/dates/2021/01/the-online-php-conference

1월 18일 ~ 22일 - 라인업을 확인해보세요. 아직 티켓을 살 수 있습니다!

🐘 PHP Internals

✅ [RFC] Restrict $GLOBALS usage

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

$GLOBALS를 제한하는 RFC가 만장일치로 통과했습니다. 8.1부터 적용되며 읽고, 쓰고, isset/unset을 호출하는 것은 가능합니다.

$GLOBALS['x'] = 1;

echo $GLOBALS['x'];

isset($GLOBALS['x']);
unset($GLOBALS['x']);

하지만 $GLOBALS 자체를 변경하는 건 에러를 발생시킵니다.

$GLOBALS = [];
$GLOBALS =& $x;
$x =& $GLOBALS;
unset($GLOBALS);

$GLOBALS를 function by reference로 전달해도 에러가 발생합니다.

asort($GLOBALS);
// > Compile-time error

The implementation of this RFC simplifies the internals of PHP and improves the performance of array operations.
이 RFC의 구현으로 PHP 내부를 단순화하고 배열 조작/작업 성능을 높일 수 있습니다.

RFC의 소개글:

$GLOBALS 변수는 현재 PHP의 내부 기호 테이블에 대한 직접 참조를 제공합니다. 이를 지원하려면 상당한 기술적 복잡성이 필요하고 PHP의 모든 어레이 작업 성능에 영향을 주지만 거의 사용되지 않습니다. 이 RFC는 $GLOBALS의 지원되는 사용을 제한하여 대부분의 코드가 그대로 작동하도록 허용하면서 문제가 있는 경우를 허용하지 않습니다.

[RFC] Enumerations

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

Ilija Tovilo와 Larry Garfield는 다른 언어에서 enum이 어떻게 구현되었는지 연구했고, Swift, Rust, Kotlin의 영감을 얻어 RFC를 제안했습니다.

Enum은 본질적으로 키워드 enum 및 case로 선언 된 Type입니다.

enum Suit {
case Hearts;
case Diamonds;
case Clubs;
case Spades;
}

값 중 하나를 변수에 할당하거나 인수로 전달할 수 있습니다.

$val = Suit::Diamonds;

function pick_a_card(Suit $suit) { ... }

pick_a_card($val); // OK
pick_a_card(Suit::Clubs); // OK
pick_a_card('Spades'); // TypeError

Enum은 singleton 객체처럼 동작합니다.

$a = Suit::Spades;
$b = Suit::Spades;

$a === $b; // true

$a instanceof Suit; // true

Scalar Enum을 선언할 수도 있습니다. Scalar 값이 예상되는 컨텍스트에서 투명하게 사용할 수 있습니다.

enum Suit: string {
case Hearts = 'H';
case Diamonds = 'D';
case Clubs = 'C';
case Spades = 'S';
}<br/>
echo "I hope I draw a " . Suit::Spades;
// prints "I hope I draw a S".

$a instanceof Suit::Spades; // true
Enum은 method(static 포함), property, 상수를 포함할 수 있습니다.

enum UserStatus: string {
case Pending = 'pending';
case Active = 'active';
case Suspended = 'suspended';
case CanceledByUser = 'canceled';
public function label(): string {
return match($this) {
UserStatus::Pending => 'Pending',
UserStatus::Active => 'Active',
UserStatus::Suspended => 'Suspended',
UserStatus::CanceledByUser => 'Canceled by user',
};
}
}
foreach (UserStatus::cases() as $key => $val) {
printf('<option value="%s">%s</option>\n', $key, $val->label());
}
  • Enum이나 UnitEnum interface 구현체는 cases()라는 static method를 포함하는데, 선언된 순서에 따른 Case의 목록을 리턴합니다.

특정 case에 Enum method를 포함할 수 있지만, 각 case는 그들만의 method나 상수를 가질 수 없습니다. name이나 value와 같은 특별한 property를 갖고 있지만, 각 case는 단순히 값일 뿐입니다.

Enum은 serialize될 수도 있습니다.

Suit::Hearts === unserialize(serialize(Suit::Hearts));

여기까지 주요 특징만 살펴봤는데, 전체 RFC를 더 읽어보세요.

[RFC] Fibers

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

비동기 PHP에 대한 거대한 RFC가 올라왔습니다. 기본적으로 fiber는 자체 stack이 있는 함수이므로 언제든지 중지하고 다시 시작할 수 있습니다. 이는 우리가 ReactPHP / Amp와 같은 라이브러리 기반의 비동기 코드를 훨씬 단순하고 직관적으로 작성하게 해줍니다.

reddit에 올라온 글에서 trowski2002의 댓글:

Fiber API를 사용하면 Go와 유사한 API를 사용자 공간에 작성할 수 있습니다. 이 스타일에 접근하는 데는 몇 가지 다른 방법이 있습니다. 이것이 RFC가 이를 가능하게 하는 최소한의 요구사항만 코어에 제공하고, 의견이 분분한 부분은 사용자 공간에 남기는 이유입니다.

ReactPHP를 개발하는 Cees-Jan Kiewiet(@WyriHaximus)의 트윗

우린 이 긴 목록에 관심이 정말 많고, ext-fibers를 이번 휴가 때 확인해보려고 합니다. @_trowski가 만든 훌륭한 react-fiber도 함께.

이에 대한 Aaron Piotrowski(@_trowski)의 답변

ReactPHP는 ext-fiber에 의해 절대적으로 쓸모가 없어졌습니다. Fiber는 기존의 동기 코드에 더 쉽게 통합 할 수 있기 때문에 사람들에게 ReactPHP를 사용하는 이유보다 많은 것을 제공할 것입니다. 나는 모호함 없이 비동기 PHP가 보편화되기를 고대하고 있습니다.

Amp v3는 여전히 개발 중입니다. 하지만 이미 promise 대신 fiber를 사용하고 있습니다. 다음은 async/await 구문이 어떻게 보이는지에 대한 예입니다.

use Amp\Delayed;
use Amp\Loop;
use function Amp\async;
use function Amp\await;

//클로저는 Promise 또는 Generator가 아닌 반환 유형으로 int를 선언하지만 코 루틴처럼 실행됩니다.
$callback = function (int $id): int {
return await(new Delayed(1000, $id)); // Await promise resolution.
};

// $callback을 호출하면 int가 반환되지만 비동기 적으로 실행됩니다.
$result = $callback(1); // 이 green thread 내에서 서브 루틴을 호출하여 리턴하는 데 1 초가 걸립니다.
\var_dump($result);

// 두 개의 새로운 green thread를 동시에 실행하고 이 green thread에서 해결을 기다립니다.
$result = await([ // 동시에 실행하면 대기하는 동안 1 초만 경과합니다.
async($callback, 2),
async($callback, 3),
]);
\var_dump($result); // 전체 스크립트가 시작된 후 2 초 내에 실행됩니다.

[RFC] #[Deprecated] Attribute

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

PHP 8은 attribute에 대해 내부 hooking을 위한 지원을 추가했지만, 실제 사용할 수 있는 속성은 없었습니다. 공식적으로 제안 된 첫 번째 Attribute는 쓸모없는 메소드와 기능을 표시하기 위한 #[Deprecated]입니다. #[Deprecated]가 표시된 함수나 메소드를 호출하면 PHP는 E_DEPRECATED 에러를 throw합니다.
유사하지만 약간 더 고급 속성이 이미 PhpStorm 2020.3에 있습니다. 그러나 native 속성이 이미 final로 선언되었기 때문에, 이와 호환하기 위한 좋은 방법을 찾지 못해 PhpStorm에서 이 기능을 제거할 것을 고려하고 있습니다.

[RFC] #[NamedParameterAlias] Attribute

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

PHP 8.1을 위한 또 하나의 attribute 아이디어입니다.

명명된 인수(named arguments)에 대해 토론하고 투표하는 동안 매우 논쟁의 여지가 있는 점이 하나 있었습니다. 바로 이름 바꾸기의 하위 호환성 문제였습니다. OSS 관리자는 매개 변수 이름이 이제 API의 일부가 되며 쉽게 변경할 수 없다고 지적했습니다.

이 주제에 대한 별도의 RFC도있었습니다: Named Parameters explicit opt-in

이제 좀 더 간단한 솔루션이 있습니다. 매개 변수에 속성을 추가하여 별칭, 즉 매개 변수의 대체 이름을 지정합니다.

<?php
use NamedParameterAlias;

// Old function signature:
function log($arg1) {}

// New function signature introduces better name
function log(#[NamedParameterAlias("arg1")] $message) {}

log(arg1: "Hello World!");
log(message: "Hello World!");

[PR] Add support for property initialization during cloning

https://github.com/php/php-src/pull/6538

이 pull request는 변경 불가능한 객체 복제를 위한 구문 개선을 제공합니다.

현재:

{
$self = clone $this;
$self->bar = $bar;
$self->baz = $baz;<br/>

return $self;
}

제안:

{
return clone $this with {
bar: $bar,
baz: $baz,
};
}

[RFC] Add array_is_list(array $array): bool

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

연속적인 정수 키가 있는 배열을 전달하면 참을 반환하는 함수를 추가 할지 투표가 시작되었습니다(2021-01-06 ~ 2021-01-20).

[RFC] Short match

https://wiki.php.net/rfc/short-match

match 구문을 더 짧게!

[RFC] Concepts to improve mysqli extension

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

mysqli extension 개선을 위한 제안.

[RFC] Array unpacking with string keys

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

spread_operator_for_array에서 문자열 키를 배열로 풀 수 있도록 제안.

[PR] Use ‘ENT_QUOTES|ENT_SUBSTITUTE’ for HTML encoding and decoding functions

https://github.com/php/php-src/pull/6583

HTML encoding/decoding 함수에 ENT_QUOTES|ENT_SUBSTITUTE 옵션을 사용하도록 변경하자는 제안

PHP 8.1 received super fast hashing algorithms: xxHash and MurmurHash3.

PHP 8.1에서 엄청 빠른 해싱 알고리즘인 xxHashMurmurHash3를 받아들였습니다.

🛠 Tools

💵 Dump Debugging Evolved – Ray

https://freek.dev/1868-introducing-ray-a-debugging-tool-for-pragmatic-developers

Spatie에서 Ray라는 디버깅 앱을 발표했습니다. PHP 스크립트를 실행하는 중에 ray($anything)와 같이 호출하면, 별도의 데스크탑 어플리케이션에서 멋지게 표시됩니다. Xdebug보다 dump-and-die 방식을 선호하는 경우 시도해보십시오.

자세한 건 📺 video overview에서 확인해보세요.

vimeo/php-mysql-engine

https://github.com/vimeo/php-mysql-engine

순수 PHP로 만들어진 이 MySQL 엔진은 테스트 할 때 데이터베이스에 액세스하고 메모리에서 MySQL을 에뮬레이션하여 테스트 시작 속도를 높이고자 할 때 유용할 수 있습니다. 이 라이브러리는 PDO를 상속하여 일반적인 PDO의 MySQL 메소드를 사용할 수 있게 해줍니다. 그러나 몇가지 제약이 있기도 합니다.

mbunge/php-attributes

https://github.com/mbunge/php-attributes

PHP 8 Attribute를 쉽게 사용하고 적용할 수 있게 도와주는 패키지입니다.

  • 클래스 및 클래스 구성 요소에 PHP 8 attribute 적용
  • autoloaded 된 클래스에 자동으로 속성 적용
  • 클래스 이름, 네임 스페이스 또는 클래스 리플렉션의 조건을 필터링하도록 속성 제한

mlocati/docker-php-extension-installer

https://github.com/mlocati/docker-php-extension-installer

이 도구를 사용하면 Docker에 PHP 확장을 쉽게 설치할 수 있습니다. PECL은 더 이상 사용할 수 없으므로 PHP 8에 유용합니다.

php-opencv/php-opencv

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

PHP 8을 지원하는 컴퓨터 비전(얼굴 및 물체 인식 등) 및 기계 학습을 위한 확장입니다. 예제를 참조하세요.

pestphp/pest v1.0

https://github.com/pestphp/pest

보다 간단한 방식으로 테스트를 작성할 수있는 테스트 도구 Pest의 첫 번째 stable 릴리스입니다.

Rector 0.9

https://getrector.org/blog/2020/12/28/rector-09-released

자동 리팩토링 및 코드 업데이트를 위한 도구입니다.

FriendsOfPHP/proxy-manager-lts

https://github.com/FriendsOfPHP/proxy-manager-lts

이전 버전과의 호환성이 확장된, 인기있는 Ocramius/ProxyManager 패키지의 포크입니다.

multiavatar/multiavatar-php

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

이 스크립트는 사용자 이름(어떤 문자열이든)을 기반으로 재미있는 아바타를 생성합니다. 다음은‘PhpStorm’입니다.

Multiavatar-PhpStorm 이미지

Symfony

5 New Combos opened by Symfony 5.2 and PHP 8.0

https://tomasvotruba.com/blog/2020/12/21/5-new-combos-opened-by-symfony-52-and-php-80/

How to create service bundles for a Symfony application

https://macrini.medium.com/how-to-create-service-bundles-for-a-symfony-application-f266ecf01fca

A week of Symfony #732 (January 4–10, 2021)

https://symfony.com/blog/a-week-of-symfony-732-4-10-january-2021

Symfony 2020 in review

https://symfony.com/blog/symfony-2020-year-in-review

📺 Consume a 3rd-party API with Test Driven Development + HttpClient

https://www.youtube.com/watch?v=J46I-cctz7M

Laravel

🔈 Taylor Otwell’s Laravel Snippet #26 podcast

https://blog.laravel.com/laravel-snippet-26

Jetstream 2.x, Forge Circles, Spark “Next”, React SPAs.

Configuration precedence when testing Laravel

https://jasonmccreary.me/articles/laravel-testing-configuration-precedence/

테스트를 실행할 때 앱 Configuration의 우선 순위를 알려줍니다.

📺 A stream from Freek Murzee, where he refactors one of his applications – Mailcoach.

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

📺 Laravel Internals #3

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

전체 Laravel 팀과 함께하는 유튭 스트림.

Yii

Yii news 2020, issue 8

https://opencollective.com/yiisoft/updates/yii-news-2020-issue-8

📺 E-commerce website on Yii 2

https://www.youtube.com/watch?v=eQdDBhQpU9o&list=PLLQuc_7jk__UvpbpU3no5zveJQAwID48B

12시간 동안 Yii2로 Yii2 E-commerce application를 만드는 비디오.

Laminas

Laminas Project: A Year in Review.

https://www.zend.com/blog/laminas-2020

Vulnerability reported in Zend Framework / Laminas

https://www.bleepingcomputer.com/news/security/zend-framework-disputes-rce-vulnerability-issues-patch/

Zend Framework / Laminas에서 발견된 취약성을 요약하자면 다음과 같습니다.

class MyClassWithToString {
public $name;

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

public function __toString() {
return (string) $this->name;
}
}

$input = unserialize('O:19:"MyClassWithToString":1:{s:4:"name";s:15:"/tmp/etc/passwd";}');
if ($input instanceof MyClassWithToString) {
unlink($input);
}

팀은 프레임 워크에 수정 사항을 적용했습니다. 하지만 자세히 살펴보면 취약점은 사용자의 데이터 역 직렬화와 관련이 있습니다. 그리고 그런 경우에는 unserializie ()를 사용하지 말아야한다고 php.net에 빨간색으로 표시되어 있습니다.

더욱이 2017년 이후 deserialization 버그는 더 이상 보안 문제로 간주되지 않습니다. 단순히 unserialize()가 안전하지 않기 때문입니다.

Nikita Popov(@nikita_ppv)의 트윗

PSA: Don’t use unserialize() on untrusted input (see http://php.net/unserialize)
PHP will no longer treat unserialize() bugs are security bugs.

다음은 Yii를 예로 사용하여 이러한 버그를 악용하는 또 다른 글입니다.

기타 읽을 만한 글

Scaling PHP FPM based on utilization demand on Kubernetes

https://blog.wyrihaximus.net/2021/01/scaling-php-fpm-based-on-utilization-demand-on-kubernetes/

Object properties and immutability

https://peakd.com/hive-168588/@crell/object-properties-and-immutability

PHP에서 쓰기 제한을 구현하는 방법에 대한 Larry Garfield의 자세한 분석. 결론적으로 그는 읽기 및 쓰기 액세스를 위한 별도의 수정자를 추가 할 것을 제안합니다. 예를 들어, get, set 및 복제 기능을 위한 별도의 public/private 메소드.

시리즈의 두 번째 게시물에서 Larry는 PSR-7을 예로 들어 첫 번째 게시물의 모든 아이디어를 검토합니다.

mastering binary and bitwise data in PHP

https://thephp.website/en/issue/bitwise-php/

PHP에서 바이너리와 비트 데이터 마스터를 위한 기본적인 게시글.

Profiling PHP in production at scale

https://calendar.perfplanet.com/2020/profiling-php-in-production-at-scale/

Wikipedia의 수석 엔지니어 인 Timo Tijhof의 게시물입니다. 두 가지 도구를 사용하는 방법에 대해 설명합니다.

60 초의 샘플 간격을 사용하여 특정 데이터 센터에있는 150 개의 Apache 서버 클러스터에서 매일 약 3 백만 개의 샘플을 수집합니다. 이들은 모두 단일 Redis 인스턴스에서 수신됩니다.

It’s not legacy code — it’s PHP

https://medium.com/vimeo-engineering-blog/its-not-legacy-code-it-s-php-1f0ee0462580

Psalm의 저자 인 Matt Brown이 Vimeo에서 PHP를 사용하는 방법과 이유에 대한 영감을 주는 게시물입니다.

한동안 임박한 느낌이 들었지만 우리는 PHP를 포기하지 않았습니다. 몇 가지 분명한 이유가 있습니다. 전체 코드베이스를 다시 작성하는 것은 리소스 집약적이고 오류가 발생하기 쉽습니다. 그러나 약간 덜 분명한 이유도 있습니다. PHP가 더 좋아졌습니다.

Psalm의 핵심 기능은 TypeScript의 검사기와 대체로 유사하며 Hack이라는 Facebook (PHP 파생) 언어에서 몇 가지 아이디어를 차용합니다. Psalm은 PHP 코드가 프로덕션에서 유형 오류를 일으킬 수있는 경우와 논리가 의미가없는 경우를 알려줍니다. 사용하지 않는 클래스 및 메서드 감지와 같은 몇 가지 추가 기능을 추가하고 Psalm은 자동으로 찾은 많은 문제를 수정할 수 있습니다.

📺 Videos

📺 A pragmatic introduction to Event Sourcing

EventSaucePHP/EventSauce의 저자인 Frank de Jonge의 비디오.

📺 A video code-review from Matthieu Napoli

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

이 에피소드에서 m50/simple를 살펴봅니다.

📺 Xdebug 3 modes

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

Xdebug의 저자인 Derick Rethans가 debugger/profiler/coverage collector로써 Xdebug를 설정하는 방법을 알려줍니다.

🙌 Community

PHP-FIG now has a Discord server

https://www.php-fig.org/blog/2020/12/announcing-new-discord-server/

A 3D model of elePHPant.

https://cults3d.com/en/3d-model/various/elephpant-3d

github.com/thank-you-php

https://github.com/thank-you-php/thank-you-php

PHP에 대한 공개 감사의 편지. 풀 요청을 보내서 가입하고 프로필에 아래와 같은 배지를 받을 수 있습니다.
thank-you-php 배지 이미지

elephpant PHP8 : InPHPinity is born

https://inphpinity.elephpant.com/

새로운 PHP 8 코끼리를 선주문 할 수 있습니다.

선량한 차별주의자

김지혜 저 | 창비 | 2019년 07월 17일

선량한 차별주의자 이미지

제목을 보자마자 나의 이야기일 것 같은 책이었고, 회사 독서 모임을 시작하며 자유롭게 책을 선택할 기회가 왔을 때 단연 처음으로 꼽은 책이다. 항상 관심 있게 보는 권정민(Cojette, 꼬젯) 님이 추천한 도서 중 하나였고.

두께나 글자 수가 적은 것에 비해 생각할 거리도 많고 한장 한장 반성할 것투성이라 마음으로는 매우 무거운 책이었고 쉽사리 진도가 나가지 않았다. 차별을 선택하는 사람, 차별이 정당하다고 이야기하는 사람은 왜 생겨나고 그들에게 어떤 이야기를 해줘야 하는지 매우 따스하고, 침착하게 설명해준다. 장애인이든 여성 문제든 내가 당사자가 아닌 상황에선 반대론자들의 경제 논리, 공정함에 관한 주장에 똑 부러지게 반박할 수 없었던 것이 항상 아쉬웠는데, 이 책에서 많은 힌트를 얻었다.

밑줄 치고 싶은 구절도 많았고 꼭 기억해야지 싶은 문장도 많았는데, 열흘 정도 지나니 다 잊어버렸다. 가끔 다시 꺼내 보고 계속 자극을 받아볼 만한 책이다.

특권의 발견

짧은 기억력에도 특권을 발견한다는 표현은 잊히지 않는다. 실제로 이 책을 읽으면서 수많은 차별과 차별을 말하는 사람들이 보이기 시작했다.

얼마 전 150번 저상 버스가 휠체어 둘이 들어갈 수 있는 구조로 바뀐 것을 보고 사진을 올렸고, 한 친구가 아직 휠체어를 타고 버스를 타는 사람을 본 적이 없다고 말했다. 나는 사실 종종 봤다. 사람이 없는 시간에만 타신다. 회사는 자율출퇴근이라 출퇴근 시간이 일정하지 않으니 가끔 봤던 것 같다. 그렇지, 아무래도 일반적인 출퇴근 시간은 어렵겠지란 생각은 그때도 했던 것 같다. 그런데 이 책을 읽으면서 기억에 새롭게 떠오르는 건, 언젠가 버스정류장에서 휠체어에 오른 세 분이 모인 장면이다. 그런 욕구가/상황이 있으리라 상상해보지 못한 상황. 2002년에 광화문에서 이미 느꼈어야 했던 건데.

가끔은 내가 당사자가 되기도 한다

둘째가 태어난 뒤 처음으로 네 식구가 신발을 사러 근처 마리오 아울렛에 갔다. 주차장에서 10분도 넘게 엘리베이터를 기다렸다. 다른 움직일 때마다 그 고통은 이루 말할 수가 없다. 유모차에서 자는 아이를 데리고는 물건을 구경할 수도 없다. 나이키 매장 정도는 돼야 쾌적하다. 결국, 마지막에는 아내가 아기 띠로 아이를 안고, 나는 에스컬레이터로 유모차를 옮겼다.

또 하나,
아는 분이 너무너무 좋은 펜션을 알아냈다며 한참을 칭찬하셔서 봄에는 가봐야지 하면서 아내에게 링크를 보냈더니 1분도 안 되어 답장이 왔다. 11세 이하 어린이는 받지 않는다고. 제주에서도 많이 당했던 일이다. 열심히 찾아가면 입구에 조그맣게 쓰여 있는 노키즈존.

가끔은 가해자가 되기도 한다

가끔…보다는 자주 가해자가 되기도 한다. 여전히 말은 고치기 힘들다.

‘내가이제쓰지않는말들’이라는 프로젝트가 있다. 이 책을 읽기 시작한 후, 운명처럼 이런 프로젝트가 진행되고 있다는 걸 알았다.

‘내가이제쓰지않는말들’ 프로젝트는 우리가 한때 쓰기도 했고, 여전히 쓸 수도 있지만, 이제는 쓰지 않는 말들에 대한 글을 쓰고 함께 읽는 프로젝트입니다.
‘내가이제쓰지않는말들’ 프로젝트는 21대 국회에서 포괄적 차별금지법의 제정을 촉구하기 위한 하나의 캠페인입니다. 지난 2020년 6월 29일 국회에서 포괄적 차별금지법을 대표발의한 정의당 장혜영 의원실이 이 프로젝트를 기획하여 진행하고 있습니다.

처음 봤던 건 장류진 작가의 글이었다.

난 차별의 가해자가 아니야! - 장류진

  • “나는 이런 말을 안 쓰는 인품이 훌륭한 사람이야”를 내보이기 위함이 아니라 “나도 언젠가 이런 말을 쓴 적이 있었지만 더는 아니에요”를 말하기 위해서라고 한다.

아직 멀었지만

이 책의 수 많은 좋은 구절을 다 까먹어 놓구선, 그래도 일상에서 특권과 차별을 발견하는 횟수가 늘고 있다는 건 다행이다. 무언가를 하지 말아야 하는 것을 너머 무언가를 해야 하는 “적극적인 조치”를 해야 한다는 작가의 말에 공감한다. 무엇을 해야할 지는 아직 잘 모르겠지만, 집에서든 회사에서든 꾸준히 차별을 드러내는 소극적인 조치 정도로 시작해봐야겠다.

한겨례의 특권의 발견이라는 기사에 나온 이야기.

사회는 ‘특권리스트’를 계속 업데이트하고, 불편하고 고통을 호소하는 이들의 목소리를 사회적 공론의 장으로 끊임없이 끌고 올 수밖에 없다.

Php_annotated_monthly 이미지

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

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


⚡️ News & Releases

PHP 8.0.0 RС 2

PHP 8의 release candidate 시리즈가 시작됐습니다. 최종 릴리스 전까지 두 개의 RC가 남아 있습니다.

8.0을 위한 별도의 branch가 생성되었고, master branch는 이제 PHP 8.1을 바라보고 있습니다(php-src 저장소에는 master branch를 “Active development branch for PHP 8.1”라고 설명하고 있습니다).

PHP 8의 새로운 기능에 대한 개요는 다음 블로그 게시물에서 찾을 수 있습니다.

IDE에서 다루는 방법은 PhpStorm의 블로그 글이나 동영상으로 확인하실 수 있습니다.
Larry Garfield는 삶의 질을 높여주는 PHP 8 신규 기능에 관한 글을 쓰기도 했습니다.
PHP.Watch에선 PHP 8의 변경 사항을 한눈에 볼 수 있게 정리가 되어 있습니다.

PHP 8을 사용해보시려면, php:rc-cli를 이용하면 Docker로 가능하고, Mac에서는 shivammathur/homebrew-php, 혹은 php-build 소스로 컴파일 해보실 수 있습니다.

또한 Brent Roose와 Freek Van der Herten의 PHP 8을 사용하여 최신 애플리케이션을 구축하는 방법에 관한 eBook(발매 예정)인 Front Line PHP의 업데이트를 구독 할 수 있습니다.

PhpStorm 2020.3 EAP

https://blog.jetbrains.com/phpstorm/2020/10/phpstorm-2020-3-early-access-program-is-now-open/

PhpStorm의 EAP(early access program)을 사용하면 다음 릴리스에서 제공될 새로운 기능을 사용해 볼 수 있습니다. PHP 8 support, PHPStan, Psalm이 잘 작동하고 있고, 이외에 다른 변경 사항이 많이 있습니다. 심지어 2020.3의 두 번째 EAP 빌드에선 @template을 통해 generic을 지원하는 첫 번째 시도입니다(experimental).

PHP

PHP 7.2.34
PHP 7.3.23
PHP 7.4.11

Xdebug 3.0 beta 1

https://xdebug.org/announcements/2020-10-14

이 세 번째 버전에서는 디버거와의 작업을 더 쉽게 시작할 수 있도록 설정 방식이 재 설계되었습니다. 단 하나의 옵션 만이 필수입니다 : xdebug.mode=debug 혹은 command line에서 export XDEBUG_MODE=debug. 기본 포트는 9000에서 9003으로 변경됐고, 같은 포트를 사용하는 php-fpm과 더는 충돌하지 않습니다. upgrade guide를 확인해보세요.

Composer 2.0.0 RC2

https://getcomposer.org/changelog/2.0.0-RC2

최종 버전 전의 마지막 RC입니다. 시도해보시려면 composer self-update --preview를 실행해보세요.

🐘 PHP Internals

✅ [PR] Attributes on property groups

https://github.com/php/php-src/pull/6186

이제 Attribute를 하나 하나 지정하는 대신 property 그룹 전체에 지정할 수 있습니다. 액세스 수정자에서와 완전히 동일하게 작동합니다.

class FooBar {
#[NonNegative]
public int $x, $y, $z;
}

✅ [PR] Attributes and strict types

https://externals.io/message/111915

이제 Attribute는 strict_types=1 지시자도 고려합니다.

[PR] OPCache: Direct execution opcode file without php source code file

https://github.com/php/php-src/pull/6146

이 PR에서, 저자는 opcache 바이너리 파일을 저장하고 소스 코드 없이도 실행할 수 있게 제안합니다 - Python의 .pyc / .pyo의 파일과 유사한 방식.

그러나 이에 관한 논의에서 이 접근 방식의 몇 가지 문제점이 드러났습니다. PHP의 opcode 형식이 불안정하고, 다른 버전 간에 서로 호환되지 않습니다. 예를 들어, 패치 릴리스 사이에서도 PHP 7.4.22로 컴파일 된 코드는 PHP 7.4.23에서 segfault로 실패 할 수 있습니다.

AMA with the PhpStorm team

https://www.reddit.com/r/PHP/comments/j65968/ama_with_the_phpstorm_team_from_jetbrains_on/

최근 Reddit에서의 AMA(Ask Me Anything) with the PhpStorm team에서 Nikita는 generic의 상태와 전망에 대해 자세히 언급했습니다. 요컨대, 런타임에 삭제되는 제네릭은 순전히 기술적인 관점에서 가장 실행 가능한 접근 방식이지만 동시에 매우 일관성이없고 형식 안전성에 구멍을 남깁니다.

[PR] Multiline arrow functions

https://github.com/php/php-src/pull/6246

PHP 7.4에 추가된 arrow 함수는 한 줄짜리 표현식만 가능했습니다. 이 PR은 여러 줄의 짧은 람다식을 가능하게 합니다.

$guests = array_filter($users, fn ($user) => {
$guest = $repository->findByUserId($user->id);
return $guest !== null && in_array($guest->id, $guestsIds);
});

일반적인 람다 함수에 비해 갖는 이점은 use를 쓰지 않고도 scope를 캡쳐할 수 있다는 점입니다.

문법에 화살표(=>)를 추가할지에 대한 질문도 남겼습니다. fn() => {} vs. fn() {}

🆕 [RFC] Short Functions

https://wiki.php.net/rfc/short-functions

이 RFC는 화살표 함수 구문으로 명명된(named) 함수나 메소드에 단순 반환 표현식을 쓰도록 제안합니다.

function pick_one(int $a) => match($a) {
1 => 'One',
2 => 'Two',
3 => 'Three',
default => 'More',
};
print pick_one(1) . PHP_EOL;
class Person
{
public function __construct(
private string $firstName,
) {}
public function getFirstName(): string => $this->firstName;
}

🛠 Tools

thephpleague/event 3.0.0

https://github.com/thephpleague/event

이 유명한 이벤트 패키지는 이제 PSR-14와 호환됩니다.

terrylinooo/simple-cache

https://github.com/terrylinooo/simple-cache

PSR-16 simple cache drivers for files, Redis, MySQL, SQLite, APC, APCu, Memcache, Memcached, and WinCache

Bolt 4.0

https://github.com/bolt/core

즉시 사용 가능한 REST, GraphQL API 그리고 i18n과 함께 컴포저 패키지로 구워진 Symfony 5 CMS.

PHP-DI

https://github.com/PHP-DI/PHP-DI

실용적이고 프레임웍에 구애받지 않는 의존성 주입 컨테이너.

markrogoyski/math-php

https://github.com/markrogoyski/math-php

PHP를 위한 강력하고 현대적인 수학 라이브러리.

Danack/FloatHex

https://github.com/Danack/FloatHex

Float 형을 16 진수 문자열로 변환하고 그 반대로 되돌리는 기능과 2진 표현으로 두 개의 부동 소수점 숫자를 표시하는 등의 함수들. 또는 float_compare(0.3, 0.1 + 0.2);를 사용하면 0.1 + 0.2 === 0.3이 왜 false인지 알 수 있습니다.

float_compare 이미지

marcocesarato/PHP-Antimalware-Scanner

https://github.com/marcocesarato/PHP-Antimalware-Scanner

PHP 파일을 스캔하고 프로젝트를 분석하여 그 안에있는 악성 코드를 찾는 도구입니다.

Prometheus PHP

https://github.com/PromPHP

prometheus.io를 위한 비공식 PHP용 라이브러리.

shivammathur/setup-php

https://github.com/shivammathur/setup-php

파이프라인에서 환경을 준비하기 위해 PHP, 확장 및 기타 사항을 설정하기 위한 GitHub Action. Github 블로그에서 이에 관한 간략한 개요를 제공합니다.

Symfony

Dynamically changing the log level in Symfony apps.

https://matthiasnoback.nl/2020/09/symfony-changing-the-log-level/

A Week of Symfony #720 (12-18 October 2020)

https://symfony.com/blog/a-week-of-symfony-720-12-18-october-2020

New Symfony core team members.

https://symfony.com/blog/new-core-team-members

What’s coming in Symfony 5.2

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

다가오는 Symfony 릴리스는 무엇보다도 PHP 8과 호환됩니다. Symfony 5.2는 PHP 8 attributes 몇가지를 가져왔습니다. 예를 들어, 라우팅을 위해서는 #[Route('/path', name: 'action')], 의존성을 위해서는 #[Required], 그리고 user를 가져오기 위해 #[CurrentUser]와 같은 controller parameter를 위한 attribute를 사용할 수 있습니다.

public function index(#[CurrentUser] MyUser $user) { /* ... */ }

Laravel

ksassnowski/venture

https://github.com/ksassnowski/venture

이 패키지를 사용하면 Laravel의 Queue 시스템을 사용하여 상호 의존적인 작업의 복잡한 워크플로우를 구축할 수 있습니다.

spatie/laravel-typescript-transformer

PHP 클래스를 기반으로 TypeScript 타입을 생성하여 frontend에서 사용할 수 있게 합니다. 이 게시글로부터 이를 사용해야할 동기를 확인해보세요.

https://github.com/spatie/laravel-typescript-transformer

Spatie’s updated PHP and Laravel guidelines.

https://spatie.be/guidelines/laravel-php

Spatie의 Laravel & PHP guideline이 업데이트 됐습니다.

spatie/spatie.be

https://github.com/spatie/spatie.be

Spatie에 있는 친구들이 spatie.be 웹 사이트의 코드를 오픈 소스로 제공합니다. 또한 구현에 대한 모든 세부 사항이 포함된 자습서 시리즈를 출시했습니다.

The complete guide to Laravel frontend scaffolding.

https://samuelstancl.me/blog/the-complete-guide-to-laravel-frontend-scaffolding//

📺 Laravel Worldwide Meetup #3:

Exploring The Magic Of PhpStorm – Adel Faizrakhmanov
I’d Like To Speak To Your Manager – Yaz Jallad.

📺 Stream: Generate dynamic open graph images for freek.dev blog posts.

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

📺 Taylor answers questions regarding Jetstream.

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

Yii

W3C will move on from WordPress and will instead use CraftCMS

W3C가 WordPress 대신 Yii 2를 기반으로하는 CraftCMS로 옮겨가기로 했습니다. 이 결정을 하게 된 이유를 설명하는 이 문서가 아니었다면, 이 뉴스 자체는 그다지 흥미롭진 않았을 겁니다.

🌀 Async PHP

micc83/mailamie

https://github.com/micc83/mailamie

테스트를 위해 SMTP를 포괄하는 서버. ReactPHP를 기반으로 만들어졌습니다.

clue/reactphp-mq

https://github.com/clue/reactphp-mq

가벼운 인메모리 메세지 큐.

💡 기타 읽을 만한 글

Transpiling PHP code from 8.0 to 7.x via Rector

https://blog.logrocket.com/transpiling-php-code-from-8-0-to-7-x-via-rector/

최신 버전의 PHP로 업그레이드 할 수 없지만 개발할 때는 새로운 기능을 사용하려면, 프로젝트에 “컴파일”단계를 추가하고 rector/rectorphp의 도움으로 캐발 코드를 다운그레이드 할 수 있습니다.

Error suppression operator @ usage analysis.

https://www.exakat.io/en/i-scream-you-scream-we-all-scream-for/

에러를 무시하는 @ 연산자가 사용되는 경우와 대안, @와 함께 가장 많이 사용되는 함수 등을 정리했습니다.

PHP 8.0 named parameters and variadic

https://www.exakat.io/en/php-8-0-named-parameters-and-variadic/

임의의 개수의 인수로 함수를 호출하고 스프레드 오퍼레이터(Spread Operator, 펼침/전개 연산자)를 사용하는 방법에 대해 설명합니다.

.gitattributes for PHP projects.

https://php.watch/articles/composer-gitattributes

Instructions on how to write tests for PHP itself

https://dev.to/realflowcontrol/growing-the-php-core-one-test-at-a-time-4g4k

PHP 자체를 위한 테스트 작성하기. 테스트는 PHP로 작성되었으므로 이를 위해 C를 알아야 할 필요는 없습니다.

Set up PhpStorm to use PHP with PHPUnit and Xdebug in Docker.

https://pen-y-fan.github.io/2020/10/10/Set-up-PhpStorm-to-use-PHP-with-PHPUnit-and-xDebug-in-Docker/

Caching makes everything faster. Right?

https://thephp.cc/news/2020/10/caching-makes-everything-faster-right

PHPUnit에서 코드 커버리지를 위한 캐싱을 추가한 것이 원하는 효과를 얻지 못한 이유와 이 문제가 마침내 어떻게 해결 되었는지에 대한 PHPUnit 작성자인 Sebastian Bergmann의 게시물입니다.

Analysis of a PHP script that distributes Emotet malware.

https://andpalmier.github.io/posts/emotet-php-maldoc/

Emotet 악성 코드를 퍼뜨리는 PHP 스크립트 분석.

Which colour scheme is better?

https://stitcher.io/blog/why-light-themes-are-better-according-to-science

과학적으로는 다크 테마보다 밝은 테마가 좋다고 합니다.

Joe Watkins: Being Free

https://blog.krakjoe.ninja/2020/10/being-free.html

PHP가 20년 동안 어떻게 운영되고 있는지와 PHP를 지원할 수 있는 방안을 고민하는 글입니다.

📺 Videos

Profiling PHP applications with Xdebug

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

Xdebug의 저자인 Derick Rethans와 함께 하는, Xdebug로 PHP 어플리케이션을 프로파일링하는 90분짜리 동영상입니다.

Tutorial on starting with rectorphp/rector.

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

Compiling and test driving PHP 8

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

Brent Roose와 Freek Van der Herten이 PHP 8을 설치하고 새로운 기능을 살펴봅니다.

Deploy Friday #27 – Language Spotlight: PHP

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

Larry Garfield와 Patrick Dawkins이 진행하고 PHP 8 릴리스 매니저인 Sara Golemon과 Gabriel Caruso가 함께 하는 팟캐스트

🔈 Podcasts

Php_annotated_monthly 이미지

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

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


⚡️ News & Releases

PHP 8.0.0 Beta 4

https://www.php.net/archive/2020.php#2020-09-17-1

계획에 없던 beta 릴리스가 있었습니다. JIT, named arguments, reclassifying more notices and warnings 등의 안정화를 위해 추가가 됐습니다. 그러나 11월 26일로 예정된 최종 릴리스 날짜는 아직 변경 계획이 없습니다. 이후 첫 RC(release candidate)는 10월 1일 입니다.

PHP 7.4.10, PHP 7.3.22

https://www.php.net/ChangeLog-7.php#7.4.10
https://www.php.net/ChangeLog-7.php#7.3.22

The future of Zephir and Phalcon

https://blog.phalcon.io/post/the-future-of-phalcon

PHP5 시절로 돌아가면, 성능을 개선하기 위해 C-extension을 사용하는 프레임웍이 유행이었습니다.

이 중 가장 인기 있었던 건 Phalcon framework이었고, Zephir라는 자체 언어도 사용할 수 있었죠.

안타깝게도 그 프로젝트에 가장 많이 기여한 사람 중 한명이 떠났고, 다음 릴리스인 Phalcon 5부터는 순수 PHP로 재작성하기로 했습니다.

PHP: Community Synergy Initiative

https://www.reddit.com/r/PHP/comments/ivpfcf/php_community_synergy_initiative/

Paul DragoonisChristoph Rumpel은 PHP 커뮤니티와 생태계를 더 나은 곳으로 만들겠다고 다짐했습니다.

다음과 같은 몇 가지 중요한 문제가 있습니다

  • 명확하지 않고 오래된 php.net의 댓글 영역
  • 커뮤니티와 언어 관리자(maintainer) 간의 의사 소통 부족
  • 새로운 기능에 대한 RFC 문서 외에 프로젝트에서 일어나는 일에 대한 투명성 부족
  • 프로젝트에 새로운 사람이 부족

일을 더 진전시키기 위해, 이 두 사람은 전 세계의 PHP 친구들에게 익명 설문조사를 시작했습니다.

PHP for GraalVM concept

https://github.com/abertschi/graalphp

GraalVM 프로젝트는 다른 언어를 지원하는 Java 가상 머신의 대체제를 개발합니다. 실험적인 PHP 구현체는 아직 언어 기능의 일부만 지원합니다.

Computer Language Benchmarks Game에서의 종합 벤치마크 결과는 PHP 7.4에 비해 8배 이상의 성능 향상이 있었습니다.

The WordPress community discussed dropping support for old PHP versions

https://make.wordpress.org/core/2020/08/24/proposal-dropping-support-for-old-php-versions-via-a-fixed-schedule/

WordPress 커뮤니티에서는 오래된 PHP 버전의 지원을 중단할 것을 논의했습니다. 프로젝트 리드인 Matt Mullenweg의 답변에 따르면, PHP 5.6 버전은 오랫동안 지원될 것으로 보입니다. 공식 통계는 워드프레스 설치하는데 21.6%가 PHP 5.6 이하 버전을 사용한다는 것을 보여줍니다.

워드 프레스에서 MySQL을 채택한 경우에도 비슷한 그림을 볼 수 있습니다. 65%는 MySQL 5.6 이하를 사용하고 MySQL 5.5에 대한 지원은 이미 종료되었으며 5.6은 2021년 2월에 수명이 종료됩니다.

Composer 2.0 RC 1

https://github.com/composer/composer/releases/tag/2.0.0-RC1

사용 해보시려면, composer self-update --preview 실행해보세요.

🐘 PHP Internals

✅ [RFC] Shorter Attribute Syntax Change

https://wiki.php.net/rfc/shorter_attribute_syntax_change#voting

Attribute 문법에 관한 긴 논쟁이 끝났습니다. #[Attribute]가 이겼습니다.

#[
ORM\Entity,
ORM\Table("user")
]
class User
{
#[ORM\Id, ORM\Column("integer"), ORM\GeneratedValue]
private $id;
#[ORM\Column("string", ORM\Column::UNIQUE)]
#[Assert\Email(["message" => "The email '{{ value }}' is not a valid email."])]
private $email;
}

이전 문법이었던 @@Attr는 속성 그룹화를 해줄 수 없었으므로 PR에서 제거 됐습니다. 그러나 #[ ]는 종료 마커가 있어 끝을 표시할 수 있기 때문에, 그룹화 기능이 돌아왔습니다.

// You can do this way
#[ORM\Entity]
#[ORM\Table("user")]
// or this way
#[
ORM\Entity,
ORM\Table("user")
]

Attribute에 관한 overview 포스트도 읽어보세요.

🆕 [RFC] any() and all() on iterables

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

이 RFC에서 Tyson Andre는 표준 라이브러리에 두 개의 function을 추가할 것을 제안했습니다.

any(iterable $input, ?callable $callback = null): bool
— 각 요소의 callback을 실행하며 처음 true로 반환되는 시점에 멈춤

all(...)

  • 모든 요소의 callback에서 true를 반환해야 이 함수도 true를 반환

다음은 예시입니다.

// Before
$satisifes_predicate = false;
foreach ($item_list as $item) {
if (API::satisfiesCondition($item)) {
$satisfies_predicate = true;
break;
}
}
if (!$satisfies_predicate) {
throw new APIException("No matches found");
}
// After
if (!any($item_list, fn($item) => API::satisfiesCondition($item))) {
throw new APIException("No matches found");
}

Runtime-erased generics proposal

https://externals.io/message/111875

Brent Roose가 - 그가 Laravel과 PHP에 관해 쓴 글들은 한번 쯤 보셨을 겁니다 -
제네릭을 PHP에 추가하는 아이디어를 내놓았는데, runtime에는 아무것도 체크하지 않습니다.

아래와 같이 generic을 사용한 코드가 있다고 해봅니다.

class Collection<T> {
public function add(T $item) { ... }
}
$c = new Collection<Product>();

정적 분석기나 IDE는 이를 파싱하고 분석할 수 있겠죠. 그러나 PHP interpreter는 이를 무시하고 아래와 같은 코드를 실행하게 됩니다.

class Collection {
public function add(mixed $item) { ... }
}
$c = new Collection();

이것은 Hack 언어에서 generic이 default로 동작하는 방식과 유사합니다. 예를 들어 Python에서는 대부분의 경우 타입에 대한 거의 모든 정보가 제거되며 인기있는 인터프리터에선 인수의 타입을 검증하지 않습니다.

🆕 Observer API

https://github.com/php/php-src/pull/5857

PHP 8에는 함수를 입력하거나 종료 할 때 추적할 수 있는 내부 API가 있습니다. 이는 Xdebug, profilers 그리고 New Relic, Tideways와 같은 APM 솔루션 등의 extension에 유용할 것입니다.

Author인 Levi MorrisonSammy K Powers가 참여한 🔈 PHP Internals News podcast #68에서 이 API에 대해 더 알아보세요.

🛠 Tools

Pest 0.3

https://nunomaduro.com/pest-v0-3-is-out/

PHPUnit 위에서 개발된, 테스트를 좀 더 간단한 방식으로 작성할 수 있는 툴입니다.
Pest IntelliJ라는 PhpStorm 플러그인도 있습니다.

Codeception/Verify 2.0

https://github.com/Codeception/Verify

Assertions for PHPUnit and Codeception with a fluent interface.

brick/money

https://github.com/brick/money

재무 데이터/화폐 단위를 다루는 라이브러리. GMP나 BCMath 설치 없이도 가능.
the comparison with moneyphp/money를 확인해보세요.

bassim/super-expressive-php

https://github.com/bassim/super-expressive-php

이 패키지를 사용하면 fluent 인터페이스를 통해 거의 자연어에 가까운 방식으로 정규 표현식을 작성할 수 있습니다.

$myRegex = SuperExpressive::create()
->startOfInput()
->optional()->string('0x')
->capture()
->exactly(4)->anyOf()
->range('A', 'F')
->range('a', 'f')
->range('0', '9')
->end()
->end()
->endOfInput()
->toRegexString();

// Produces the following regular expression:
/^(?:0x)?([A-Fa-f0-9]{4})$/

또 다른 대안인 VerbalExpressions/PHPVerbalExpressions도 있습니다.

phpbench/phpbench 1.0.0-alpha1

https://github.com/phpbench/phpbench

코드 벤치마킹을위한 매우 편리한 도구입니다. 새 버전에서는 결과를 이전 실행과 비교하고 성능 모니터링을 위해 CI에서 사용할 수 있습니다. Learn more

jawira/emoji-catalog

https://github.com/jawira/emoji-catalog

3k+ emojis as PHP constants.

<?php
use Jawira\EmojiCatalog\Emoji;

echo Emoji::GRINNING_FACE; // 😀
echo Emoji::SOCCER_BALL; // ⚽
echo Emoji::HOURGLASS_DONE; // ⌛
echo Emoji::EJECT_BUTTON; // ⏏

Symfony

Symfony 5: The Fast Track

https://symfony.com/book

“Symfony 5: The Fast Track”란 e-book이 이제 12개 언어로 제공합니다. 한국어로는 없습니다.

A Week of Symfony #716 (14-20 September 2020)

https://symfony.com/blog/a-week-of-symfony-716-14-20-september-2020

Laravel

Laravel 8 released

https://laravel-news.com/laravel8

자세한 overview 📺는 Laracasts에서.

Laravel authentication ecosystem overview

https://laravel.com/docs/8.x/authentication#ecosystem-overview

laravel/fortify를 둘러싼 혼란을 풀어주는 overview.

laravel/jetstream

https://jetstream.laravel.com/1.x/introduction.html

Laravel 8 릴리스에는 Livewire, Inertia.js 등에 기반한 스켈레톤 애플리케이션이 있습니다.

Common security mistakes in Laravel applications.

https://cyberpanda.la/ebooks/download/laravel-security?pdf=true

Laravel 어플리케이션에서 놓치기 쉬운, 보안을 위협하는 실수를 정리한 e-book입니다. 아래와 같은 내용을 다루고 Prevention tip도 제공합니다.

  • SQL Injections
    1. SQL Injection via column name
    2. SQL Injection via validation rules
    3. SQL Injection via raw queries
  • Validation Rule Injection
    1. Making the validation rule optional
    2. DDOS the server by creating an evil REGEX validation rule
    3. SQL Injection
  • XSS(Cross-Site Scripting) in Laravel Blade
    1. XSS via {!! $userBio !!} Statement
    2. XSS via a.href Attribute
    3. XSS via Custom Directive
  • Mass Assignment Vulnerabilities in Laravel
  • Not Protecting from Credential Stuffing Attacks
  • Broken Access Control
  • Missing HTTP Security Headers
  • Not Tracking Vulnerable Packages in the Application

Write code that interacts with the data in a predictable and safe way

https://laravel-beyond-crud.com/sample-chapter

Laravel Beyond CRUD라는 책의 샘플 챕터입니다.

📺 Laravel Business — A YouTube channel with nice videos about the framework.

https://www.youtube.com/channel/UCTuplgOBi6tJIlesIboymGA/videos

Laravel 프레임웍에 관한 좋은 비디오가 많은 채널입니다.

Yii

yiisoft/auth

https://github.com/yiisoft/auth

Yii 3 제품군의 이 새로운 패키지는 다양한 인증 방법, 추상화 세트 및 인증을위한 PSR-15 미들웨어를 제공합니다.

yiisoft/strings

https://github.com/yiisoft/strings

Helpers for working with strings.

Yii news 2020, issue 6.

https://opencollective.com/yiisoft/updates/yii-news-2020-issue-6

🌀 Async PHP

Building the next generation react/http PSR-15 adapter using krakjoe/parallel

https://blog.wyrihaximus.net/2020/09/next-gen-react-http-psr-15-adapter/

이때, 이 어댑터를 통해 추가 된 미들웨어는 별도의 스레드에서 병렬로 실행되기 때문에 차단 될 수 있습니다.

Using ReactPHP to consume data from an HTTP API

https://mglaman.dev/blog/using-reactphp-consume-data-http-api

💡 기타 읽을 만한 글

Dialects in code: Part 1, Part 2

https://www.rosstuck.com/dialects-in-code-part-1
https://www.rosstuck.com/dialects-in-code-part-2

서로 다른 사람들이 완전히 다른 방식으로 동일한 프로그래밍 언어를 사용할 수있는 방법.
다양한 관행이 부딧히며 더 나은 관행(기존 관행에 잘 어울리고, 덜 복잡해보이며, 확실한 이점이 있는 등)을 선택해가는 방식을 설명합니다.

4 tips on refactoring in PHP

https://christoph-rumpel.com/2020/8/refactoring-php

  • #1 - Be Expressive
  • #2 - Return Early
  • #3 - Refactor To Collections
  • #4 - Consistency

How unserialize() works on PHP

https://vkili.github.io/blog/insecure%20deserialization/unserialize/

PHP에서 unserialize()의 동작 과정을 살펴봅니다. unserialize()의 취약성을 방지하기 위해선 JSON 데이터를 사용하거나 신뢰할 수 없는 사용자의 데이터를 unserialize()에 전달하지 않기를 당부합니다.

Modern PHP security

Part 1 — Bug classes
Part 2 — Breaching and hardening the PHP engine

Speeding PHP with FFI

https://dev.to/jorgecc/speeding-php-with-ffi-5gn0

Turbocharged PHP Development with Xdebug, Docker & PhpStorm

https://jump24.co.uk/journal/turbocharged-php-development-with-xdebug-docker-and-phpstorm/

On the impact of exceptions on performance

https://php.watch/articles/php-exception-performance

Exception이 성능에 미치는 영향. 요약하자면 try/catch 블럭은 약간의 영향이 있습니다. exception을 throwing하기 위해 stack trace를 모으고 객체를 생성하는 것 때문에 조금은 시간이 더 걸리지만, 상용 어플리케이션에서는 이것이 병목이 되는 경우는 없습니다.

Step-by-step instructions on how to contribute to opensource PHP package.

https://johnbraun.blog/posts/contributing-to-a-PHP-package

Step 1. Fork the package on GitHub
Step 2. Clone your fork
Step 3. Require the package within a (Laravel) project
Step 4. Commit your work
Step 5. Push your branch
Step 6. Create a new PR

📺 Videos

🔈 Podcasts

Php_annotated_monthly 이미지

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

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


⚡️ News & Releases

PHP 8.0.0 Beta 1

https://www.php.net/archive/2020.php#2020-08-06-3

첫 beta 버전이 릴리스되었습니다. attributes 문법을 제외하고, Feature Freeze되어 변경 사항 목록이 확정되어 최종 버전으로 간주됩니다. 다음 Beta 릴리스는 8월 20일입니다.

…라고 소개되어 있지만, 실제 beta2는 21일에 발표되었습니다.

그 동안 새로운 기능에 대한 overview를 확인하세요.

동영상 overview도 있습니다.

PHP 8 release manager인 Sara Golemon와 Garbriel Caruso의 Voices of the ElePHPant podcast에서의 오디오 인터뷰도 있습니다.

PHP 7.4.9, 7.3.21, 7.2.33

https://www.php.net/releases/7_4_9.php
https://www.php.net/releases/7_3_21.php
https://www.php.net/releases/7_2_33.php

PHAR에서의 취약성을 수정한 보안 업데이트가 있었습니다.

WordPress 5.5 “Eckstine”

https://wordpress.org/news/2020/08/eckstine/

CMS 설치를 좀 더 안전하게 하는 테마와 플러긴 자동 업데이트를 제공합니다.

PhpStorm 2020.2 released

https://www.jetbrains.com/phpstorm/whatsnew/

  • PHP 8 Union Types support
  • New Control Flow Engine for PHP
  • Quality Tools Improvements
  • Composer Improvements
  • Extract Class refactoring
  • Command Line Tools Improvements
  • New Inspections
  • Full Support for GitHub Pull Requests
  • Support for OpenAPI
  • New Inspections Widget and Problems View
  • Web Technologies
  • Version Control
  • Database Tools
  • 기타

🐘 PHP Internals

🍿 [RFC] Shorter Attribute Syntax Change

PHP 8의 attribute 문법이 여전히 결정되지 않았습니다.

처음에 Benjamin Eberlei는 << >>제안했고 이는 받아들여졌습니다. 나중에 새로운 문법에 대한 3가지 옵션으로 투표가 있었습니다 - << >>, #[], @@. 이 중 마지막 옵션이 선택되었는데, 아마도 PHPDoc tag나 Java의 annotation과 가장 유사했기 때문일 것입니다. 그러나 @@는 몇가지 파싱 문제와 다른 여러 문제가 있는 것으로 밝혀졌습니다.

#[Attr] 문법 역시 몇가지 고려할 사항이 있습니다 : 1, 2.

이제는 다음 옵션 중 하나를 선택하기 위해 재투표를 실시하기로 결정했습니다 : @@Attr, #[Attr], <<Attr>>, @[Attr].

커뮤니티의 반응이 재미있습니다.

어쨌든 결국은 어떤 문법이든 익숙해질 것이다

Jordi Boggiano트윗

2008년으로 돌아가보면, namespace separator를 \ 대신 **, ^^, :>, :), :::, and %%. 같은 걸 고려했다는 게 믿기지 않는다

Brent트윗

  • 난 2008년에 PHP를 쓰지 않았는데, 백슬래시가 namespace separator로써 이상한 선택이라고 생각해본 적은 없습니다. 다른 더 좋은 대안이 생각나진 않는데요?

여기에 대한 Benjamin Eberlei의 답변

  • 당시 모두가 원했던 것은 C++ 스타일의 ::였는데, 그건 불가능했습니다. 이미 구현할 수 없는 상황이었는데 늦게 발견되었습니다.

모두를 동시에 만족시키는 plan B는 항상 존재하는 법

Chris Emerson트윗

  • PHP 8 Annotations / Attributes에 아래와 같은 새로운 제안이 필요하다
  • @@#[<< Annotation >>]
  • 이제 모두가 만족할 거야

✅ [RFC] Saner string to number comparisons

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

이전 버전과의 호환성을 깨는 이 제안은 거의 만장일치로 통과되었습니다.

PHP8에서 엄격하지 않은 == 연산자로 숫자와 문자열을 비교할 때, 두 피연산자는 모두 문자열로 변환이 되고 그 중 하나가 숫자 문자열이 아닌 경우 문자열로 비교를 합니다.

0 == 'foobar'는 이제 공식적으로 false 입니다.

PHP8 이전과 이후 비교표

또한 모든 비교 연산자에도 변화를 주게 됩니다 : <=>, ==, !=, >, >=, < and <=, 그리고 switch 구문과 in_array(), sort() 같은 함수 등.

✅ [RFC] Treat namespaced names as a single token

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

PHP 8에서는 전체 namespace가 하나의 token으로 인식됩니다. 이는 keyword가 namespace 안에서 사용되는 것을 허용합니다. 예를 들어, namespace app\function { class Foo {} }. 그리고 새로운 keyword가 생겼을 때 하위 호환이 깨지는 걸 방지할 수 있습니다.

이 변경으로 네임 스페이스는 더 이상 주석을 포함 할 수 없습니다. 즉, 이런 더러운 것들은 다시는 빛을 볼 수 없다는 말입니다.
use /** Try comments */ \FullyQualified \ /* in this ugly way */ SometTotallyDifferentTrait /** also after */;

✅ [RFC] Nullsafe operator

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

?-> 연산자가 PHP 8에 accepted 됐습니다. 수많은 null 체크 대신 아래처럼 우아하게 작성하실 수 있습니다.

$country = $this->sessionStorage->getSession()?->getUser()?->address?->country;

✅ [RFC] Named Arguments

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

PHP 8에서는 named arguments를 사용할 수 있습니다. function이나 method에 파라미터 명을 기준으로 값을 전달할 수 있고, 파라미터의 원래 위치에 넣지 않아도 됩니다.

기존:
htmlspecialchars($string, ENT_COMPAT | ENT_HTML401 , ini_get("default_charset"), false);

앞으로:
htmlspecialchars($string, double_encode: false);

stitcher.io/blog/php-8-named-arguments 포스트에서 named argument에 대해 더 알아보세요.

[RFC] Named Parameters explicit opt in

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

문서가 재설계되었으며, 이제 이름을 바꾸거나 객체 다형성을 제공하지 않고 명시적으로 선언된 파라미터만 사용할 수 있습니다.

PHP 8은 이미 feature-freeze 단계여서 이 제안은 8.1 버전쯤부터 가능합니다.

[Proposal] Bigint shorthand (123n) for GMP objects

https://github.com/php/php-src/pull/5930

공식적인 RFC는 아직 없지만, 다음 버전을 위한 흥미로운 제안입니다.

Tyson Andre는 숫자 뒤에 “n”을 붙여서 큰 숫자를 표현하는 문법을 제안했습니다. JavaScript의 방식과 유사합니다.

$theBiggestInt = 9007199254740991n

이는 내부적으로 GMP 객체를 만들고 PHP에서 일반 숫자처럼 사용할 수 있게 해줍니다. 산술, 비트, 비교 연산자가 이미 GMP 객체를 overload하고 있기 때문입니다.

🛠 Tools

PHPUnit 9.3

https://github.com/sebastianbergmann/phpunit/blob/9.3.0/ChangeLog-9.3.md#930---2020-08-07

A fresh update with support for PHP 8 and Xdebug 3.

hidehalo/nanoid-php

https://github.com/hidehalo/nanoid-php

Nanoid의 PHP 구현체. 안전하고 URL 친화적인 unique ID generator.

woohoolabs/zen

https://github.com/woohoolabs/zen

Fast and simple, PSR-11을 지원하는 DI Container이자 preload file generator.

loophp/collection

https://github.com/loophp/collection

A (memory) friendly, easy, lazy, and modular collection class.

ramsey/conventional-commits

https://github.com/ramsey/conventional-commits

Conventional Commits 스펙에 따라 commit 메시지를 생성하고 유효성을 검사하는 PHP 라이브러리. CaptainHook plugin 포함.

jubianchi/ppc

https://github.com/jubianchi/ppc

PHP를 위한 파서 생성기 라이브러리. phplrt/phplrt와 비교해보세요.

zakirullin/mess

https://github.com/zakirullin/mess

Type-safe casting을 위한 scalar 타입과 배열의 wrapper.

nette/php-generator

https://github.com/nette/php-generator

PHP code generator with a fluent interface.

Symfony

Using Symfony’s service iterators for secondary flows.

https://timobakx.dev/php/symfony/2020/07/30/secondary-flows.html

Deploy a Symfony application in AWS Lambda.

https://medium.com/@smaine.milianni/aws-lambda-and-symfony-6d3e9831c3cd

A Week of Symfony #711 (August 10-16, 2020)

https://symfony.com/blog/a-week-of-symfony-711-10-16-august-2020

Nicolas Grekas의 트윗

https://twitter.com/nicolasgrekas/status/1286563593098612736

As of today, #Symfony 4.3 and 5.0 are out of maintenance \o/. It’s time to move on to 5.1 if you didn’t already!

Laravel

A nice guide for converting a legacy application to Laravel

https://tighten.co/blog/converting-a-legacy-app-to-laravel/

Running The Same Queued Job Multiple Times

https://divinglaravel.com/laravel-queues-in-action-running-the-same-job-multiple-times

Job을 delay하는 방법을 다룹니다.

📺 Don’t use mass assignment protection in your Laravel models.

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

📺 Better Laravel Way

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

이 플레이리스트의 소개글을 옮겨왔습니다.

Playlist for mid and senior developers who want to learn how to write scalable and maintainable PHP microservices in Laravel using SOLID Principles, Domain Driven Design, Test Driven Development, Hexagonal Architecture and CQRS:

📺 A stream with Nuno Maduro and Freek Murze

PHPUnit 테스트를 Pest로 변환합니다.

📺 Laracon EU Online 2020 videos

https://www.youtube.com/playlist?list=PLMdXHJK-lGoAepv_7mvIEuafrtO6N-3SZ

💡 기타 읽을 만한 글

Testing Microservices in PHP with Codeception.

https://medium.com/@docler/testing-microservices-in-php-with-codeception-94e47f22cc24

Antipatterns of legacy PHP applications.

https://adrien.poupa.fr/modernizing-a-legacy-php-application/

method fossilisation

https://www.exakat.io/en/method-fossilisation/

파편화된 메소드를 피하는 방법입니다. Exakat을 사용하면 쉽게 발견할 수 있다는 홍보를 하면서 아래의 방안을 제안합니다.

  • Monitor fossilisation
  • Reduce and remove fossilisation
  • Limit the usage of scalar typehints for large families of classes
  • Don’t forget your users
  • Skip inheritance

A case for system-wide dependency injection in PHP.

https://technex.us/2020/08/the_case_for_system_wide_dependency_injection_in_php/

다른 많은 언어의 경우처럼, composer를 프로젝트 단위에서 전역(global) 단위로 동작하게 설정할 수 있도록 composer를 fork한 프로젝트입니다.

Friendly classes in PHP

https://forum.yiiframework.com/t/usage-of-friendly-classes/130241

There was an RFC on the subject, but it did not pass.

Everything you need (and don’t need) to know about PHP’s type system.

https://thephp.website/en/issue/php-type-system/

Enhancements to PHP code coverage in 2020

https://doug.codes/php-code-coverage

2020년 8월 php-code-coverage 9.0 릴리스와 함께, 관련해서 릴리스된 PHPUnit 9.3과 behat-code-coverage 5.0으로 더 향상된 방식으로 코드 커버리지를 측정할 수 있습니다.
코드 커버리지에 관한 소개와 한계, 대안으로 사용할 수 있는 측정 지표, branch coverage, path coverage 등을 설명합니다.

https://doug.codes/php-code-coverage

PHP: Preloading – Manual

https://www.php.net/manual/en/opcache.preloading.php

7.4 버전에 추가된 preloading에 관한 상세한 문서가 올라왔습니다.

PhpStorm, But Better – Tips & Tricks Newsletter

https://phpstormbutbetter.com/

PhpStorm 사용팁에 관한 뉴스레터입니다. 이미 두 번 발행됐습니다 - #1, #2.

Are you sure you write OOP code?

https://adelf.tech/2020/oop-thinking

Order of evaluation in PHP

https://gist.github.com/nikic/6699370

Nikita Popov의 오래되었지만 매우 흥미로운 글 : “연산자 우선 순위 및 associativity는 그룹화를 지정하지만 그룹이 실행되는 순서는 지정하지 않습니다.”

  • associativity란 괄호가 없을 때 동일한 우선 순위의 연산자를 그룹화하는 방법을 결정하는 속성입니다.

📺 Videos

📺 Type Juggling Magic: Why PHP thinks 0 and “password” are the same

https://www.youtube.com/watch?v=-1kftH6t5VA

PHP의 type casting이 보안 문제를 유발하는 방법에 대한 재미있는 비디오입니다.

📺 Stream with Derick Rethans on how to work with Xdebug

https://www.youtube.com/watch?v=qVfqfJ7-grk

Laravel Valet과 PhpStorm 환경에 Xdebug를 설정합니다. profiling, debugging, 기타 tip을 다룹니다.

📺 Dutch PHP Conf 2020 videos.

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

🔈 Podcasts

PHP Internals News Podcast by Derick Rethans

0%