php-annotated-monthly-may-2019

Php_annotated_monthly 이미지

JetBrains에서 제공하는 월간 PHP Annotated Monthly 5월호입니다.

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


News & Releases

PHP

WordPress 5.2 “Jaco”

https://wordpress.org/news/2019/05/jaco/

2013년 10월 24일에 릴리즈 된 WordPress 3.7부터 보안 수정 사항을 자동으로 업데이트 하는 기능이 도입되었는데, 이게 오히려 공격 대상이 되어 가짜 자동 업데이트를 심을 수 있는 위험이 있었다고 합니다. 5.2 버전인 “Jaco”부터는 이를 보완했다는 말인데,

Before WordPress 5.2, if you wanted to infect every WordPress site on the Internet (approximately 33.8% of websites as of this writing), you just had to hack their update server

5.2 이전의 WordPress 웹사이트(전체 인터넷의 33.8%에 해당하는)에는 업데이트 서버만 공격하면 된다고 하는 걸 보니, 해커 여러분들은 5.2 버전이 보급되기 전에 털어야 합니다.

Codeception 3.0

https://codeception.com/04-24-2019/codeception-3.0

Improved interactive shell, retry steps, PHPUnit 8 support, and other things.

Zend Framework transitions to Linux Foundation

https://framework.zend.com/blog/2019-04-17-announcing-laminas.html

Zend Framework이 리눅스 재단 아래로 들어가면서 Laminas라는 이름으로 바뀌었다고 합니다. 이 새로운 조직에서 Zend Framework은 물론 Expressive microframework, Apigility 같은 프로젝트를 다루게 된다고 합니다. Repo에는 아직 별 내용은 없지만 몇 달 안으로 전체 전환이 이뤄질 것으로 보입니다.

PHP Internals

[RFC] Arrow Functions 2.0

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

새로운 화살표 함수에 대한 스펙이 드디어 accepted 됐고, PHP 7.4부터 반영될 것으로 보입니다. fn 키워드를 사용하게 되고, 자동 바인딩 됩니다!!

1
2
$y = 1;
$fn = fn($x) => $x + $y;

JavaScript와의 사용법은 약간 다르기 때문에 문법을 확실히 익히고 써야할 것입니다.

2015년 Short Closures, 2016년 Arrow Functions까지 많은 논쟁이 있었는데요. 그 동안 왜 통과가 안됐는지에 관해선 reddit에 올라온 글을 참고하셔도 되겠습니다.

[RFC] Deprecate PHP Short open tags

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

드디어 <? 태그가 없어지기로 되어 있지만(7.4에서 default OFF, 8.0에서 제거) 여전히 반발이 심하다는군요.

[RFC] Spread Operator in Array Expression

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

거의 만장일치(43:1)로 통과된 스펙입니다. PHP 7.4부터는 Array에서도 spread 문법을 쓸 수 있어요.

1
2
3
$parts = ['apple', 'pear'];
$fruits = ['banana', 'orange', ...$parts, 'watermelon'];
// ['banana', 'orange', 'apple', 'pear', 'watermelon'];

Iterator를 array로 변환하는 용도로도 사용됩니다.

1
$array = [...$iter];

[RFC] Allow throwing exceptions from __toString()

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

Nikita가 “PHP Sadnesses”에 있는 문제를 하나 하나 해결해 나가고 있다고 합니다. PHP 7.4를 목표로 하는 RFC이고 투표가 통과되면 __toString()에서도 exception을 던질 수 있습니다.

[RFC] Deprecate left-associative ternary operator

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

타 언어와 다르게 동작하는 PHP의 삼항연산자를 개선하고자 중첩된 삼항연산을 deprecated 처리한다는 내용입니다. 이제는(target은 PHP 7.4 혹은 8.0) 중첩된 삼항연산에 명시적으로 괄호를 넣어야 합니다.

1
2
3
1 ? 2 : 3 ? 4 : 5;   // deprecated
(1 ? 2 : 3) ? 4 : 5; // ok
1 ? 2 : (3 ? 4 : 5); // ok

New in PHP 7.4.

https://stitcher.io/blog/new-in-php-74

Accepted 된 RFC를 기준으로 PHP 7.4에는 뭐가 달라지는지 정리한 글입니다. PHP 7.4는 2019년 12월 릴리즈 예정입니다.

  • Short closures for cleaner one-liner functions
  • Preloading to improve performance
  • Typed properties in classes
  • Custom object serialization adds a new way of (de)serializing objects
  • Improved type variance
  • The Null coalescing assignment operator as a shorthand
  • FFI opens up new opportunities for extension development in PHP
  • Short open tags are deprecated
  • Spread operator in arrays
  • And more

어떤 변화가 가장 마음에 드시나요? 저는 Preloading에 거는 기대가 큽니다.

Derick Rethans has recorded a whole load of new episodes of PHP Internals News:

https://phpinternals.news/

PHP Internals에 관한 팟캐스트(?)가 있습니다.

🔈 #6 — On PHP and extensions quality with Remi Collet.
🔈 #7 — On JIT in PHP 8 and earlier attempts with Zeev Suraski.
🔈 #8 — On Short tags with George Banyard.
🔈 #9 — On bundled extensions with Kalle Nielsen.

Tools

Tools 항목은 번역 생략합니다.

기타 읽을 만한 글

A PHP Compiler, aka The FFI Rabbit Hole

https://blog.ircmaxell.com/2019/04/compilers-ffi.html

PHP Annotated Monthly 3월호에도 소개됐던 ircmaxell/php-compiler를 만들고 있는 Anthony Ferrara의 글입니다.

찬찬히 읽어보고 소개해드리려고 보니 엄청난 양이라서 목차나 소개하고 넘어가겠습니다.

  1. JIT? AOT? VM? What The Heck?
    1.1. Types of Compilers
    1.2. Some more definitions
  2. A bit of (relevant) history
  3. Enter PHP 7.4 and FFI
    3.1. FFIMe
    3.2. PHP-CParser
    3.3. PHP-Compiler
    3.4. PHP-Compiler-Toolkit
    3.5. PHP-LLVM
    3.6. PHP-ELF-SymbolResolver
  4. The case for macros
  5. How do I run any of this?
    5.1. Running FFIMe:
    5.2. Running PHP-Compiler Natively
    5.3. Running PHP-Compiler With Docker
  6. What’s Next

PSR-14: The series

한달 전 쯤 PSR-14 Event Dispatcher가 accept 됐는데요. Larry Garfield란 사람이 이 새로운 스펙의 다양한 관점을 시리즈로 풀어냈습니다.

How we migrated 54,357 lines of code from Nette to Symfony

https://pehapkari.cz/blog/2019/04/20/how-we-migrated-54-357-lines-of-code-nette-to-symfony-in-2-people-under-80-hours/

Nette Framework으로 만들어진 54,357 라인의 코드를 Symfony 기반으로 마이그레이션하는데 둘이서 각각 40시간 정도의 시간을 썼다고 합니다.

2017년에도 시도하려다 못했는데, 2019년에는 세가지 툴이 있어서 가능했답니다.

Rector라는 툴은 이 글을 쓴 Tomáš Votruba라는 사람이 만들었는데, PHP 5.3부터 PHP 5.6까지의 코드를 PHP 7.4 버전으로 마이그레이션/리팩토링 해주고, Symfony는 2.8에서 4.2, Laravel은 static code를 생성자 인젝션으로 패턴을 바꿔줍니다. 이외에 각자 원하는 방식으로 규칙을 추가할 수 있다고 하네요.

이외에는 NEON(Nette Framework에서 쓰는 듯) 문법을 YAML로, 하나는 Latte files to TWIG syntax 문법 변환을 해주는 툴입니다.

툴이 많은 걸 해주지만 20%는 수작업으로 해야만 했다고 합니다.

Running tests for PHPUnit from within PhpStorm

https://localheinz.com/blog/2019/04/27/running-tests-for-phpunit-itself-from-within-phpstorm/

다들 테스트 잘 만들고 계시죠? PhpStorm에서 PHPUnit을 설정하는 방법을 설명합니다.

azdanov/php-interview-exercises

https://github.com/azdanov/php-interview-exercises

다들 이직 준비는 잘 하고 계시죠? PHP 코딩 인터뷰를 연습할 수 있는 repo입니다. 정답도 있지만 직접 풀어보는 게 좋겠죠?

Find Segfaults in PHP like a boss

https://jolicode.com/blog/find-segfaults-in-php-like-a-boss

종종 발생하는 segfault 문제를 파악하는 방법입니다.

Tick이란 건 파서가 low-level tickable statement를 실행할 때마다 발생하는데, 이때마다 실행할 함수를 등록할 수 있습니다.

이 블로그에선 그동안 아래와 같이 등록해서 검사했었는데,

1
2
3
4
5
6
7
8
9
register_tick_function(function() {
$bt = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 1);
$last = reset($bt);
$info = sprintf("%s +%d\n", $last['file'], $last['line']);
file_put_contents('/tmp/segfault.txt', $info, FILE_APPEND);
// or
// file_put_contents('php://output', $info, FILE_APPEND);
});
declare(ticks=1);

그건 PHP의 버그 때문에 발생한 것이었고, PHP 7.0부터는 버그가 수정돼서 사용할 수가 없다고 합니다. declare(ticks=1)은 선언된 파일에만 적용되도록 말이죠.

그렇다고 모든 PHP 파일마다 이걸 넣기도 싫어서 생각한 방법이 PHP Stream Wrapper와 Stream Filter를 이용하는 방식이라고 합니다. 파일을 메모리에 읽어들일 때 declare(ticks=1)를 넣어줍니다.

https://www.tomasvotruba.cz/php-framework-trends/

다운로드 통계를 기반으로 PHP frameworks의 경향을 보여주는 사이트입니다.

버전별 다운로드 통계도 보실 수 있습니다.

Serverless PHP With Bref

https://www.phparch.com/2019/05/serverless-php-with-bref-part-one/

AWS Lambda에서 PHP를 실행하는 방법을 설명합니다.

AWS SAM을 활용하는 Bref라는 툴을 쓰는데요.

Bref provides the tools and documentation to easily deploy and run serverless PHP applications.

문서를 보면 Laravel, Symfony 같은 프레임웍을 올릴 수도 있습니다.