ha-ah

로그, 게으른 로그

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

Php_annotated_monthly 이미지

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

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


⚡️ News & Releases

PHP turned 25

https://www.jetbrains.com/lp/php-25/?_ga=2.202675409.1336001967.1592964633-44216834.1547258235

PHP가 25살이 되었습니다. PHP 역사에서 가장 인상적인 순간과 함께 타임라인을 살펴보세요.

PHP 7.4.7

https://www.php.net/releases/7_4_7.php

무엇보다도 yield from 버그가 해결되었습니다.

  • 7.4.6 버전은 스킵하는 게 좋을 거라는군요.

PHP 7.3.19

https://www.php.net/releases/7_3_19.php

Composer 2.0.0-alpha1

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

The State of Developer Ecosystem in 2020

https://www.jetbrains.com/lp/devecosystem-2020/php/?_ga=2.158784506.1336001967.1592964633-44216834.1547258235

The State of Developer Ecosystem in 2020에서 PHP 섹션으로 바로 넘어가는 링크입니다.

응답자의 65%가 디버깅할 때 ‘dump & die’ 방식을 선택한다고 응답했습니다. 이에 Xdebug의 제작자인 Derick Rethans의 트윗은 커뮤니티에서 강한 반응을 일으켰습니다.

PHP developers that don’t use Xdebug for debugging are amateurs.

🐘 PHP Internals

✅ [RFC] Attribute Amendments

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

PHP 8에 accepted 된 기존 Attributes RFC에 몇가지 스펙을 추가했습니다.

  • PhpAttribute class를 Attribute로 rename
  • <<Attr1, Attr2>>처럼 그루핑하는 기능
  • Validation
  • 여러개의 동일한 속성을 추가하는 기능

✅ [RFC] Ensure correct signatures of magic methods

https://wiki.php.net/rfc/magic-methods-signature

지금까지는 magic method를 클래스 안에서 이렇게 선언할 수 있었습니다.

class Foo
{
function __get(int $name): void
{
echo $name;
}
}
(new Foo)->{42};

PHP 8부터는 메소드의 유효성을 검증하게 되고, compile-time error를 발생시킵니다. 위 코드는 첫번째 인자를 string이 아닌 값으로 선언했기 때문입니다. 이 버그 리포트도 참고하세요.

[RFC] Make sorting stable

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

PHP 8부터는 모든 표준 정렬 함수(sort, usort, asort, etc.)가 안정적(stable)으로 동작할 것입니다. 같은 값이라면 순서가 보장됩니다. 최신 버전에서는 stable하지 않게 동작하는 예를 찾기 어렵지 않습니다.

❌ [RFC] Opcache optimization without any caching

https://wiki.php.net/rfc/opcache.no_cache

거절됐습니다. (Declined)

[RFC] Make constructors and destructors return void

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

현재 버전의 PHP에서는 constructor나 destructor에서 아무 값이나 리턴할 수 있습니다. 예를 들면,

class Test {
public function __construct() {
return 0;
}
}

$test = new Test();

// this prints 0
echo $test->__construct();

Benas Seliuginas는 이런 상황에서 Deprecated warning을 던질 것을, 그리고 PHP 9에서는 이를 제거하고 Fatal Error를 발생시킬 것을 제안했습니다.

[RFC] Treat namespaced names as single token

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

인터프리터는 namespace의 각 요소를 분리된 토큰으로 다룹니다. 이것이 namespace에 키워드를 사용할 수 없는 이유였습니다. 예를 들어, namespace app\function { class Foo {} };는 Parse Error를 발생시킵니다. Nikita Popov는 새로운 키워드가 소개될 때 하위 호환을 문제를 최소화하기 위해, 전체 namespace를 하나의 토큰으로 고려할 수 있도록 제안했습니다.

[RFC] Rename T_PAAMAYIM_NEKUDOTAYIM to T_DOUBLE_COLON

https://wiki.php.net/rfc/rename-double-colon-token

:: 토큰은 PHP에서 T_PAAMAYIM_NEKUDOTAYIM라고 불립니다. 이 문제는 PHP Sadness에서도 첫번째로 언급되었습니다. George Peter Banyard와 Kalle Sommer Nielsen은 이름을 바꾸길 제안했습니다.

이 monthly를 작성하는 Roman Pronskiy는,
“오류 메시지가 항상 ::를 참조하므로 이것이 의미가 있는지 확실하지 않습니다. 게다가 재밌는 역사적인 특정을 왜 지워야 하죠?”라고 하네요.

paamayim nekudotayim은 원래 이스라엘 사람이 작성한 Zend Engine에서 소개된 단어인데, double colon이라는 뜻입니다.

[RFC] Shorter Attribute Syntax

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

Attribute는 이미 PHP 8에 accepted 됐지만, 많은 사람들은 그 문법을 좋아하지 않았습니다. 세가지 옵션이 투표에 올라왔습니다.

<<Attr>> (현재 방식) vs. @@Attr vs. #[Attr]

Brent Roоse는 #[ ] 문법에 대해 몇 가지 설득력 있는 주장을 했습니다.

  • Rust와 같은 문법이며 이 또한 C 기반의 언어입니다.
  • 오래된 코드와 호환됩니다. #[Attribute] 문법은 PHP <=7.4까지 comment로 취급될 것입니다.
  • @@는 에러 억제 연산자와 혼동될 수 있습니다. (예시)
  • <<>> 역시 bit-shift 연산자와 혼동될 수 있습니다. 미래에는 단일 꺽쇄 연산자를 쓸 수도 있는 generics 문법과도 혼동될 수 있습니다.

그동안, @@이 더 많은 표를 받는 것으로 보입니다.

[RFC] Change terminology to ExcludeList

https://wiki.php.net/rfc/change-terminology-to-excludelist

불쾌감을 주는 용어(master/slave and blacklist)의 이름을 바꾸는 주제는 PHP 세계에서도 간과되지 않았습니다. Internals에서 열띈 토론이 있었습니다.

PHP 코어에서 이 변경 사항은 설정 지시자 단 한 부분에서만 영향을 미칩니다. opcache.blacklist_filename에서 opcache.exclude_list_filename를 바꾸려고 합니다. 많은 PHP 도구들은 이미 이와 관련하여 변경됐습니다 : PHPUnit, Drupal, Xdebug, Yii, Composer (+ working with non-master Git branches).

이런 불쾌감을 주는 단어를 찾기 위한 PHP_CodeSniffer 규칙 세트에 대한 토론도 있었습니다.

[RFC] Nullsafe operator

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

여러 중첩된 조건 대신, Ilija Tovilo는 null을 확인하기 위해 property 또는 method를 참조하는 기능을 추가할 것을 제안했습니다.

$country = $session?->user?->getAddress()?->country;

지금은 이렇게 체크해야 하죠.

$country =  null;

if ($session !== null) {
$user = $session->user;

if ($user !== null) {
$address = $user->getAddress();

if ($address !== null) {
$country = $address->country;
}
}
}

PHP 8.0 release schedule was updated

https://wiki.php.net/todo/php80

기능 확정(feature freeze)은 8월 4일로, 최종 릴리스(GA)는 11월 26일로 날짜가 변경됐습니다.
다른 활성 브랜치(7.4.13, 7.3.25)의 릴리스와 스케줄을 맞추기 위해서라는군요.

3v4l.org

https://3v4l.org/

PHP 8을 3v4l.org에서 사용해보실 수 있습니다. php-master branch에서 결과를 확인해보세요.

🛠 Tools

beyondcode/expose

https://github.com/beyondcode/expose

ReactPHP 위에 순수한 PHP로 구현된 터널링 서비스입니다. 여러분만의 자체 호스팅 서버도 실행할 수 있습니다. how it works 페이지에서 자세히 알아보세요.

pestphp/pest

https://github.com/pestphp/pest

PHPUnit 위에 구축되고 테스트를 간단하고 우아하게 작성할 수 있게 도와주는 도구입니다. 공식 문서와 많은 동영상 강좌도 있습니다. facebook/jest에서 영감을 받았다고 하네요.

Moxio/sqlite-extended-api

https://github.com/Moxio/sqlite-extended-api

FFI와 lisachenko/z-engine이 서로 어떻게 도움을 줄 수 있을지 실제 구현된 예제입니다. 이 패키지는 표준 PHP 드라이버에서는 할 수 없는 SQLite API 메소드를 제공합니다.

FriendsOfPHP/pickle

https://github.com/FriendsOfPHP/pickle

Composer와 호환되는 PECL extension 관리도구입니다. 2015 이후 첫 업데이트가 있었고, 결국 Composer와 완전히 통합할 계획을 세웠습니다.

doctrine/migrations 3.0.0

https://github.com/doctrine/migrations/releases/tag/3.0.0

DB 마이그레이션을 처리하는, 잘 알려진 패키지의 주요 업데이트.

Symfony

Symfony 5.1 was released.

https://symfony.com/blog/symfony-5-1-curated-new-features

Symfony 5 certification is now available

https://symfony.com/blog/the-symfony-5-certification-is-now-available

In Symfony 6, configurations will be handled in usual PHP files

https://github.com/symfony/symfony/issues/37186

Symfony 6에서 configuration 설정에 YAML이나 XML 대신 PHP file을 사용하기로 했습니다.

dbu/snake-bundle

https://github.com/dbu/snake-bundle

symfony/console로 구현한 snake game

How much of a performance boost can you expect for a Symfony 5 app with PHP OPcache preloading?

https://www.ibexa.co/blog/how-much-of-a-performance-boost-can-you-expect-for-a-symfony-5-app-with-php-opcache-preloading

PHP OPcache preloading으로 얼마나 성능을 개선할 수 있을지 실험한 결과입니다.
현실적인 예제에서는 평균 10% 정도의 개선이 있는 것으로 보입니다.

10 Symfony testing tips.

https://blog.cemunalan.com.tr/2020/02/02/10-symfony-testing-tips/

Protect Symfony app against the OWASP Top 10 threats.

https://nicwortel.nl/blog/2020/06/07/protect-symfony-application-against-owasp-top-10-security-risks

PHP에서 10가지 주요 보안 위협을 대응하는 방법을 살펴 봅니다.

  1. Injection
  2. Broken authentication
  3. Sensitive data exposure
  4. XML external entities (XXE)
  5. Broken access control
  6. Security misconfiguration
  7. Cross-site scripting (XSS)
  8. Insecure deserialization
  9. Using components with known vulnerabilities
  10. Insufficient monitoring & logging

Laravel

spatie/laravel-cronless-schedule

https://github.com/spatie/laravel-cronless-schedule

cron 없이 예약 작업을 수행하는 패키지입니다. 내부적으로는 ReactPHP와 timer를 사용합니다. 소개 페이지에서 더 자세히 알아보세요.

Laravel Debugbar vs. Telescope Toolbar

https://barryvdh.nl/laravel/debugbar/telescope/2020/06/14/laravel-debugbar-vs-telescope-toolbar/

글쓴이는 Telescope를 이미 사용하고 있다면, 부하를 피하기 위해서 Telescope Toolbar를 추천한다고 합니다. Laravel Debugbar를 선호하지만 너무 무겁다고 생각되면 Telescope Toolbar를 사용해보라고 하네요.

Adding try/catch Laravel collections.

https://freek.dev/1691-adding-trycatch-to-laravel-collections

Jason McCreary라는 사람이 트위터에서 try/catch를 chaining하는 아이디어를 이야기했고, 글쓴이(Van der Herten)와 페어 코딩을 진행해서 laravel-collection-macrostrycatch 메소드를 추가했습니다. 이를 사용하는 법과 작동 원리를 소개하는 글입니다.

Laravel package ecosystem statistics.

https://itnext.io/laravel-package-ecosystem-4afd53fad192

tactics you can use to write cleaner code in Laravel

https://twitter.com/samuelstancl/status/1272822437181378561

Yii

Yii2 & Doctrine ORM simple integration.

https://medium.com/rigor-guild/yii2-doctrine-orm-simple-integration-fb0625002a40

Zend/Laminas

Is Zend Framework Dead?

https://www.youtube.com/watch?v=5luPg2oVUIk

Laminas project의 lead인 Matthew Weier O’Phinney가 “Zend Framework이 죽었는가?”라는 질문을 포함한 또 다른 질문에 답을 합니다.

asgrim/mini-mezzio

https://github.com/asgrim/mini-mezzio

이 패키지를 사용하여 Mezzio 애플리케이션을 더욱 빠르게 설정하십시오.

🌀 Async PHP

badfarm/zanzara

https://github.com/badfarm/zanzara

ReactPHP 기반의 Telegram bot을 만들어주는 비동기 프레임웍.

simple-swoole/simps

https://github.com/simple-swoole/simps

Swoole 기반의 프레임웍. Benchmark에 따르면 PHP로 작성된 것 중에는 가장 빠릅니다.

📺 Video course on ReactPHP by Marcel Pociot.

https://beyondco.de/video-courses#:~:text=Learning%20ReactPHP

💡 기타 읽을 만한 글

Introducing the new Serverless LAMP stack

https://aws.amazon.com/blogs/compute/introducing-the-new-serverless-lamp-stack/

AWS 블로그에 올라온 serverless PHP 사용법과 Serverless LAMP stack을 주제로 한 커뮤니티의 좋은 자료가 소개됐습니다.

또한, Amazon의 공식 AWS Toolkit 플러그인도 이제 PhpStorm에서 사용할 수 있습니다.

Constructor promotion in PHP 8

https://stitcher.io/blog/constructor-promotion-in-php-8

PHP 8에서는 아래처럼 작성하는 대신

class CustomerDTO
{
public string $name;

public string $email;

public DateTimeImmutable $birth_date;

public function __construct(
string $name,
string $email,
DateTimeImmutable $birth_date
) {
$this->name = $name;
$this->email = $email;
$this->birth_date = $birth_date;
}
}

이렇게 사용할 수 있습니다.

class CustomerDTO
{
public function __construct(
public string $name,
public string $email,
public DateTimeImmutable $birth_date,
) {}
}

이런 Constructor property 승격(promotion)이 어떻게 동작하는지 자세히 설명합니다.

What are the top most used PHP functions in frameworks?

https://thephp.website/en/issue/most-used-php-functions/

Symfony에서는 sprintf(), 라라벨에서는 is_null()입니다. 다른 프레임 워크에 대해 유사한 통계를 계산하는 방법에 대한 지침도 있습니다.

final classes in PHP

https://medium.com/swlh/final-classes-in-php-9174e3e2747e

Final class의 이점.

The fastest template engine for PHP

https://medium.com/@gotzmann/the-fastest-template-engine-for-php-b5b461b46296

Unit test naming conventions

https://matthiasnoback.nl/2020/06/unit-test-naming-conventions/

📺 Videos

PHP Russia 2020 Online

https://habr.com/ru/company/badoo/blog/487264/

How to generate and view code coverage reports in PhpStorm using PHPUnit and Xdebug

https://freek.dev/1674-how-to-generate-and-view-code-coverage-reports-in-phpstorm-using-phpunit-and-xdebug

🔈 Podcasts

Voices of the ElePHPant

https://voicesoftheelephpant.com/2020/06/09/interview-with-nuno-maduro/

Interview with Nuno Maduro.

PHPUgly 194: Oversight

https://phpugly.simplecast.com/episodes/194

PHP Internals News Podcast by Derick Rethans

Php_annotated_monthly 이미지

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

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


⚡️ News & Releases

PHP

PHP 7.4.5, PHP 7.3.17, and PHP 7.2.30 are released.

Composer v2.0 Alpha

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

4월 5일은 Composer repository에 첫 commit이 올라온 지 딱 9년째 되는 날이었습니다. 두번째 메이저 릴리스에서 어떤 점이 추가됐고 어떻게 변경됐는지 확인할 수 있습니다. 지금 composer self-update --snapshot를 실행해보세요.

실행하면 최신 스냅샷으로 업데이트 됩니다.

❯ composer self-update --snapshot
Updating to version 8ea787baa170ee462ee791c65b469ef62790f8aa (snapshot channel).
Downloading (100%)
Use composer self-update --rollback to return to version 1.10.5

다시 돌아가고 싶다면 composer self-update --rollback
혹은 특정 버전으로 업데이트 composer self-update 1.10.5

바뀐 점 몇 가지 소개해드릴게요.

Faster download times

Packages와 meta data를 병렬로 다운로드 되기 때문에, 캐시가 없는 상태라면 버전 1에 비해 2배 가량 빠릅니다. 게다가 HTTP/2를 사용해 TLS session과 DNS 응답을 공유해 더욱 속도를 낼 수 있었습니다.

Composer v1이라면 hirak/prestissimo로 이런 효과를 조금 얻을 수 있습니다.

Partial offline support

COMPOSER_DISABLE_NETWORK라는 환경 변수가 1로 세팅되어 있다면, 네트웍을 전혀 사용하지 않고 composer.lock과 캐시된 파일만으로 설치를 시도합니다.

Dry-run support for require and remove commands

말 그대로 require와 remove 커맨드에 --dry-run 옵션이 추가되어 실제 업데이트 하지 않고도 시험해볼 수 있습니다.

Running as root requires confirmation

root 사용자로 실행하는 건 위험한 일이지만 간혹 필요한 상황이 있습니다. 이전 버전에선 root 사용자로 실행하면 warning을 띄우는데 그쳤다면, 이제는 질문에 답을 해야 합니다. 물론 interaction flag를 꺼둘 수도 있긴 합니다.

New repository metadata format

새로운 repository metadata format을 제공합니다. 새로운 포맷은 가볍고, repository 운영자가 개별 패키지를 위한 URL endpoint를 제공할 수 있게 됩니다.

Packagist.org는 이미 지원하고 있답니다.

PhpStorm 2020.1

https://www.jetbrains.com/phpstorm/whatsnew/?_ga=2.91147290.1244278781.1587564338-44216834.1547258235

주요 변화는

  • composer.json support
  • Code coverage with PCOV and PHPDBG
    • Code coverage 측정을 위해 Xdebug 뿐 아니라 가벼운 krakjoe/pcov나 훨씬 빠른 커버리지 측정을 할 수 있는 built-in PHPDBG를 선택할 수 있게 됐습니다.
  • PHPUnit toolbox
    • PHPUnit 버전을 빠르고 쉽게 업그레이드 할 수 있게 해주는 툴
    • 에디터에서는 deprecation을 보여주고 제안하기도 합니다
  • PHP type inference improvements
    • 몇몇 타입 추론이 개선됐습니다
  • ML-assisted ranking for code completion
    • 코드 완성 도구 팝업에서 머신 러닝 기반으로 추천 순서를 바꿔줍니다. 기본으로 disabled 되어 있답니다.
    • 궁금하신 분들은, PHP under Preferences/Settings | Editor | General | Code Completion.
  • Metadata
    • 원래 .phpstorm.meta.php를 활용해 메타데이터를 설정할 수 있었는데, 많은 발전이 있었다고 합니다. 여전히 활발히 개발중인 도구입니다.
  • PHP Debug in HTTP Client
    • HTTP Client를 통해 실행할 때도 XDebug 같은 디버깅 툴을 사용할 수 있습니다.
  • default font 추가 : JetBrains Mono
  • 모든 OS에서 동일한 테마로 설정할 수 있는 light theme : IntelliJ Light
  • Git > Interactively Rebase from Here 가능이 많이 개선 됐습니다.
  • Commit 창이 그동안 modal만 있었는데, 일반 탭처럼 사용할 수 있는 옵션이 있습니다.
  • Database Tools
    • Excel export 기능
    • 에디터의 쿼리 아래 바로 실행 결과를 보여주는 옵션
    • Run configurations에서 DB 쿼리 실행
  • 괄호의 시작과 끝을 옮겨다닐 수 있는 Action 추가! (맥에서는 ^M)

🐘 PHP Internals

PHP 8 release schedule

https://wiki.php.net/todo/php80

첫 알파 버전은 6월 18일로 예상하고 최종 릴리스는 12월 3일로 계획되어 있습니다.

[RFC] Constructor Property Promotion

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

Larry Garfield가 analysis of PHP’s object ergonomics라는 상세한 분석을 썼습니다. (2020년 4월 22일 현재 이 페이지는 접근이 되지 않습니다)

그는 아래 세가지 RFC에 집중해야 한다고 끝마쳤는데요.

  • constructor promotion
  • named parameters
  • compound Property Visibility

그 분석에 따르면, 이 RFC 제안들은 이런 코드를

class Point {
public float $x;
public float $y;
public float $z;

public function __construct(
float $x = 0.0,
float $y = 0.0,
float $z = 0.0
) {
$this->x = $x;
$this->y = $y;
$this->z = $z;
}
}

이렇게 쓸 수 있게 해준답니다.

class Point {
public function __construct(
public float $x = 0.0,
public float $y = 0.0,
public float $z = 0.0
) {}
}

[RFC] Allow trailing comma in parameter list

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

PHP 7.3부터는 함수 호출 시 argument 목록 끝에 comma를 넣을 수 있었는데요. 선언부에도 허용하도록 제안이 올라왔습니다. target은 PHP 8.0입니다.

[RFC] Stricter type checks for arithmetic/bitwise operators

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

배열이나 resource, object 등에 산술/비트 연산을 시도하면 TypeError를 발생시키는 제안입니다.

[RFC] Type casting in array destructuring expressions

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

예제를 살펴보시죠.

[(int) $now, (int) $future] = ["2020", "2021"];

// The same as the following
[$now, $future] = ["2020", "2021"];
$now = (int) $now;
$future = (int) $future;

[RFC] throw expression

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

이 제안은 accept 됐습니다. PHP 8에서 throw는 더이상 문(statement)이 아니라 식(expression)으로 인식됩니다. 그 말은, arrow 함수, 3항 연산자 등의 구조에서 사용될 수 있다는 말입니다.

$callable = fn() => throw new Exception();

$foo = $bar['key'] ?? throw new KeyNotSetOnBarException();

[RFC] Attributes v2

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

Benjamin Eberlei와 Martin Schröder가 제안한, 흔히 annotation이라고 불리는 attribute 기능을 PHP core로 가져오기 위한 제안이 크게 진전이 있었습니다.
제안이 통과할 가능성이 매우 크고, 문법은 << >> 혹은 @:. 중에 투표 중입니다. 5월 4일까지 투표를 진행합니다. << >> 문법이 압도적이네요.

<<ExampleAttribute>>
class Foo
{
<<ExampleAttribute>>
public $x;

<<ExampleAttribute>>
public function foo(<<ExampleAttribute>> $bar) { }
}

[RFC] Mixed Type v2

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

현재 return 타입이 명시되지 않은 함수는 개발자가 잊은 건지 어떤 이유로 넣지 않기로 한 것인지 확실하지 않았습니다. 게다가 mixed라는 pseudotype은 이미 PHP manual에서 사용되고 있었죠.
Máté Kocsis와 Danack은 mixed 타입을 PHP 8에 넣자고 제안했습니다. array|bool|callable|int|float|null|object|resource|string 타입의 결합을 의미하도록 말이죠.

[RFC] non-capturing catches

https://wiki.php.net/rfc/non-capturing_catches

catch block에서 사용하지도 않을 변수를 선언하지 않도록 생략하게 해주는 RFC입니다.

try {
changeImportantData();
} catch (PermissionException) { // The intention is clear: exception details are irrelevant
echo "You don't have permission to do this";
}

[RFC] Match expression

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

이전에 올라온 것처럼 switch의 구조를 변경하지 않고 Ilija Tovilo는 match라는 표현을 사용해 switch문의 결함(타입 체크가 안 되는 문제나 값을 반환할 수 없는 점 등)을 피하도록 제안했습니다. 훗날 패턴 매칭으로도 확장할 수 있을 것으로 기대하고 있습니다.

$expressionResult = match ($condition) {
1, 2 => foo(),
3, 4 => bar(),
default => baz(),
};

[RFC] Pipe Operator v2

https://wiki.php.net/rfc/pipe-operator-v2

두번째 올라오는 Pipe Operator(|>) 제안입니다. 순차적으로 실행하면서 이전 함수의 결과를 다음 함수의 인자로 넘겨줄 수 있게 합니다.

$result = "Hello World"
|> 'htmlentities'
|> 'explode'
|> fn($x) => array_map(fn($v) => 'strtoupper', $x)
|> fn($x) => array_filter(fn($v) => $v != 'O');

거절된 제안들

Server-Side Request and Response Objects
Userspace operator overloading
Write-Once (readonly) Properties
Compact Object Property Assignment

🛠 Tools

jlaswell/compote

https://github.com/jlaswell/compote

Go로 만들어진 가벼운(lightweight) 의존성 관리 도구. Composer를 대체하기위한 것이 아니라 CI 파이프라인, 자동화 workflow, 메모리가 제한된 환경 등의 특정 사용 사례를 보완하는 것입니다.

repman.io

https://repman.io/

Private PHP Package Repository Manager.

Add and manage private PHP Composer dependencies in Cloud or behind your firewall

global CDN을 통해 packagist.org의 proxy를 제공하기도 합니다.

clue/graph-composer

https://github.com/clue/graph-composer

여러분 프로젝트의 composer 의존성을 그래프로 그려줍니다.

VKCOM/noverify v0.2.0

https://github.com/VKCOM/noverify/releases/tag/v0.2.0

Go로 만들어진 PHP를 위한 정적 분석 도구입니다.

markrogoyski/math-php 1.0

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

MathPHP - Powerful Modern Math Library for PHP

첫 stable 릴리스입니다.

ackintosh/ganesha 1.0

https://github.com/ackintosh/ganesha

PHP 어플리케이션을 위한 Circuit Breaker 패턴 구현체입니다.

이 블로그 포스트를 확인해보세요.

Spiral Framework

https://spiral.dev/

고성능의 hybrid PHP+Go framework.

Symfony

migrify/symfony-route-usage

https://github.com/migrify/symfony-route-usage

Symfony app에서 사용하지 안는 route를 찾도록 도와줍니다. 이 블로그 포스트를 확인하세요.

How to Migrate Spaghetti to 304 Symfony 5 Controllers Over Weekend

https://www.tomasvotruba.com/blog/2020/04/13/how-to-migrate-spaghetti-to-304-symfony-5-controllers-over-weekend/

A Week of Symfony #694 (13-19 April 2020)

https://symfony.com/blog/a-week-of-symfony-694-13-19-april-2020

Laravel

6 Laravel Eloquent Secrets

https://laravel-news.com/6-eloquent-secrets

  • Snake Attributes
  • Pagination
  • Appending custom values to models
  • Mutators for non-existing columns
  • Eager loading with $with
  • Model keys

Building complex forms with Laravel Livewire

https://freek.dev/1609-building-complex-forms-with-laravel-livewire-in-oh-dear

Oh Dear라는 서비스에서 복잡한 form 렌더링을 위해 Livewire를 사용한 방식을 소개합니다.

Mixing event sourcing in a traditional Laravel app

https://freek.dev/1634-mixing-event-sourcing-in-a-traditional-laravel-app

Brent의 동료인 Freek이 함께 일하는 프로젝트에서 논의한 내용을 두 부분을 나누어 각자 글을 올렸습니다.

그들은 상태 기반 시스템과 이벤트 소스 시스템을 결합하는 방법을 찾고 싶었고, 강력한 bounded context를 생성해서 이벤트에만 의존해 통신하도록 설계했다고 합니다.

우선 Brent가 먼저 Combining event sourcing and stateful systems라는 시스템의 설계에 관해 글을 올렸고,

이를 어떻게 구현했는지 Freek가 이 글에서 설명합니다.

Dynamic relationships in Laravel using subqueries

https://reinink.ca/articles/dynamic-relationships-in-laravel-using-subqueries

Rethinking Laravel’s middleware argument API

https://timacdonald.me/rethinking-laravels-middleware-argument-api/

The Beauty of Single Action Controllers

https://driesvints.com/blog/the-beauty-of-single-action-controllers/

Jeffrey Way가 올린 트윗(현재 찾을 수 없음)에서 컨트롤러 이름을 단수로 짓는지 복수로 짓는지 질문했습니다. 이에 Dries Vints는 둘 다 해당하지 않고, 하나의 역할만 하는 Single Action Controller를 만든다고 답했고 이에 대한 생각을 글로 풀어냈습니다.

📺 Screencasts from Mohamed Said

Mohamed Said가 Laravel에서 CSRF protection, CORS, authentication, HTTP Middleware가 어떻게 동작하는지 설명합니다.

🔈 The Laravel Podcast

https://laravelpodcast.com/episodes/the-ethos-of-laravel

The Ethos of Laravel, with Taylor Otwell

Yii

Yii news 2020, issue 3

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

Zend/Laminas

April 2020 Technical Steering Committee Meeting

https://getlaminas.org/blog/2020-04-07-tsc-meeting.html

🌀 Async PHP

hyperf/hyperf

https://github.com/hyperf/hyperf

A framework for building microservices or middlewares based on Swoole coroutines.

clue/reactphp-flux

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

이 패키지를 사용하면 ReactPHP에서 동시에 실행되는 작업의 수를 제한할 수 있습니다.

기타 읽을 만한 글

Testing without mocking frameworks.

https://blog.frankdejonge.nl/testing-without-mocking-frameworks/

Coding with feature flags.

https://www.boxuk.com/insight/coding-with-feature-flags/

Feature flag(flag 값을 사용해서 특정 기능을 켜고 끄는 것)의 종류와 이를 CD(Continuous Delivery)에 활용해 좀 더 빠르게 피드백을 받고 배포할 수 있다는 주장.

Testing composer plugins.

https://blog.cebe.cc/posts/2020-04-17/testing-composer-plugins

Yii Framework에서 composer plugin 테스트

Improve your Design with CQRS.

https://thephp.cc/news/2020/04/improve-design-with-cqrs

SerafimArts/opengl-demo

https://github.com/SerafimArts/opengl-demo

FFI를 활용해 순수하게 PHP 만으로(음? 이게 순수한 것임??) OpenGL(SDL)를 사용하는 예제입니다.

A Snake Game Written in PHP

https://thephp.website/en/issue/games-with-php/

With joseph-montanez/raylib-php.

💵 Advanced Web Application Architecture

https://matthiasnoback.nl/2020/04/early-release-of-web-application-architecture-book/

Matthias Noback의 새로운 책입니다. 2주 마다 새로운 장이 발표됩니다.

💵 PHP Mentors

http://www.phpmentors.com/

code, career, teamwork 등에 관한 질문에 전세계 PHP 마스터에게 대답을 들고 책으로 엮었습니다.

📺 Videos

📺 Tips on styling and navigation with PhpStorm

https://blog.jetbrains.com/phpstorm/2020/04/new-video-series-phpstorm-tips-with-christoph-rumpel/

from @christophrumpel.

PhpStorm에서 스타일을 바꾸는 것, 파일 간 이동하는 방법 등을 설명합니다.

📺 Visual Perception of Code

https://www.youtube.com/watch?v=5qRFxMCEbLs

코드의 모양이 생산성에 미치는 엄청난 영향을 탐구합니다.

이외 관한 글을 올리고 영상에 나온 링크를 소개하기도 했습니다.

🔈 Podcasts

PHP Internals News Podcast by Derick Rethans

2019년에 읽은 책

  • 1월 사용자를 생각하게 하지마
  • 5월 틀리지 않는 법
  • 5월 테스트 주도 개발로 배우는 객체 지향 설계와 실천
  • 6월 죽기 전까지 걷고 싶다면 스쿼트를 하라
  • 6월 Management 3.0
  • 6월 함께 자라기
  • 8월 마인드셋
  • 9월 오브젝트
  • 10월 테크니컬 리더
  • 12월 도메인주도 설계 핵심

2019년 회고를 하기에는 너무나 바쁘고 힘든 시기였기 때문에, 대충 읽은 책이나 곱씹어본다. 2019년 초에 했던 2018년 회고에는 더 많은 책을 읽는 것을 목표로 했었지만, 막상 2019년에 되어서는 책을 좀 제대로 읽자는 컨셉으로 바뀌었고, 나쁘지 않았다. 대부분 훌륭한 책만 골라 읽었기 때문일 수도 있지만, 평소보다 깊게 읽었기 때문이기도.

‘사용자를 생각하게 하지마’는 사내 스터디를 하면서 시작했던 책이고, 너무 유명해서 안 봤었지만 생각보다 좋았다. 그 책보다는 함께 스터디를 진행하면서 얻은 것이 매우 많았다.

이 스터디 이후 ‘테스트 주도 개발로 배우는 객체 지향 설계와 실천’으로 TDD 스터디를 시작했는데, 두번째 읽는 것임에도 전혀 새로운 내용이었다. 아는 만큼 보인다고, 그 동안 많이 성장했나 싶기도 했고 다시 또 읽고 보겠다는 다짐을 했는데, 지금은 어떻게 다가올지 궁금하기도 하다. 이것도 꽤나 고통스럽게 이해한 책.

쉬엄 쉬엄 읽고 있던 ‘틀리지 않는 법’을 다 읽었다는 사실도 즐거웠는데, 사실 책도 꽤나 재미있었다. 재밌는데 원하는 만큼의 속도가 나지 않았던 책.

이 두 책은 독후감도 썼는데, 이게 마지막이었다. 그동안 독후감 쓸 정신도 없이 살았구나.

‘죽기 전까지 걷고 싶다면 스쿼트를 하라’는 정말 딱 그림 6장을 제외하곤 분리수고 해도 좋을 책인데, 여전히 죽기 전까지 걷고 싶은데, 여전히 스쿼트는 안 하고 있다. 무릎을 쓰는 운동은 정말 부담이다. 계속 소리가 나서…

‘Management 3.0’도 매우 좋은 책이다. 이론과 실전을 한 장씩 번갈이 배치했는데, 실전 부분만 계속 읽어보려고 했다(과거형). 나는 동료들과 함께 읽고 싶은 책으로 꼽고 싶다.

‘함께 자라기’는.. 그냥 좋은 책 정도의 느낌만 남았다. 그동안 김창준님 글을 많이 봤던 사람이라면 감흥이 덜 할 수도.

다음에 읽은 ‘마인드셋’도 좋은 이미지가 남았다 정도. 언젠가 애자일 밋업에서 만난 분이 강력 추천했던 책인데, 나는 강력 추천까진 못하고 다만 아내에게 슬쩍 밀어넣어 보긴 했다. 실패. 특별히 기억에 남진 않지만 육아에 있어 좀 더 구체적인 실천 사항이 있는 다른 책과 함께 읽어보면 좋겠다는 생각. 그리고 매니저라면 조직원의 한계를 제한하지 않기 위해 좋은 조언을 들을 수 있을 것으로 기대한다…만 정확히 무슨 내용이었는지는 다시 책을 펼쳐보아야겠다.

‘오브젝트’는 개발 커뮤니티의 기대가 많았던 만큼 수작이 나왔다고 생각한다. 그러나 조영호님의 글쓰기는 나와는 안 맞는다. 함께 봤던 코드스피츠 강의가 정말 좋았다. 주니어에게는 코드스피츠 강의와 함께 할 것을 추천.

‘테크니컬 리더’는 힘든 시절에 많은 도움이 됐던 책이고, 다시 읽어도 꽤나 좋았다. 읽으면서 정리를 해보고 싶다는 생각도 했는데, 타이밍을 놓쳤으니 다음에 또 읽어보는 걸로.

‘도메인주도 설계 핵심’은 DDD 스터디를 진행하기 전에 가볍게 이해도를 높여보고자 읽었던 책. 처음에는 요즘을 잘 설명하는 듯 하다가, 궁금하면 ‘도메인 주도 설계 구현’이라는 책을 보라고 찌르는 책. 같은 저자가 썼다. ‘도메인 주도 설계 구현’이 매우 두껍고 어렵기 때문에 이 책으로 위안을 얻을 수도 있긴 하겠지만, 뭔가 애매한 책이다. 초반 내용은 기획자 직군도 같이 읽으면 좋겠다는 생각도 했다.

기타 요리 관련 책도 좀 사긴 했는데, 정독한 책은 없다. 요즘은 거실에서 다같이 모여 TV를 보거나 소화를 시킬 때, ‘더 푸드 랩’을 종종 펼쳐 보곤 한다. ‘밀가루 물 소금 이스트’와 ‘샐러드가 필요한 모든 순간’은 여전히 끊임없이 펼쳐보는 책이고.

지금까지의 구성

2018년 12월에 고정된 IP를 통과해 Elastic Beanstalk 접근하기라는 글을 썼는데, 올 초에 조금 더 단순하고 안전한 방식으로 변경이 됐다.

기존 방식이 이런 구성이었는데,

Client -> NLB -> Proxy 서버군 -> Elastic Beanstalk

ISMS 심사를 준비하면서 Proxy 서버군에 취약점 조치 사항을 적용하기가 매우 귀찮았다. 보통 우리 회사의 백엔드 서비스는 Elastic Beanstalk나 EKS로 서비스 되기 때문에, Nginx만 단독으로 올려 쓰는 경우가 없어 이를 위해 취약점 조치가 적용된 별도의 AMI를 새로 만들어야 했기 때문. 그것 자체가 큰 어려움이라기 보다는 심사를 위해 신경써야 하는 카테고리가 늘어나는 게 부담이었다.

게다가 인증서를 ACM을 통해 사용하는 게 아니고 회사에서 직접 구매하고 설치한 거라, 올 해 말이면 인증서를 갱신할 시점이 돌아온다. 내가 인증서 관리 역할을 맡은 건 아니라서 이 또한 매우 귀찮다. 그게 나라면 더 귀찮았겠다.

다른 건 거의 매니지드 서비스를 쓰다보니 이 Nginx 서버군의 모니터링도 쉽지 않다. 일단 내가 익숙하지 않고, 아직까지 별 일 없이 동작했지만 상태 모니터링을 띄엄띄엄 하게 된다. 보통은 실제 서비스가 되는 Elastic Beanstalk 기반의 서버에 모니터링이 집중될 수 밖에.

아마도 더 좋은 방법이 있었겠지만, 당시에 내가 고를 수 있었던 최선이었다.

AWS Global Accelerator

사실 이 구성을 고민한 지 얼마 되지 않은 2018년 말에 AWS Global Accelerator가 발표됐었다. 당시에는 이 기능을 자세히 살펴볼 생각도 못했고, AWS에 계신 분(정확히 어떤 직함인지는 여전히 모르겠다만…)과 이야기 했을 때에도 이런 이야기는 없었다.

AWS Global Accelerator 기능 소개를 보면 뭔가 좋은 얘기가 많지만 딱 눈에 띄는 게 있다.

AWS Global Accelerator는 AWS 리전에서 호스팅되는 애플리케이션의 고정 진입점 역할을 하는 하나 이상의 정적 IP 주소를 제공합니다.

Global Accelerator는 전세계 어디서든 사용자가 가장 가까운 엣지 로케이션에 고정된 IP로 접근한 후, 연결된 NLB나 ALB로 이어주는 서비스다. 비록 우리 서버로 접근하는 클라이언트는 대부분 한국 내에 있겠지만.

요금은 대한민국 -> 대한민국 기준으로 0.043 USD/GB라서, 클라이언트와 짧은 페이로드를 주고 받는 입장에서 기존 서버를 내릴 것도 생각하면 부담스러울 것도 없다.

그래서 현재 버전은 아래와 같이 매우 단순해졌다. EB에는 ALB(Application Load Balancer)를 붙였다.

AWS Global Accelerator -> Elastic Beanstalk(+ ALB)

클라이언트에게는 Global Accelerator의 존재가 보이긴 한다.

nslookup 기존도메인

Non-authoritative answer:
Name: 기존도메인
Address: ***.***.***.***
Name: 기존도메인
Address: ***.***.***.***

nslookup 신규도메인

Non-authoritative answer:
신규도메인 canonical name = *****************.awsglobalaccelerator.com.
Name: *****************.awsglobalaccelerator.com
Address: ***.***.***.***
Name: *****************.awsglobalaccelerator.com
Address: ***.***.***.***

어쨌든 그 동안 수고한 NLB와 Proxy 서버들아 안녕.

Php_annotated_monthly 이미지

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

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


⚡️ News & Releases

CodeIgniter 4.0

https://github.com/codeigniter4/CodeIgniter4

5년 간의 개발 끝에 새 버전이 릴리스되었습니다. 처음부터 다시 작성하고, PHP 7.2 이상에서 동작하며, PSR-1, 3, 4를 구현했습니다.

PHP 7.4.3

https://www.php.net/ChangeLog-7.php#7.4.3

오래 기다렸던 opcache.preload_user 버그가 수정됐고, 이제는 production에서 사용할 수 있겠습니다.
preload_user 버그란 이걸 말하는 가 봅니다.

Fixed bug #79128 (Preloading segfaults if preload_user is used).

🐘 PHP Internals

Accepted proposals:

아래 세가지 RFC가 승인되었습니다.

[RFC] Variable Syntax Tweaks
[RFC] Static return type
[RFC] Allow ::class on objects

[RFC] Stringable

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

Nicolas Grekas의 제안이 승인됐습니다. 따라서 PHP 8에서는 string|Stringable union type을 쓸 수 있고, __toString()을 구현한 클래스를 인자로 넘길 수 있습니다. 게다가 명시적으로 implements Stringable을 선언하지도 않아도 되는데, __toString()을 구현한 클래스라면 뒤에서 알아서 처리해줍니다.

Language evolution

https://github.com/nikic/php-rfcs/blob/language-evolution/rfcs/0000-language-evolution.md

Nikita가 PHP를 어떻게 legacy code를 깨뜨리지 않으면서 앞으로 나아가게 할 수 있을지 논의를 시작했습니다.
하나의 옵션으로 Rust의 방식처럼 “edition”을 도입하는 것이 있는데, declare(edition=2020)처럼 파일 단위 선언하는 것입니다.

[RFC] Write-Once Properties

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

새로운 property 수정자를 추가하는 제안입니다. 특정 property를 초기화하면 이후 수정할 수 없도록 합니다.
어떤 keyword를 사용할 지 다양한 옵션이 거론되고 있습니다. final, immutable, readonly, writeonce, locked, sealed…

class Foo
{
<keyword> public int $a = 1;
<keyword> public string $b;
<keyword> public array $c = ["foo"];
<keyword> public object $d;

public function __construct()
{
$this->b = "foo";
}
}

$foo = new Foo();

$foo->a = 42; // EXCEPTION: property a has already been initialized
$foo->b = "bar"; // EXCEPTION: property b has already been initialized
$foo->a++; // EXCEPTION: incrementing/decrementing is forbidden
unset($foo->c); // EXCEPTION: unsetting is forbidden
$foo->c[] = "bar"; // EXCEPTION: arrays can't be modified
$var= &$this->c; // EXCEPTION: reference isn't allowed

$foo->d = new Foo(); // SUCCESS: property d hasn't been initialized before
$foo->d->foo = "foo"; // SUCCESS: objects are still mutable internally

[RFC] Allow explicit call-site pass-by-reference annotation

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

호출하는 쪽에서도 reference를 전달한다는 것을 명시적으로 보여줄 수 있도록 제안합니다.
require_explicit_send_by_ref 옵션이 활성화 될 떄만 적용됩니다.

declare(require_explicit_send_by_ref=1);

function byRef(&$ref) {...}
byRef(&$var);

[RFC] Increment/Decrement Fixes

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

경우에 따라 덧셈/뺄셈 연산자가 명시적으로 1을 더하거나 빼는 연산에서 일관되게 동작하지 않는 문제가 있습니다. 예를 들면,

<?php

$a = [];
$a = ++$a; // [] and no errors
$a = $a + 1; // Fatal error

이 RFC는 PHP 8에서 오류를 수정하고 Error를 던질 수 있도록 제안합니다.

[RFC] Attributes v2

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

이 RFC는 <<, >>를 사용해 완전한 어노테이션(annotations)을 추가하기 위한 두번째 시도입니다.

이전에 simple annotationsattributes같은 제안이 있었지만 투표를 통과하진 못했습니다.

use Doctrine\ORM\Mapping as ORM;

<<ORM\Entity(["repositoryClass" => UserRepository::class])>>
<<ORM\Table("users")>>
class User
{
<<ORM\Id, ORM\Column, ORM\GeneratedValue>>
public int $id;

<<ORM\Column(["unique" => true])>>
public string $email;

<<ORM\ManyToOne()>>
public ?Address $address;
}

[PR] Make sorting stable

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

PHP의 정렬 함수는 안정되지 않았습니다(not stable). 같은 값을 가진 요소들의 원래 순서가 보장되지 않습니다. 예를 들면, 이렇습니다.

이를 고치자는 제안이 올라왔습니다만, 동일한 요소가 여럿 포함될 경우 성능에 영향을 줄 것입니다.

🛠 Tools

T-Regx/T-Regx

https://github.com/T-Regx/T-Regx

사용자 친화적인 인터페이스로 정규식을 작업하기 좋은 패키지입니다.

spiral/RoadRunner

https://github.com/spiral/roadrunner

Golang으로 만들어진 PHP Application Server입니다. 이제 file watcher가 포함되어, 워커가 자동으로 갱신될 수 있습니다.

tightenco/overload

https://github.com/tightenco/overload

closure의 모음을 통해 overloading method를 구현한 간단하지만 흥미로운 구현체입니다.

cmorrell.com/php-fpm

https://cmorrell.com/php-fpm/

php-fpm 설정을 생성하는 좋은 툴.

minicli/minicli

https://github.com/minicli/minicli

CLI 중심의 PHP 애플리케이션을 생성하기 위한, 의존성이 없이 Vanilla PHP로 만들어진 도구입니다.

minicli를 소개하는 4개의 연재를 확인하세요.

shivammathur/setup-php

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

PHP 환경을 설정해서 당신의 workflow의 기반으로 사용할 수 있게 도와주는 Github Action입니다.

GitHub action to setup PHP with required extensions, php.ini configuration, code-coverage support and various tools like composer

Symfony

📺 Charming Development in Symfony 5

https://symfonycasts.com/screencast/symfony

SymfonyCasts에서 진행중인 시리즈입니다.

Auto-configuration of Doctrine repositories as services

https://www.strangebuzz.com/en/blog/auto-configuration-of-doctrine-repositories-as-services

A Week of Symfony #688 (2-8 March 2020)

https://symfony.com/blog/a-week-of-symfony-688-2-8-march-2020

Laravel

Laravel 7

https://laravel.com/docs/7.x/releases

이번 릴리스에선,

  • laravel/airlock – SPA에서의 인증을 위한 새로운 component
  • Custom Eloquent Casts – 어떻게 사용하는 지는 이 tutorial을 보세요!
  • Blade component가 이제 클래스와 custom HTML 태그로 선언될 수 있고 @component 태그 대신 사용할 수 있습니다
  • HTTP Client – 일반적인 작업을 위해 단순한 인터페이스를 가진 Guzzle wrapper입니다. kitetail/zttp를 기반으로 합니다.

어떤 점이 새로워졌는지 📺 Laracasts와 📺 Coder’s Tape channel에서 동영상 overview로 확인해보실 수 있습니다.

Livewire v1.0

https://github.com/livewire/livewire

이 Laravel을 위한 frontend framework은 추가적인 JS 코드 없이도 Blade를 PHP class로 바인딩 해줄 수 있습니다. 이 📺 video tutorial에서 form을 처리하는 방식을 확인하실 수 있어요.

nunomaduro/laravel-mojito

https://github.com/nunomaduro/laravel-mojito

독립적으로 뷰를 테스트할 수 있는 간단한 패키지입니다. 어떻게 사용하는지 이 📺 demo를 보고 확인하세요.

Optimizing circular relationships in Laravel

https://reinink.ca/articles/optimizing-circular-relationships-in-laravel

Laravel에서 양방향 relation을 최적화하는 방법입니다.

📺 How to write exceptionally good exceptions in PHP.

https://freek.dev/1582-how-to-write-exceptionally-good-exceptions-in-php

🔈 Laravel Snippet #23: Laravel 7.x, Forge, Vapor, Speaking vs. Silence.

https://blog.laravel.com/laravel-snippet-23-laravel-7x-forge-vapor-speaking-vs-silence

📺 Laracon Australia 2019 videos.

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

Yii

Yii news 2020, issue 2

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

Yii 3에 반영된 많은 변화를 포함한 뉴스입니다.

yiisoft/friendly-exception

https://github.com/yiisoft/friendly-exception

Yii 3이 릴리스된 후 첫 패키지입니다. 사람이 읽을 수 있는 exception을 선언할 수 있는 인터페이스를 제공합니다.

Zend/Laminas

Inaugural Technical Steering Committee Meeting

https://getlaminas.org/blog/2020-03-05-tsc-inaugural-meeting.html

Laminas의 개발 및 자금 조달 계획에 대해 알 수 있습니다.

🌀 Async PHP

📺 Interview with Marc Morera

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

DriftPHP의 저자와 driftphp/reactphp-dbal에 관해 이야기 합니다.

driftphp/tiny-load-balancer

https://github.com/driftphp/tiny-load-balancer

ReactPHP 위애서 도는 아주 작은 로드밸런서입니다.

💡 기타 읽을 만한 글

Understanding PHP 8’s JIT

https://thephp.website/en/issue/php-8-jit/

PHP 8의 JIT 이해하기

When does PHP call __destruct()?

https://dev.to/themsaid/when-does-php-call-destruct-1167

__destruct()가 언제 호출되는지 설명합니다.

Bitwise booleans in PHP

https://stitcher.io/blog/bitwise-booleans-in-php

저자가 PHP의 Enum type의 지원없이 Enum을 구현하는 이전 포스트에서 bool flag를 저장하는 것을 보여줬었는데, 이번에는 bitmask를 사용하여 bool flag를 저장하는 방식을 설명합니다.

PHPUnit: A Security Risk?

https://thephp.cc/news/2020/02/phpunit-a-security-risk

vendor 디렉토리가 공개적으로 접근 가능하다면, PHPUnit의 이전 버전이 어떤 보안 문제를 일으키는지 알아보세요.

여기서 얻은 교훈으로는

  • Composer로 관리되는 vendor 디렉토리는 공개적으로 접근 가능해선 안 된다
  • PHPUnit과 같은 개발 단계에서 필요한 라이브러리는 production에 배포되어선 안 된다

PHPUnit 문서에서도 이를 명확히 경고하고 있습니다.

PHPUnit is a framework for writing as well as a commandline tool for running tests. Writing and running tests is a development-time activity. There is no reason why PHPUnit should be installed on a webserver. If you upload PHPUnit to a webserver then your deployment process is broken. On a more general note, if your vendor directory is publicly accessible on your webserver then your deployment process is also broken. Please note that if you upload PHPUnit to a webserver “bad things” may happen. You have been warned.

How @miguelxpn found a bug in PHP’s standard library and fixed it.

https://www.miguelxpn.com/coding/php/opensource/2020/03/01/how-i-found-and-fixed-a-bug-in-php-std-lib.html

Miguel Xavier Penha Neto란 사람이 PHP 표준 라이브러리의 버그고쳤다는 이야기.

Clean Code and Object Calisthenics Rules

https://beberlei.de/2020/02/25/clean_code_object_calisthenics_rules_i_try_to_follow.html

Benjamin Eberlei란 사람이 지키려고 하는 Clean Code / 객체 관리 규칙을 소개합니다.

  • A strict coding style
  • A static code analyzer, but not at highest level
  • Take very good care of API Information Hiding and Encapsulation
  • To new or not to new
  • Separate Statements and Declartions by empty lines
  • Use early exits and don’t use else
  • Only one level of indentation per method and a second for early exits
  • Don’t abbreviate names (too much)
  • Prefer Null Coalesce Operator over if isset
  • Don’t allow a variable to have two types
  • Don’t re-use a variable with a different type
  • Typehint Collection Items with assert
  • Use structs to wrap arrays (especially from SQL results)

📺 Videos

📺 What’s coming in PhpStorm 2020.1 – Every week we publish a new 5-minute video.

https://www.youtube.com/playlist?list=PLQ176FUIyIUb7qSArPCxOkIGX-cqdfoBx

📺 PHP Tutorial for Absolute Beginners – PHP Course 2020 – 5 hours of video tutorials.

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

🔈 Podcasts

PHP Internals News

The Undercover ElePHPant

Voices of the ElePHPant with Sara Golemon and Derick Rethans

https://voicesoftheelephpant.com/2020/02/26/interview-with-sara-golemon-derick-rethans/

a discussion of various updates in PHP 8.

0%