PHP Annotated – September 2020

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