1. 1. ⚡️ News & Releases
    1. 1.1. PhpStorm 2020.1 EAP started
    2. 1.2. [Internal] Election results
  2. 2. 🐘 PHP Internals
    1. 2.1. [RFC] Allow function calls in constant expressions
    2. 2.2. [RFC] __toArray()
    3. 2.3. [RFC] Userspace operator overloading
    4. 2.4. [RFC] Validation for abstract trait methods
    5. 2.5. [RFC] Server-Side Request and Response Objects v2
    6. 2.6. Generics in PHP
    7. 2.7. php/doc-en
  3. 3. 🛠 Tools
    1. 3.1. PHPUnit 9
    2. 3.2. cycle/orm 1.2
    3. 3.3. lisachenko/z-engine
    4. 3.4. salsify/jsonstreamingparser
    5. 3.5. spatie/docker
    6. 3.6. symfony/polyfill-php80
    7. 3.7. BenMorel/weakmap-polyfill
    8. 3.8. paratestphp/paratest
  4. 4. Symfony
    1. 4.1. A story of finding performance issues in a Symfony application
    2. 4.2. Grant on permissions, not roles
    3. 4.3. A Week of Symfony #684 (February 3-9, 2020).
  5. 5. Laravel
    1. 5.1. pavel-mironchik/laravel-backup-panel
    2. 5.2. avto-dev/roadrunner-laravel
    3. 5.3. laravelpackage.com
    4. 5.4. Authentication and Laravel Airlock
    5. 5.5. Containerizing Laravel 6 application
    6. 5.6. How to use mixins in Laravel.
    7. 5.7. Laravel beyond CRUD
    8. 5.8. 📺 Tips for simplifying Laravel controllers.
    9. 5.9. 🔈 Taylor’s podcast: Laravel Snippet #22
  6. 6. Zend/Laminas
    1. 6.1. The last post in Zend Framework blog
  7. 7. Async PHP
    1. 7.1. driftphp/awesome-reactphp
  8. 8. 기타 읽을 만한 글
    1. 8.1. PHP in 2020
    2. 8.2. New in PHP 8.
    3. 8.3. Enums without enums in PHP
    4. 8.4. Type matching in PHP
    5. 8.5. My PhpStorm settings after 8 years of use.
    6. 8.6. Modern PHPDoc Annotations for arrays
    7. 8.7. Benchmark of PHP 7.4 preloading
    8. 8.8. A history of optimizing the performance of a monolith app
    9. 8.9. On aspect-oriented programming
    10. 8.10. Redux in 30 lines of PHP.
    11. 8.11. An anonymous researcher published exploits
  9. 9. Videos
  10. 10. 🔈 Podcasts

php-annotated-february-2020

Php_annotated_monthly 이미지

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

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


⚡️ News & Releases

PhpStorm 2020.1 EAP started

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

PhpStorm 2020.1 EAP 프로그램이 시작됐습니다. 아래와 같은 개선이 있었습니다.

  1. Composer support

프로젝트에 composer.json이 존재하는 PhpStorm 유저의 20% 만이 PHP composer.​json support를 설치했다고 합니다.

PhpStorm team이 이를 새로 개발할 수 있게 플러그인 개발자인 Piotr Śliwa에 연락했습니다. 이번에 개선된 기능은,

  • 우클릭으로 프로젝트에 composer.json을 만들기
  • 새 composer.json 템플릿 수정 기능
  • composer.json 안에 라이센스와 최소 안정화 버전을 쉽게 지정
  • 설치 가능한 PHP와 모듈, 의존성 라이브러리의 이름이나 버전을 제안하는 기능
  • 패키지의 업데이트/설치 지원
  • 이름을 클릭하면 project tree의 vendor에서 해당 위치로 이동
  • Autoload 영역 자동 완성
  • scripts 영역에 command 추가 가능 & 실행 가능
  1. krakjoe/pcov를 활용한 Code Coverage 측정

  2. Customize Lexer Syntax for Twig

  3. 그리고 모든 JetBrains IDE에 적용되는 개선 사항

  • JetBrains Mono 폰트 추가
  • 개선된 Interactively Rebase from Here dialog
  • IntelliJ Light 테마
  • Quick documentation popup이 mouseover로 동작

새로운 소식이나 비디오 시리즈를 빨리 받고 싶으시면 @phpstorm를 팔로우하거나 유튜브에서 JetBrainsTV를 구독하시면 됩니다.
What’s Coming in PhpStorm 2020.1이라는 시리즈를 만들었답니다. 📺 Episode 1이 올라왔습니다.

[Internal] Election results

https://groups.google.com/forum/#!topic/php-fig/M_Np9Gh9Omc

PHP-FIG에서 선거가 있었다는 소식

🐘 PHP Internals

[RFC] Allow function calls in constant expressions

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

현재 PHP 버전에서는 상수 선언에서 리터럴이나 제한된 연산만을 허용하는데, 여기서는 상수 선언이나 static property, static 변수, 함수 파라미터에서 global 함수를 쓸 수 있게 제안합니다.

1
2
3
4
5
6
7
8
9
10
11
class MyClass {
const VALUES = [1, 0];
const C1 = count(self::VALUES);

public static $p = count(self::VALUES);

public function foo($param = count(self::VALUES))
{
static $bar = count(self::VALUES);
}
}

[RFC] __toArray()

https://wiki.php.net/rfc/to-array

새로운 magic method __toArray()를 제안합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
class Person
{
protected $name;
protected $email;
public function __toArray()
{
return [
'name' => $this->name,
'email' => $this->email,
];
}
}

$person = new Person('John Doe', 'j.doe@example.com');

$personArray = (array) $person; // Calls __toArray()

function foo(array $person) {
var_dump($person); // Array here
}

function bar(Person $person): array {
return $person;
}

var_dump(bar($person)); // and here it's an array

[RFC] Userspace operator overloading

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

Python, C#, C++에서와 같이 연산자 오버로딩을 허용하자는 제안입니다. 이미 PHP의 내부 메커니즘은 이를 지원할 수 있게 되어있다는 군요. 아직 RFC는 draft 상태이지만, Internals 내부에서는 활발히 논의되고 있습니다.

lisachenko/z-engine를 활용해 PHP 7.4의 FFI로 미리 체험 해보실 수 있습니다.

[RFC] Validation for abstract trait methods

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

Trait의 추상 메소드를 구현할 때는 타입 체크를 하지 않는데, 예를 들어 아래 코드는 에러 없이 실행됩니다.

1
2
3
4
5
6
7
8
9
10
trait T {
abstract public function test(int $x);
}

class C {
use T;

// It works now, but it shouldn't because of a type mismatch
public function test(string $x) {}
}

이를 바로 잡는 제안이 올라왔습니다. 다만 해당 PR에 하위호환을 해치는 코드가 있어 RFC 프로세스가 계속 진행 중입니다.

[RFC] Server-Side Request and Response Objects v2

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

$_GET, $_POST, $_SERVER 같은 superglobal 배열을 ServerRequest라는 클래스로 대체하자는 제안입니다.
header()를 사용하는 곳에선 ServerResponse 클래스로 대체합니다.

Generics in PHP

최근 Nikita Popov가 PHP에 generics를 넣기 위한 연구를 진행하고 있습니다. 몇가지 심각한 어려움도 있고, PHP에 완전한 generics를 도입하는 것이 좋은 생각일지 확신이 서지 않는다고 합니다.

Prototype 구현은 pull request이 올라와 있고, 모든 문제점과 의문은 이 곳에서 확인하실 수 있습니다 : https://github.com/PHPGenerics/php-generics-rfc/issues/45

php/doc-en

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

영어 documentation은 GitHub에서 pull-request를 통해 수정할 수 있습니다. 기존에는 edit.php.net에서 했어야 했죠.

🛠 Tools

PHPUnit 9

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

PHP 7.3+ 이상을 요구하는 PHPUnit 9이 릴리스됐습니다. 하위 호환이 깨지는 변경 사항도 있습니다. migration instruction를 읽어보세요.

cycle/orm 1.2

https://github.com/cycle/orm

DataMapper로 혹은 ActiveRecord로도 사용할 수 있는 ORM인데, benchmarks에서 성능이 33%나 개선되어 가장 빠른 ORM 중 하나가 됐습니다.

lisachenko/z-engine

https://github.com/lisachenko/z-engine#abstract-syntax-tree-api

위에서 언급됐던, 실험적 성격의 라이브러리입니다.

FFI를 사용해서 PHP 내부 구조에 접근할 수 있게 해줍니다. 이를 사용하는 예제로 immutable objects, 즉석에서 AST를 변경 등이 있습니다.

salsify/jsonstreamingparser

https://github.com/salsify/jsonstreamingparser

아주 큰 JSON 문서를 한번에 읽어들이지 않고 스트림으로 받아 파싱하는 라이브러리입니다.

spatie/docker

https://github.com/spatie/docker

PHP로 Docker container를 관리할 수 있습니다. 블로그 Manage Docker containers using PHP를 읽어보세요.

symfony/polyfill-php80

https://github.com/symfony/polyfill-php80

PHP 8.0 polyfill입니다.

BenMorel/weakmap-polyfill

https://github.com/BenMorel/weakmap-polyfill

PHP 7.4를 위한 WeakMap polyfill입니다.

paratestphp/paratest

https://github.com/paratestphp/paratest

PHPUnit 9와 호환되는 PHPUnit을 병렬로 실행해주는 도구입니다.

Symfony

A story of finding performance issues in a Symfony application

https://jolicode.com/blog/battle-log-a-deep-dive-in-symfony-stack-in-search-of-optimizations-1-n
https://jolicode.com/blog/battle-log-a-deep-dive-in-symfony-stack-in-search-of-optimizations-2-n

Symfony application에서 성능 문제를 찾아가는 여정

Grant on permissions, not roles

https://wouterj.nl/2020/01/grant-on-permissions-not-roles

권한 부여를 role에 하지 말고 voter를 활용하라는 이야기

A Week of Symfony #684 (February 3-9, 2020).

https://symfony.com/blog/a-week-of-symfony-684-3-9-february-2020

Laravel

pavel-mironchik/laravel-backup-panel

https://github.com/pavel-mironchik/laravel-backup-panel

spatie/laravel-backup의 웹 인터페이스. 브라우저에서 백업을 관리할 수 있습니다.

avto-dev/roadrunner-laravel

https://github.com/avto-dev/roadrunner-laravel

새로운 버전의 RoadRunner worker. RoadRunner와 Laravel applications을 쉽게 연결 해줍니다.

laravelpackage.com

https://laravelpackage.com/

라라벨 패키지를 만들기 위한 자세한 가이드.

Authentication and Laravel Airlock

laravel/airlock을 사용한 인증

Containerizing Laravel 6 application

https://www.digitalocean.com/community/tutorials/containerizing-a-laravel-6-application-for-development-with-docker-compose-on-ubuntu-18-04

for development with Docker Compose and Ubuntu 18.04.

How to use mixins in Laravel.

https://liamhammett.com/laravel-mixins-KEzjmLrx

Laravel에서 mixin은 어떻게 만드는가.

Laravel beyond CRUD

https://stitcher.io/laravel-beyond-crud

Laravel beyond CRUD라는 시리즈입니다. 현재 09. Test factories까지 발표됐습니다.

  1. Domain oriented Laravel
  2. Working with data
  3. Actions
  4. Models
  5. States
  6. Managing domains
  7. Entering the application layer
  8. View models
  9. Test factories

📺 Tips for simplifying Laravel controllers.

https://laracasts.com/series/guest-spotlight/episodes/5

guest-spotlight라는 라라캐스트 무료 강좌 시리즈 중 controller를 가볍게 만드는 법.

🔈 Taylor’s podcast: Laravel Snippet #22

https://blog.laravel.com/laravel-snippet-22-laracon-online-inertiajs-livewire-spas-reviewing-the-day

Laracon Online, Inertia.js, Livewire, SPAs, Reviewing The Day.

Zend/Laminas

The last post in Zend Framework blog

https://framework.zend.com/blog/2020-01-24-laminas-launch

Zend Framework blog의 마지막 글이 올라왔습니다. 이제 완전히 Laminas로 이전했습니다.

Async PHP

📺 Interview with Marc Morera

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

An author of DriftPHP, about asynchronous PHP, DriftPHP and ReactPHP.

driftphp/awesome-reactphp

https://github.com/driftphp/awesome-reactphp

ReactPHP판 awesome 시리즈.

기타 읽을 만한 글

PHP in 2020

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

An overview of the language and ecosystem state.

New in PHP 8.

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

2020년 말 릴리스 될 것으로 예상되는 PHP8에 새로운 기능을 소개합니다.

Enums without enums in PHP

https://stitcher.io/blog/enums-without-enums

익명 클래스로 enum을 흉내냅니다.

Type matching in PHP

https://steemit.com/php/@crell/type-matching-in-php

Rust의 match construct를 PHP에서 arrow 함수로 구현했습니다.

My PhpStorm settings after 8 years of use.

https://stefanbauer.me/articles/my-phpstorm-settings-after-8-years-of-use

8년 동안 PhpStorm을 사용한 누군가의 세팅.

Modern PHPDoc Annotations for arrays

https://suckup.de/2020/02/modern-phpdoc-annotations/

PhpStorm에서 배열을 위한 annotation 작성법. PhpStorm에선 deep-assoc-completion plugin을 사용할 것을 권장합니다.

Benchmark of PHP 7.4 preloading

https://developer.happyr.com/php-74-preload

Symfony application에서의 벤치마킹 자료입니다. 성능 향상이 꽤 있습니다.

A history of optimizing the performance of a monolith app

https://medium.com/pipedrive-engineering/how-two-developers-accelerated-php-monolith-in-pipedrive-df8a18bc2d8a

Blackfire.io로 측정해가면서, PHP monolith 어플리케이션을 개선해나가는 과정을 보여줍니다.

On aspect-oriented programming

https://medium.com/@ivastly/application-instrumentation-with-aspect-oriented-programming-in-php-18b1defa682

Go!AOP로 PHP에서 AOP를 도입하는 예시를 소개합니다.

Redux in 30 lines of PHP.

https://sorin.live/redux-in-50-lines-of-php/

30줄로 Redux 구현하기.

An anonymous researcher published exploits

https://github.com/mm0r1/exploits

익명의 제보자가 disable_functions 옵션을 처리하는 과정에서의 취약성을 보고했습니다. 여기서 더 자세히 알아보세요.

Videos

🔈 Podcasts