php-annotated-monthly-february-2019

Php_annotated_monthly 이미지

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

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


News & Releases

PSR

https://github.com/php-fig/fig-standards/blob/master/proposed/event-dispatcher.md

PSR-14 Event Dispatcher가 review stage로 넘어갔다는 소식.

아시겠지만(‘나는 알지롱’이란 뜻), PSR Workflow에 따르면 PSR이 제정되는 단계는 아래와 같습니다.

1
Pre-Draft -> Draft -> Review -> Accepted (-> DEPRECATED)

https://github.com/php-fig/fig-standards/blob/master/proposed/extended-coding-style-guide.md

PSR-12 Extended Code Style도 review stage에 도달했습니다.

PSR-2가 2012에 accepted됐고, 그동안 PHP에 많은 변화가 있어서(PHP 7이 2015년 12월에 release됐죠) 최신 PHP 스펙을 반영하자는 취지로 보입니다.

PSR-12는 PSR-1에 기초하고 있고, PSR-2를 대체합니다.

PSR이 review 단계에 왔다는 것은 시험 구현체(trial implementations)를 검토하게 되는데요. JetBrains, PHPCS 등에도 이를 반영해야 한다는 논의가 되고 있습니다.

바로 뒤에 소개할 2019.1 EAP에서도 ‘Sort use statements’쪽을 보시면 use statement 순서를 조정하는 것으로 적용되었습니다.

PhpStorm 2019.1 EAP

https://blog.jetbrains.com/phpstorm/2019/01/phpstorm-2019-1-early-access-program-is-open/

Focus mode 재밌네요.

요즘 EAP를 보면 이제 할 수 있는 건 이미 다 했다의 느낌이기도 하고요.

PHPUnit Version 8

https://phpunit.de/announcements/phpunit-8.html

PHPUnit 8 버전이 새로 나왔고 PHP7.2이상을 요구합니다.

PEAR was hacked

https://thephp.cc/news/2019/02/blast-from-the-past

슬픈 소식입니다.

If you downloaded go-pear.phar between December 20, 2018 and January 19, 2019 and used it on a system that has sh and perl available then you must consider that system to be compromised, and take responsible action.

저도 나이 드니까 여기 저기 아프더라고요.

PHP Internals

PHP-7.4 branched, master is PHP 8.0

https://externals.io/message/103862

드디어 PHP 8.0 개발이 시작됐습니다. PHP 7.4와 PHP 8.0을 병렬로 개발한다는 소식입니다.

Deprecated된 스펙은 이미 지워버렸고, 도커 허브의 phpdaily/php를 통해 체험해보실 수 있습니다.

[RFC] JIT

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

Dmitry Stogov가 제안을 넣었습니다.

RFC에 따르면 OPcache와는 독립된 부분으로 개발되고, OPcache shared memory 영역을 사용할 것으로 보입니다.

PHP JIT is implemented as an almost independent part of OPcache… When enabled, native code of PHP files is stored in an additional region of the OPcache shared memory…

Nikita Popov의 벤치마크에 따르면, 프로젝트(PHP-Parser, amphp/http-server)에 따라 5% ~ 30% 정도의 성능 향상이 있었다고 합니다.

php-jit 도커 이미지에서 체험하실 수 있습니다.

추가로 PHP JIT에 관한 좋은 글도 소개주고 있는데요. 극단적인 상황에서 PHP7과 PHP-JIT의 성능을 비교해주기도 하고, 그러나 웹 어플리케이션에서는 그만큼의 성능 향상을 보일 수는 없고, PHP 사용자나 PHP 언어 자체의 유지보수를 어렵게 할 수 있다고 우려하기도 합니다. 아직 linux 환경에서만 가능하고 일반적인 개발환경(Windows, Mac)에서의 지원 여부도 아직은 불투명한 상황이라고 합니다.

[RFC] Weak References

저는 다른 언어에서 Weak References를 써본 적이 없고 왜 필요한 지는 잘 모르겠습니다만, 현재 extension을 통해 PHP에서도 사용할 수는 있다는군요.

[RFC] Null Coalescing Assignment Operator

2년 전에 accepted된 제안인데, 7.4에 구현되었다고 합니다.

1
2
3
function (array $parameters = []) {
$parameters['property'] ??= 'default';
}

이 코드는 아래와 동등합니다.

1
2
3
function (array $parameters = []) {
$parameters['property'] = $parameters['property'] ?? 'default';
}

PHP의 축약형 연산자는 Shorthand comparisons in PHP에서 더 확인하실 수 있습니다.

[RFC] New custom object serialization mechanism

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

PHP는 두가지 커스텀 직렬화 매커니즘을 지원하는데요.

  • __sleep() / __wakeup() magic methods
  • Serializable interface

여기에는 사용성 면에서나 아래 코드처럼 상속관계에서 중첩된 직렬화를 시도할 때 등 몇가지 문제가 있습니다.

1
2
3
4
5
6
class A implements Serializable {
...
public function serialize() {
return serialize([$this->prop, parent::serialize()])
}
...

새로운 RFC에서는 두가지 magic method를 추가합니다.

1
2
3
4
5
// Returns array containing all the necessary state of the object.
public function __serialize(): array;

// Restores the object state from the given data array.
public function __unserialize(array $data): void;

왜 interface가 아닌 magic method냐는 질문에는, PHP는 기본적으로 모든 object를 직렬화할 수 있고 Serializable interface를 구현하지 않더라도 여전히 가능하기 때문에 magic method가 좀 더 시맨틱하기 때문이라는군요.

[RFC] Consistent type errors for internal functions

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

사용자 정의 함수는 잘못된 parameter가 전달되면 TypeError를 뱉지만, 내장 함수는 상황에 따라 다르지만 기본적으로 warning을 발생시키고 null을 리턴합니다. 이 RFC는 예외없이 모든 파라미터 오류에 대해 TypeError exception을 던지도록 제안합니다.

PHP 8.0을 target으로 하고 있고 하위 호환을 해치므로 주의해야할 것입니다.

기타

[RFC] Allow void return type variance

  • 아직 Under Discussion 상태인데, return type이 void인 경우 하위 클래스에서 다른 type을 리턴할 수 있께 선언할 수 있습니다. 하지만 void return type이 아닌 경우 다시 void로 지정하는 것은 안 됩니다.

PHP RFC: Annotations 2.0

  • 많은 분들이 기다리시는 annotation을 위한 RFC이고, 현재 Draft 상태입니다.

기타 읽을 만한 글

How to Kill Parents

https://www.tomasvotruba.cz/blog/2019/01/24/how-to-kill-parents/

When to declare classes final라는 글을 쓴 Marco Pivetta가 4년 후 더 자극적인 제목으로 추가 포스팅을 올렸습니다.

개발자들은 상속을 통해 문제를 해결하는 경향이 있는데, 상속 보다는 구성을 통해 해결하기 위해, 더 나은 설계를 위해, 가능하면 항상 final을 쓰라고 권고합니다.

Moving from Go to PHP again

https://dannyvankooten.com/from-go-back-to-php-again/

PHP(Laravel)을 떠나 Go로 돌아갔던 저자가 다시 PHP로 돌아왔다는 이야기입니다. GO는 여전히 좋고 퍼포먼스가 뛰어나서 필요할 땐 여전히 사용할 용의가 있지만 서비스 운영에는 쉽지 않았던 모양입니다. Symfony4가 엄청 엄청 좋다는 게 결론입니다.

it’s great. Really, really great.

Video

Beachcasts Tech Videos

http://beachcasts.com/

Adam Culp란 사람의 동영상 강의 시리즈입니다.

Astrocasts

https://astrocasts.com/browse

Beau Simensen란 사람의 동영상 강의도 추천한답니다.