<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>ha-ah</title>
  <icon>https://haah.kr/icon.png</icon>
  <subtitle>로그, 게으른 로그</subtitle>
  <link href="https://haah.kr/atom.xml" rel="self"/>
  
  <link href="https://haah.kr/"/>
  <updated>2026-05-31T19:29:57.262Z</updated>
  <id>https://haah.kr/</id>
  
  <author>
    <name>youngiggy</name>
    
  </author>
  
  <generator uri="https://hexo.io/">Hexo</generator>
  
  <entry>
    <title>PHP Annotated – November 2023</title>
    <link href="https://haah.kr/2023/12/06/php-annotated-november-2023/"/>
    <id>https://haah.kr/2023/12/06/php-annotated-november-2023/</id>
    <published>2023-12-06T09:52:58.000Z</published>
    <updated>2026-05-31T19:29:57.262Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://blog.jetbrains.com/wp-content/uploads/2023/12/php-annotated-featured_blog_1280x720.png" alt="PHP Annotated 이미지"></p><p><a href="https://blog.jetbrains.com/author/rpronskiy">Roman Pronskiy</a>가 쓰고 JetBrains에서 제공하는 PHP Annotated <a href="https://blog.jetbrains.com/phpstorm/2023/12/php-annotated-november-2023/">2023년 12월</a>호입니다.</p><hr><p>PHP Annotated 11월호에 오신 것을 환영합니다! 11월호에서는 엄선된 뉴스, 기사, 도구, 동영상을 통해 지난 한 달 동안 PHP 커뮤니티에서 가장 흥미로웠던 개발 동향을 되돌아봅니다.</p><h1 id="Highlights"><a href="#Highlights" class="headerlink" title="Highlights"></a>Highlights</h1><h2 id="🎉-PHP-8-3-0-released"><a href="#🎉-PHP-8-3-0-released" class="headerlink" title="🎉 PHP 8.3.0 released!"></a>🎉 PHP 8.3.0 released!</h2><p><a href="https://www.php.net/releases/8.3/">https://www.php.net/releases/8.3/</a></p><p>PHP 8.3은 PHP 언어의 주요 업데이트입니다. 여기에는 입력형 클래스 상수, 읽기 전용 프로퍼티의 딥 복제, 랜덤 기능 추가 등 새로운 기능이 포함되어 있습니다. 항상 그렇듯이 성능 개선, 버그 수정, 전반적인 정리도 포함되어 있습니다.</p><p>PHP 8.3의 새로운 기능에 대한 자세한 목록은 <a href="https://www.php.net/releases/8.3/">릴리스 페이지</a>와 <a href="https://www.php.net/manual/en/migration83.php">마이그레이션 가이드</a>에서 확인할 수 있으며, PHP 재단의 <a href="https://thephp.foundation/blog/2023/11/23/php-83/">공지사항</a>에서 릴리스에 대해 자세히 알아볼 수 있습니다.</p><p>PHP 8.3 설치 또는 업그레이드</p><ul><li>Windows: 컴파일된 바이너리는 <a href="https://windows.php.net/download/">windows.php.net</a>에서 찾을 수 있습니다. 또는 <a href="https://community.chocolatey.org/packages/php">Chocolatey에서</a> 제공되는 커뮤니티 빌드를 선택할 수 있습니다.</li><li>Ubuntu&#x2F;Debian: PHP 8.3은 <a href="https://launchpad.net/~ondrej/+archive/ubuntu/php/">ondrej&#x2F;php</a> PPA에서 사용할 수 있습니다.</li><li>Fedora&#x2F;RHEL&#x2F;CentOS: <a href="https://blog.remirepo.net/">Remi 저장소</a>에서 소프트웨어 컬렉션(php83)으로 제공됩니다.</li><li>macOS: PHP 8.3은 홈브류를 통해 <a href="https://github.com/shivammathur/homebrew-php/packages">shivammathur&#x2F;homebrew-php</a> 탭을 사용하여 설치할 수 있습니다.</li><li>Docker: 이제 <a href="https://hub.docker.com/_/php/tags?page=1&name=8.3">8.3 태그</a>가 있는 PHP 8.3 이미지를 <a href="https://hub.docker.com/_/php">Docker Hub</a>에서 사용할 수 있습니다.</li></ul><p><a href="https://blog.jetbrains.com/phpstorm/2023/11/phpstorm-now-supports-php-8-3/">PhpStorm은 이미 PHP 8.3을 지원합니다</a>.</p><p>Freek, Brent, Roman과 함께하는 <a href="https://www.youtube.com/watch?v=VWryF035B6U">PHP 8.3 축하 스트림</a>을 시청하세요.</p><h2 id="⚠️-PHP-8-0의-수명이-다했습니다"><a href="#⚠️-PHP-8-0의-수명이-다했습니다" class="headerlink" title="⚠️ PHP 8.0의 수명이 다했습니다."></a>⚠️ PHP 8.0의 수명이 다했습니다.</h2><p>PHP 8.0.30은 PHP 8.0의 마지막 릴리스입니다. 더 이상 공식 보안 업데이트가 제공되지 않습니다.</p><h2 id="PHP-8-1-26-and-PHP-8-2-13-have-been-released"><a href="#PHP-8-1-26-and-PHP-8-2-13-have-been-released" class="headerlink" title="PHP 8.1.26 and PHP 8.2.13 have been released"></a>PHP 8.1.26 and PHP 8.2.13 have been released</h2><p><a href="https://www.php.net/ChangeLog-8.php#8.1.26">https://www.php.net/ChangeLog-8.php#8.1.26</a><br><a href="https://www.php.net/ChangeLog-8.php#8.2.13">https://www.php.net/ChangeLog-8.php#8.2.13</a></p><p>🐛 버그 수정 릴리스입니다.</p><p>PHP 8.1 브랜치는 마지막 버그 수정 릴리스인 PHP 8.1.27이 한 번 더 릴리스될 예정이며, 그 이후에는 보안 버그 수정만 릴리스됩니다.</p><h2 id="🎂-PHP-재단-창립-2주년"><a href="#🎂-PHP-재단-창립-2주년" class="headerlink" title="🎂 PHP 재단 창립 2주년"></a>🎂 PHP 재단 창립 2주년</h2><p>PHP 재단은 <a href="https://blog.jetbrains.com/phpstorm/2021/11/the-php-foundation/">2년 전에 설립</a>되었습니다.<br>지난 한 해 동안 PHP 재단은 6명의 <a href="https://thephp.foundation/structure/#core_developers">핵심 개발자</a>의 작업을 지원했으며, PHP 언어에 상당한 기여를 했습니다.</p><p><a href="https://thephp.foundation/blog/2023/11/27/php-foundation-update-november-2023/">PHP 재단의 2023년 11월 업데이트</a>를 확인하세요.</p><p><a href="https://opencollective.com/phpfoundation">OpenCollective</a> 또는 <a href="https://github.com/sponsors/thephpf">GitHub Sponsors</a>를 통해 PHP 재단을 <a href="https://thephp.foundation/donate/">지원</a>하는 것도 고려해 보세요.</p><h1 id="PHP-Core"><a href="#PHP-Core" class="headerlink" title="PHP Core"></a>PHP Core</h1><p>대부분의 핵심 소식은 PHP 재단에서 제공하는 PHP 코어 라운드업 시리즈에서 자세히 다루고 있으므로 몇 가지만 간략하게 언급하겠습니다:</p><h2 id="📣-RFC-Resource-to-object-conversion"><a href="#📣-RFC-Resource-to-object-conversion" class="headerlink" title="📣 RFC: Resource to object conversion"></a>📣 RFC: Resource to object conversion</h2><p><a href="https://wiki.php.net/rfc/resource_to_object_conversion">RFC: resource를 object로 변환</a></p><p><code>resource</code>는 오래전부터 객체로 대체된 PHP의 구식 데이터 구조입니다. <a href="https://php.watch/articles/resource-object">resource를 object로 대체하는 작업</a>은 2013년에 시작되었지만, 대부분의 확장 기능은 PHP 8.0이 출시되면서 마이그레이션되었습니다.</p><p>Máté Kocsis는 나머지 확장 기능을 마이그레이션하고 향후 개발을 위한 정책을 정의할 것을 제안합니다.</p><h2 id="📣-RFC-Release-cycle-update"><a href="#📣-RFC-Release-cycle-update" class="headerlink" title="📣 RFC: Release cycle update"></a>📣 RFC: Release cycle update</h2><p><a href="https://wiki.php.net/rfc/release_cycle_update">RFC: 릴리스 주기 업데이트</a></p><p>현재 PHP 버전의 수명은 3년입니다. 많은 사람이 이 기간이 너무 짧고 6개월인 사전 릴리스 단계가 지나치게 길다고 생각합니다.<br>PHP 8.3 릴리스 관리자인 Jakub Zelenka는 PHP 버전 수명을 4년(유지보수 2년, 보안 업데이트 2년)으로 늘리고 사전 릴리스 단계를 수정할 것을 제안합니다.</p><h2 id="📣-RFC-Improve-callbacks-in-ext-x2F-dom-and-ext-x2F-xsl"><a href="#📣-RFC-Improve-callbacks-in-ext-x2F-dom-and-ext-x2F-xsl" class="headerlink" title="📣 RFC: Improve callbacks in ext&#x2F;dom and ext&#x2F;xsl"></a>📣 RFC: Improve callbacks in ext&#x2F;dom and ext&#x2F;xsl</h2><p><a href="https://wiki.php.net/rfc/improve_callbacks_dom_and_xsl">RFC: ext&#x2F;dom 및 ext&#x2F;xsl의 콜백 개선</a></p><p>Niels Dossche는 <code>callable</code>을 사용할 수 있는 <code>XSLTProcessor::registerPHPFunctions()</code> 및 <code>DOMXPath::registerPhpFunctions()</code> 메서드를 허용할 것을 제안했습니다.</p><h2 id="📣-RFC-Change-how-JIT-is-disabled-by-default"><a href="#📣-RFC-Change-how-JIT-is-disabled-by-default" class="headerlink" title="📣 RFC: Change how JIT is disabled by default"></a>📣 RFC: Change how JIT is disabled by default</h2><p><a href="https://wiki.php.net/rfc/jit_config_defaults">RFC: JIT가 기본적으로 비활성화되는 방식 변경</a></p><p>현재 JIT는 <code>tracing</code> 모드에서 실행 중이지만 <code>opcache.jit_buffer_size</code>가 <code>0</code>으로 설정되면 기본적으로 비활성화됩니다. RFC에서는 <code>opcache.jit=disable</code>을 설정함으로써 기본적으로 JIT를 비활성화하고, 기본 <code>jit_buffer_size</code> 값을 64m로 늘릴 것을 제안합니다.</p><h2 id="📣-RFC-Final-anonymous-classes"><a href="#📣-RFC-Final-anonymous-classes" class="headerlink" title="📣 RFC: Final anonymous classes"></a>📣 RFC: Final anonymous classes</h2><p><a href="https://wiki.php.net/rfc/final_anonymous_classes">RFC: Final 익명 클래스</a></p><p>RFC에서는 익명 클래스 사용 환경을 개선하기 위한 세 가지 옵션 중 하나를 제안합니다:</p><ol><li>최종 익명 클래스에 대한 지원 추가(<code>new final class &#123;&#125;</code> 구문, 호환성 유지).</li><li>또는 모든 익명 클래스를 최종 클래스로 만드는 옵션 없이 기본적으로 모든 익명 클래스를 최종 클래스로 만듭니다(호환성 깨짐).</li><li>또는 모든 익명 클래스를 기본적으로 최종 클래스로 만들고, 선택적 <code>open</code> 키워드를 제공하여 최종 클래스가 아닌 것으로 만듭니다(Kotlin에서와 같이, new open class {}, 호환성 깨짐).</li></ol><h2 id="📣-RFC-Property-Hooks"><a href="#📣-RFC-Property-Hooks" class="headerlink" title="📣 RFC: Property Hooks"></a>📣 RFC: Property Hooks</h2><p><a href="https://wiki.php.net/rfc/property-hooks">RFC: 프로퍼티 훅</a><br>이 RFC에서 Ilija Tovillo와 Larry Garfield는 get&#x2F;set 함수를 사용하여 가상 프로퍼티를 선언할 것을 제안합니다.</p><p>설계 및 구문은 <a href="https://kotlinlang.org/docs/properties.html#getters-and-setters">Kotlin</a>과 가장 유사하지만 C# 및 <a href="https://docs.swift.org/swift-book/documentation/the-swift-programming-language/properties/#Computed-Properties">Swift</a>의 영향도 받습니다.</p><figure class="highlight php"><table><tr><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">User</span> <span class="keyword">implements</span> <span class="title">Named</span></span></span><br><span class="line"><span class="class"></span>&#123;</span><br><span class="line">    <span class="keyword">private</span> <span class="keyword">bool</span> <span class="variable">$isModified</span> = <span class="literal">false</span>;</span><br><span class="line"> </span><br><span class="line">    <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">__construct</span>(<span class="params"><span class="keyword">private</span> <span class="keyword">string</span> <span class="variable">$first</span>, <span class="keyword">private</span> <span class="keyword">string</span> <span class="variable">$last</span></span>) </span>&#123;&#125;</span><br><span class="line"> </span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">string</span> <span class="variable">$fullName</span> &#123;</span><br><span class="line">        get =&gt; <span class="variable language_">$this</span>-&gt;first . <span class="string">&quot; &quot;</span> . <span class="variable language_">$this</span>-&gt;last;</span><br><span class="line"> </span><br><span class="line">        <span class="title function_ invoke__">set</span>(<span class="variable">$value</span>) =&gt; [<span class="variable language_">$this</span>-&gt;first, <span class="variable language_">$this</span>-&gt;last] = <span class="title function_ invoke__">explode</span>(<span class="string">&#x27; &#x27;</span>, <span class="variable">$value</span>);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>이 RFC의 흥미로운 부작용은 인터페이스에서 추상 속성을 선언할 수 있다는 점입니다:</p><figure class="highlight php"><table><tr><td class="code"><pre><span class="line"><span class="keyword">abstract</span> <span class="class"><span class="keyword">class</span> <span class="title">A</span></span></span><br><span class="line"><span class="class"></span>&#123;</span><br><span class="line">    <span class="keyword">abstract</span> <span class="keyword">public</span> <span class="keyword">string</span> <span class="variable">$readable</span> &#123; get; &#125;</span><br><span class="line">    <span class="keyword">abstract</span> <span class="keyword">protected</span> <span class="keyword">string</span> <span class="variable">$writeable</span> &#123; set; &#125;</span><br><span class="line">    <span class="keyword">abstract</span> <span class="keyword">protected</span> <span class="keyword">string</span> <span class="variable">$both</span> &#123; get; set; &#125;   </span><br><span class="line">&#125;</span><br><span class="line"> </span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">C</span> <span class="keyword">extends</span> <span class="title">A</span></span></span><br><span class="line"><span class="class"></span>&#123;</span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">string</span> <span class="variable">$readable</span>;</span><br><span class="line">    <span class="keyword">protected</span> <span class="keyword">string</span> <span class="variable">$readable</span>;</span><br><span class="line">    <span class="keyword">protected</span> <span class="keyword">string</span> <span class="variable">$writeable</span> &#123;</span><br><span class="line">        set =&gt; <span class="variable">$field</span> = <span class="variable">$value</span>;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">string</span> <span class="variable">$both</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><a href="https://github.com/sponsors/SjonHortensius">Sjon Hortensius</a> 덕분에 이미 <a href="https://3v4l.org/">3v4l.org</a>에서 프로퍼티 훅을 사용해 볼 수 있습니다.</p><p>그리고 <a href="https://rfc.stitcher.io/">RFC Vote</a>에 피드백을 제공할 수도 있습니다: <a href="https://rfc.stitcher.io/rfc/property-hooks">Property Hooks</a></p><h1 id="Tools"><a href="#Tools" class="headerlink" title="Tools"></a>Tools</h1><ul><li><p><a href="https://github.com/php-tui/php-tui">php-tui&#x2F;php-tui</a> – 의사(pseudo) 그래픽 UI를 갖춘 PHP로 콘솔 애플리케이션을 만들기 위한 프레임워크.</p></li><li><p><a href="https://github.com/Crell/Serde">Crell&#x2F;Serde</a> – PHP 8을 위한 강력한 직렬화&#x2F;역직렬화 라이브러리.</p></li><li><p><a href="https://github.com/pestphp/pest-plugin-stressless">pestphp&#x2F;pest-plugin-stressless</a> – <a href="https://github.com/grafana/k6">grafana&#x2F;k6</a> 위에 구축된 Pest용 스트레스 부하 테스트 플러그인. 소개 비디오 📺 <a href="https://www.youtube.com/watch?v=SaMoPZwdOCY">Stressless: PHP를 위한 스트레스 테스트</a>를 참조하세요.</p></li><li><p><a href="https://github.com/buggregator/server">buggregator&#x2F;server</a> – XHprof 프로파일러, Symfony VarDumper 서버, SMTP 서버, Sentry 호환 서버, Monolog 서버, HTTP 요청 덤프 서버 등 PHP 애플리케이션을 위한 다양한 디버깅 기능을 제공하는 경량의 독립형 서버입니다.<br>보다 편리한 PHP 디버깅을 위한 콘솔 미니 서버 및 도우미인 <a href="https://github.com/buggregator/trap">buggregator&#x2F;trap</a>이 함께 제공됩니다.</p></li><li><p><a href="https://github.com/NoiseByNorthwest/php-spx">NoiseByNorthwest&#x2F;php-spx</a> – 웹 UI가 내장된 간단하고 직관적인 PHP 프로파일링 확장 프로그램입니다.</p></li><li><p><a href="https://github.com/reliforp/reli-prof">reliforp&#x2F;reli-prof</a> – PHP로 작성된 PHP용 샘플링 프로파일러 또는 메모리 프로파일러로, 프로세스 외부에서 PHP VM 실행에 대한 정보를 읽습니다. 대상 스크립트를 변경하거나 확장을 로드하지 않고도 스크립트에서 성능 병목 현상이나 메모리 누수를 찾을 수 있습니다.<br>또는 PHP용 메모리 프로파일러 확장 프로그램인 <a href="https://github.com/arnaud-lb/php-memory-profiler">arnaud-lb&#x2F;php-memory-profiler</a>를 사용해 볼 수도 있습니다. PHP 스크립트에서 메모리 누수를 찾는 데 도움이 됩니다.</p></li><li><p><a href="https://github.com/saloonphp/xml-wrangler">saloonphp&#x2F;xml-wrangler</a> – XML을 쉽게 읽고 쓸 수 있도록 설계된 간단한 PHP 라이브러리. <a href="https://github.com/veewee/xml">veewee&#x2F;xml</a>도 확인해보세요 - PHP에서 XML로 걱정 없이 작업하는 데 필요한 모든 도구를 제공하는 패키지입니다.</p></li><li><p><a href="https://github.com/jolicode/JoliMarkdown">jolicode&#x2F;JoliMarkdown</a> – 마크다운 콘텐츠를 위한 구문 수정기. 자세한 내용은 졸리마크다운 소개를 읽어보세요.</p></li><li><p><a href="https://github.com/cerbero90/lazy-json">cerbero90&#x2F;lazy-json</a> – 프레임워크에 구애받지 않고 모든 차원과 소스의 JSON 파일을 Laravel 지연 컬렉션에 재귀적으로 로드하는 패키지입니다.</p></li><li><p><a href="https://github.com/staabm/phpstan-baseline-analysis">staabm&#x2F;phpstan-baseline-analysis</a> – PHPStan 기준 파일을 분석하고 집계된 오류 추세 보고서를 생성합니다.</p></li><li><p><a href="https://github.com/spiral/json-schema-generator">spiral&#x2F;json-schema-generator</a> – DTO(데이터 전송 객체) 클래스에서 JSON 스키마를 생성하는 기능을 제공합니다.</p></li></ul><h1 id="Symfony"><a href="#Symfony" class="headerlink" title="Symfony"></a>Symfony</h1><ul><li><a href="https://symfony.com/7">Symfony 7</a> released<br>이번 릴리스의 새로운 기능에 대해 알아보려면 <a href="https://symfony.com/blog/category/living-on-the-edge/7.0-6.4">최신 기능 목록</a>을 확인하세요. 또는 Alexander M. Turek의 <a href="https://slidr.io/derrabus/hello-symfony-7#1">Hello Symfony 7</a> 슬라이드를 확인해 보세요.<br><a href="https://symfony.com/releases/6.4">Symfony 6.4</a>도 7.0과 함께 출시되었습니다. 두 버전 모두 더 이상 사용되지 않는 기능에 대한 지원을 제외하고는 동일한 기능 세트를 포함하고 있습니다.<br>또한 Symfony 6.4는 장기 지원 버전으로 3년 동안 버그 수정, 1년 동안 보안 버그 수정이 제공됩니다. Symfony 7.0은 8개월 동안만 지원되는 일반 버전입니다.</li><li><a href="https://jolicode.com/blog/making-a-single-page-application-with-htmx-and-symfony">HTMX와 심포니로 단일 페이지 애플리케이션 만들기</a> by Julien Cousin-Alliot.</li><li><a href="https://smaine-milianni.medium.com/a-retry-mechanism-for-symfony-commands-15d48f9d4657">Symfony command에 대한 재시도 메커니즘</a> by Smaine Milianni.</li><li><a href="https://github.com/phpyh/service-dumper-bundle">phpyh&#x2F;service-dumper-bundle</a> – 의존성 주입 서비스를 덤프하는 Symfony console command</li></ul><h1 id="Laravel"><a href="#Laravel" class="headerlink" title="Laravel"></a>Laravel</h1><ul><li><a href="https://pulse.laravel.com/">Laravel Pulse announced</a> - 라라벨 팀이 곧 출시될 무료 오픈소스 도구를 공개했습니다. 이 도구는 앱의 주요 성능 및 사용량 지표가 포함된 대시보드가 될 것입니다.</li><li><a href="https://tinkerwell.app/whats-new-in-tinkerwell-4">Tinkerwell v4가 출시되었습니다</a> - 📺 <a href="https://www.youtube.com/watch?v=9FBBsnwRWJ4">Detail Dive</a>에서 자세한 내용을 확인해 보세요.</li><li><a href="https://www.mongodb.com/blog/post/mongodb-laravel-integration-now-officially-supported">이제 공식적으로 지원되는 MongoDB 라라벨 통합</a> - MongoDB는 커뮤니티가 주도하는 라라벨용 MongoDB 통합 개발 작업을 인수하여 그들의 제품 포트폴리오의 일류 시민으로 만들었습니다.</li><li><a href="https://benjamincrozat.com/how-laravel-works">라라벨은 어떻게 작동하나요? 명쾌하게 설명합니다</a> by Benjamin Crozat.</li><li><a href="https://dcblog.dev/my-process-for-writing-laravel-packages">라라벨 패키지 작성 프로세스</a> by David Carr.</li><li><a href="https://muhammedsari.me/unorthodox-eloquent-2">정통적이지 않은 Eloquent II</a> by Muhammed Sari.</li><li><a href="https://tighten.com/insights/overview-of-caching-strategies-in-laravel/">제이미슨 발렌타의 라라벨의 캐싱 전략</a> by Jamison Valenta.</li><li><a href="https://github.com/laravel/pail">laravel&#x2F;pail</a> - 터미널에서 라라벨 로그를 편리하게 볼 수 있는 도구.</li><li><a href="https://github.com/waterholeforum/core">waterholeforum&#x2F;core</a> - 라라벨 기반 커뮤니티 플랫폼&#x2F;포럼.</li><li><a href="https://github.com/BookStackApp/BookStack">BookStackApp&#x2F;BookStack</a> - PHP와 라라벨로 구축된 문서&#x2F;위키 콘텐츠를 생성하는 플랫폼.</li></ul><h1 id="Other-Frameworks"><a href="#Other-Frameworks" class="headerlink" title="Other Frameworks"></a>Other Frameworks</h1><ul><li><a href="https://wordpress.org/news/2023/11/shirley/">WordPress 6.4 “Shirley” 출시</a></li></ul><h1 id="기타"><a href="#기타" class="headerlink" title="기타"></a>기타</h1><ul><li><a href="https://jeffochoa.me/php-enums-best-practices">PHP 열거형 사용 모범 사례</a> by Jeff Ochoa.</li><li><a href="https://github.com/php-fig/per-coding-style/blob/master/migration-2.0.md">PER-CS v1.0(PSR-12)에서 PER-CS v2.0으로 마이그레이션하기</a> by PHP-FIG.</li><li><a href="https://php.watch/articles/php-curl-http3">PHP Curl 확장을 사용한 HTTP&#x2F;3 요청</a> by Ayesh Karunaratne.</li><li><a href="https://php.watch/articles/caddy-php">PHP로 Caddy Server를 사용하는 방법</a> by Ayesh Karunaratne.</li><li><a href="https://www.dereuromark.de/2023/11/27/working-with-decimals-in-php-apps/">PHP 앱에서 소수점(decimal) 작업하기</a> by Mark Scherer.</li><li><a href="https://developer.vonage.com/en/blog/type-safety-done-right-php-array-hacking">올바른 타입 안전 - PHP 배열 해킹</a> by James Seconde.</li><li><a href="https://staabm.github.io/2023/10/30/phpstan-filter-baseline.html">Phpstan Filter Baseline</a> by Markus Staab – 거대한 Phpstan Filter Baseline을 통해 작업하는 한 가지 방법.</li><li><a href="https://github.com/php-youtubers/directory">PHP 유튜버 목록 큐레이션</a>.</li><li><a href="https://finixbit.github.io/posts/autonomous-Hacking-of-PHP-Web-Applications-at-the-Bytecode-Level/">바이트코드 수준에서 PHP 웹 애플리케이션을 자율적으로 해킹하는 방법</a> by Samuel Finixbit.</li><li><a href="https://bref.sh/docs/case-studies/treezor">브레프 사례 연구: Bref로 서버리스 뱅킹 플랫폼을 운영하는 Treezor</a> - 서버의 레거시 PHP 모놀리스로 시작하여 이 모놀리스를 람다(일명 “람다 안의 은행”)에 넣은 다음 마이크로서비스로 전환한 방법.</li><li><a href="https://www.exakat.io/en/mastering-the-array-cast-operator-in-php-a-comprehensive-guide/">PHP에서 (배열) 형 변환 연산자 마스터하기: 종합 가이드</a> by Damien Seguy.</li><li><a href="https://chat.openai.com/g/g-6cqBCrKTn-wp-plugin-architect">WP-Plugin-Architect</a> - 코드 보안에 특별한 주의를 기울이면서 워드프레스 플러그인을 작성할 수 있는 사용자 정의 (채팅)GPT.</li><li><blockquote class="twitter-tweet"><p lang="en" dir="ltr">Cool <a href="https://twitter.com/hashtag/gpt?src=hash&amp;ref_src=twsrc%5Etfw">#gpt</a> trick I learned from a friend today:<br><br>1) create a private GPT<br>2) upload your <a href="https://twitter.com/hashtag/php?src=hash&amp;ref_src=twsrc%5Etfw">#php</a> project in a zip<br>3) ask it questions on how to improve it<br><br>Who knew this goes far beyond the 128k context window 😎<br><br>The results are impresive... feels like talking to myself with having… <a href="https://t.co/nlOyFlmQ70">pic.twitter.com/nlOyFlmQ70</a></p>&mdash; Tomas Votruba (@VotrubaT) <a href="https://twitter.com/VotrubaT/status/1725272310729306346?ref_src=twsrc%5Etfw">November 16, 2023</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script></li><li>(역자주) 위 트윗의 댓글에서 언급한 업로드 방법: <a href="https://twitter.com/pwang_szn/status/1722932229436014772">https://twitter.com/pwang_szn/status/1722932229436014772</a></li></ul><h1 id="Fun"><a href="#Fun" class="headerlink" title="Fun"></a>Fun</h1><ul><li>Sylius는 현재 Kickstarter에서 크라우드 펀딩 캠페인으로 <a href="https://www.kickstarter.com/projects/734475887/sylius-elephpant">ElePHPant를 제공</a>하고 있습니다.<br><img src="https://sylius.elephpant.com/assets/images/main-photo-cropped-ead882b453e3227a738a15f4074f1410.jpg" alt="ElePHPant 이미지"></li><li><a href="https://www.vincentpontier.com/elephpant/produit/the-ping-original-legend-numbered-certified/">오리지널 핑크 코끼리</a>가 판매 중입니다.</li></ul><h1 id="Conferences"><a href="#Conferences" class="headerlink" title="Conferences"></a>Conferences</h1><p>앞으로 개최될 PHP 행사에 참석하여 발표를 신청해 보세요:</p><ul><li><a href="https://live.symfony.com/2023-brussels-con/">SymfonyCon</a> – Brussels, Belgium, December 7–8, 2023.</li><li><a href="https://laracon.eu/">Laracon EU</a> – Amsterdam, The Netherlands, Feb 5–6, 2024.</li><li><a href="https://www.phpconference.co.uk/">PHP UK</a> – London, UK, February 15–16, 2024.</li><li><a href="https://laracon.in/">Laracon India</a> – Udaipur, India, March 23–24, 2024. <a href="https://docs.google.com/forms/d/e/1FAIpQLSdHBOswhGtvmrZLaeHDwdnksJ4oHCvNG58oTyC5roTNA99Qjw/viewform">CFP</a></li><li><a href="https://tek.phparch.com/">PHP[TEK] 2024</a> – Chicago, IL, USA, April 23–25, 2024. <a href="https://sessionize.com/phptek-2024">CFP</a></li><li><a href="https://2024.phpday.it/">phpday 2024</a> – Verona, Italy, May 16–17, 2024. <a href="https://sessionize.com/phpday-2024">CFP</a></li><li><a href="https://phpconference.com/berlin-en/">International PHP Conference</a> – Berlin, Germany, May 27–31, 2024 <a href="https://phpconference.com/call-for-papers/">CFP</a></li></ul><p>가까운 PHP 밋업이 언제 열리는지 궁금하다면 <a href="https://twitter.com/VotrubaT">Tomas Votruba</a>가 운영하는 멋진 밋업 애그리게이터 <a href="https://friendsofphp.org/">friendsofphp.org</a>를 이용해 보세요. <a href="https://www.php.net/cal.php">php.net에 캘린더</a>도 있습니다.</p>]]></content>
    
    
      
      
        
        
    <summary type="html">&lt;p&gt;&lt;img src=&quot;https://blog.jetbrains.com/wp-content/uploads/2023/12/php-annotated-featured_blog_1280x720.png&quot; alt=&quot;PHP Annotated</summary>
        
      
    
    
    
    
    <category term="PHP" scheme="https://haah.kr/tags/PHP/"/>
    
    <category term="php-annotated" scheme="https://haah.kr/tags/php-annotated/"/>
    
    <category term="php-annotated-monthly" scheme="https://haah.kr/tags/php-annotated-monthly/"/>
    
  </entry>
  
  <entry>
    <title>PHP Annotated – October 2023</title>
    <link href="https://haah.kr/2023/11/02/php-annotated-october-2023/"/>
    <id>https://haah.kr/2023/11/02/php-annotated-october-2023/</id>
    <published>2023-11-02T00:38:04.000Z</published>
    <updated>2026-05-31T19:29:57.263Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://blog.jetbrains.com/wp-content/uploads/2023/10/php-annotated-featured_blog_1280x720.png" alt="PHP Annotated 이미지"></p><p><a href="https://blog.jetbrains.com/author/rpronskiy">Roman Pronskiy</a>가 쓰고 JetBrains에서 제공하는 PHP Annotated <a href="https://blog.jetbrains.com/phpstorm/2023/10/php-annotated-october-2023/">2023년 10월</a>호입니다.</p><hr><p>PHP Annotated 10월호에 오신 것을 환영합니다! 엄선된 뉴스, 기사, 도구, 동영상을 통해 지난 한 달간 PHP 커뮤니티에서 가장 흥미로운 발전 사항을 요약해드립니다.</p><h1 id="Highlights"><a href="#Highlights" class="headerlink" title="Highlights"></a>Highlights</h1><h2 id="PHP-8-3-0-RC5-has-been-released"><a href="#PHP-8-3-0-RC5-has-been-released" class="headerlink" title="PHP 8.3.0 RC5 has been released"></a>PHP 8.3.0 RC5 has been released</h2><p><a href="https://www.php.net/archive/2023.php#2023-10-26-1">https://www.php.net/archive/2023.php#2023-10-26-1</a></p><p>또 다른 릴리스 후보가 일정에 따라 제공되었습니다. 여섯 번째 RC는 11월 9일에 예정되어 있으며, PHP 8.3의 최종 릴리스 전 마지막 RC가 될 것입니다.</p><p>PHP 8.3에 추가되는 기능에 대한 자세한 목록은 <a href="https://php.watch/versions/8.3">php.watch</a> 또는 <a href="https://stitcher.io/blog/new-in-php-83">stitcher.io</a>를 참조하세요.</p><p>다음은 곧 출시될 버전에 대한 다른 리소스입니다:</p><ul><li><a href="https://www.exakat.io/en/new-php-error-messages-in-php-8-3/">PHP 8.3의 새로운 PHP 오류 메시지</a>(Damien Seguy 작성). 곧 출시될 새 PHP 버전에 익숙해지는 좋은 방법은 오류 메시지에 대해 읽어보는 것입니다.</li><li><a href="https://www.youtube.com/watch?v=nJFsD0bnlTI">Readonly clones, #[Override], and json_validate: PHP 8.3의 새로운 기능</a> by Brent Roose.</li><li><a href="https://www.youtube.com/watch?v=WUz19fb5zgw">라이브스트림: PHP 8.3의 새로운 기능</a> by Nuno Maduro.</li></ul><h2 id="The-PHP-8-1-25-and-PHP-8-2-12-bug-fix-releases-are-now-available"><a href="#The-PHP-8-1-25-and-PHP-8-2-12-bug-fix-releases-are-now-available" class="headerlink" title="The PHP 8.1.25 and PHP 8.2.12 bug-fix releases are now available"></a>The PHP 8.1.25 and PHP 8.2.12 bug-fix releases are now available</h2><p><a href="https://www.php.net/ChangeLog-8#8.1.25">PHP 8.1.25</a> 및 <a href="https://www.php.net/ChangeLog-8#8.2.12">PHP 8.2.12</a> 버그 수정 릴리스를 지금 사용할 수 있습니다.</p><h2 id="What-was-that-final-noise-about-after-all"><a href="#What-was-that-final-noise-about-after-all" class="headerlink" title="What was that final noise about after all?"></a>What was that <code>final</code> noise about after all?</h2><p>PHP 커뮤니티를 뒤흔든 또 다른 소동은 <a href="https://github.com/stevebauman/unfinalize">stevebauman&#x2F;unfinalize</a> 패키지의 출시로 인해 <a href="https://twitter.com/ste_bau/status/1707020024290918653">발생했습니다</a>. 이 패키지는 <code>vendor</code> 디렉토리에 있는 모든 라이브러리 클래스를 살펴보고 모든 클래스와 메서드에서 <code>final</code> 키워드를 제거합니다.</p><blockquote class="twitter-tweet"><p lang="zxx" dir="ltr"><a href="https://t.co/5SoTwaw2jB">pic.twitter.com/5SoTwaw2jB</a></p>&mdash; Steve Bauman (@ste_bau) <a href="https://twitter.com/ste_bau/status/1707391784404341119?ref_src=twsrc%5Etfw">September 28, 2023</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script><p>일부 개발자는 공급업체 패키지에서 클래스를 확장할 수 있기를 원하기 때문에 Unfinalize를 사용하는 것입니다. 하지만 패키지 관리자가 클래스를 최종 클래스로 표시하는 데는 그럴 만한 이유가 있습니다: 일부 클래스나 메서드를 내부에 유지하여 사용자 코드를 손상시키지 않고 수정할 수 있기를 원하기 때문입니다.</p><p>이 주제는 CS 업계에서 새로운 것이 아니며 <a href="https://en.wikipedia.org/wiki/Fragile_base_class">취약한 기본 클래스 문제(fragile base class problem)</a>로 알려져 있습니다.</p><p>예를 들어 Kotlin과 같은 일부 프로그래밍 언어에서는 클래스가 기본적으로 최종적입니다 😱. 다른 언어에서는 수정자가 단지 규칙일 뿐이지만 이를 준수하지 않으면 종속성을 업데이트하면 애플리케이션이 손상될 수 있습니다.</p><p>바로 이 부분에서 PHP 8.3의 <code>#[Override]</code> 속성이 도움이 될 것입니다! 어떤 이유로 클래스에서 <code>final</code>을 제거한 다음 확장해야 하는 경우 PHP 8.3에서는 자식 클래스의 메소드를 <code>#[Override]</code>로 표시할 수 있습니다. 이 경우 적어도 기본 클래스 메서드가 변경되면 알림을 받을 수 있습니다.</p><p>다음은 이 주제에 대한 커뮤니티의 다른 글입니다:</p><ul><li><code>unfinalize</code>에 대한 <a href="https://blog.codito.dev/2023/10/final-word-about-unfinalize/">마지막 한마디</a> by Grzegorz Korba.</li><li><a href="https://chemaclass.com/blog/final-classes/">PHP | Java | Any의 파이널 클래스</a> by Jose Maria Valera Reales.</li><li><a href="https://uuid.ramsey.dev/en/stable/faq.html#why-does-ramsey-uuid-use-final">ramsey&#x2F;uuid가 파이널을 사용하는 이유</a> by Ben Ramsey.</li><li>📺 <a href="https://www.youtube.com/watch?v=pU4F6M1yGok">Livestream: PHP Unfinalize 드라마에 대해 토론합니다</a> by Nuno Maduro.</li></ul><h1 id="PHP-Core"><a href="#PHP-Core" class="headerlink" title="PHP Core"></a>PHP Core</h1><p>대부분의 핵심 소식은 PHP 재단의 <a href="https://thephp.foundation/blog/tag/roundup/">PHP 코어 라운드업 시리즈</a>에서 자세히 다루고 있으므로 여기서는 몇 가지만 간략하게 언급하겠습니다:</p><h2 id="✅-RFC-Increasing-the-default-bcrypt-cost"><a href="#✅-RFC-Increasing-the-default-bcrypt-cost" class="headerlink" title="✅ RFC: Increasing the default bcrypt cost"></a>✅ RFC: Increasing the default bcrypt cost</h2><p><a href="https://wiki.php.net/rfc/bcrypt_cost_2023">RFC: 기본 bcrypt 비용 상승</a></p><p>기본 BCrypt 비용을 늘리자는 Tim Düsterhus의 제안이 받아들여졌습니다. PHP 8.4에서는 비용이 12로 증가합니다.</p><p>보안 팁: <a href="https://securinglaravel.com/p/security-tip-increase-your-bcrypt">bcrypt 라운드 늘리기</a> by Stephen Rees-Carter.</p><p>역자주:<br>Laravel에서도 기본 bcrypt 라운드를 12(성능과 보안 사이에서 최적의 지점)로 늘리는 PR이 머지되어 있습니다.<br>이 PR에는 관련된 논의를 따라갈 수 있는 링크와 대화가 많은데, 이중에는 bcrypt의 대안으로 알려졌던 Argon2에 관한 내용도 있습니다.</p><blockquote><p>요약하자면, 일부 PHC 심사위원조차도 UX 허용 범위 연구(사용자당 인증 지연 500ms~1초)에 맞춰 인증 속도를 달성하려면 Argon2 제품군과 scrypt를 모두 “하향” 조정해야 한다는 점을 인정합니다. 동등한 인증 속도의 bcrypt보다 오프라인 공격에 대한 저항력이 떨어 집니다 (!)</p><p>역설적이게도 다중 사용자 대화형 로그인 사용 사례와 “여러 해시의 오프라인 공격 저항” 사례의 경우 적절하게 조정된 bcrypt가 여전히 우수합니다.</p><p>즉… 가장 단순하고 가장 이전 버전과 호환되는 옵션(bcrypt 비용 증가)은 현재 가장 안전한 옵션이기도 합니다.</p></blockquote><h2 id="✅-RFC-A-new-JIT-implementation-based-on-IR-Framework"><a href="#✅-RFC-A-new-JIT-implementation-based-on-IR-Framework" class="headerlink" title="✅ RFC: A new JIT implementation based on IR Framework"></a>✅ RFC: A new JIT implementation based on IR Framework</h2><p><a href="https://wiki.php.net/rfc/jit-ir">RFC: IR 프레임워크에 기반한 새로운 JIT 구현</a></p><p>새로운 JIT 구현을 병합하자는 제안이 만장일치로 받아들여졌습니다. PHP 8.4에는 완전히 새로운 빌트인 JIT가 적용될 예정입니다.<br>새로운 JIT에 대한 기술적 세부 사항을 공개하는 프레젠테이션: <a href="https://www.researchgate.net/publication/374470404_IR_JIT_Framework_a_base_for_the_next_generation_JIT_for_PHP">(PDF) 차세대 PHP용 JIT의 기반이 되는 IR JIT 프레임워크</a>가 발표되었습니다.</p><h2 id="📣-RFC-Rounding-integers-as-int"><a href="#📣-RFC-Rounding-integers-as-int" class="headerlink" title="📣 RFC: Rounding integers as int"></a>📣 RFC: Rounding integers as int</h2><p><a href="https://wiki.php.net/rfc/integer-rounding">RFC: 정수를 int로 반올림하기</a></p><p>현재 <code>round</code>, <code>ceiling</code>, <code>floor</code> 함수는 부동 소수점을 반환하지만 <code>2^53</code> 이상의 정수를 사용할 경우 정밀도 손실로 인해 예상치 못한 결과가 발생합니다.<br>Marc Bennewitz는 정수에 대해 반올림을 수행하고 가능한 경우 결과 정수를 반환할 것을 제안합니다.</p><h2 id="📣-RFC-RFC1867-for-non-POST-HTTP-verbs"><a href="#📣-RFC-RFC1867-for-non-POST-HTTP-verbs" class="headerlink" title="📣 RFC: RFC1867 for non-POST HTTP verbs"></a>📣 RFC: RFC1867 for non-POST HTTP verbs</h2><p><a href="https://wiki.php.net/rfc/rfc1867-non-post">RFC: 비-POST HTTP 동사를 위한 RFC1867</a></p><p>Ilija Tovilo는 기존 기능을 사용자 영역에 노출하는 새로운 함수 <code>request_parse_body()</code>를 추가하여 <code>PUT</code> 및 <code>PATCH와</code> 같은 다른 HTTP 동사에 사용할 수 있도록 제안합니다.</p><h1 id="Tools"><a href="#Tools" class="headerlink" title="Tools"></a>Tools</h1><ul><li><p><a href="https://github.com/dunglas/frankenphp">dunglas&#x2F;frankenphp</a> - 필요한 모든 것을 갖춘 최신 PHP 애플리케이션 서버로 자동 HTTPS, HTTP&#x2F;3, 103 Early Hints, Zstandard, PHP용 워커 모드 등을 제공합니다. Caddy를 기반으로 구축되었으며 <a href="https://twitter.com/dunglas/status/1707773703373689147">가장 간단한 구성 프로세스</a>를 제공합니다.</p><iframe src="https://mastodon.social/@dunglas/111172400802536170/embed" class="mastodon-embed" style="max-width: 100%; border: 0" width="400" allowfullscreen="allowfullscreen"></iframe><script src="https://mastodon.social/embed.js" async="async"></script></li><li><p><a href="https://github.com/utopia-php/framework">utopia-php&#x2F;framework</a> – 배우기 쉬운 빠르고 가벼운 마이크로 PHP 프레임워크입니다. <a href="https://appwrite.io/">Appwrite team</a>에서 유지 관리합니다.</p></li><li><p><a href="https://github.com/saloonphp/saloon">saloonphp&#x2F;saloon</a> 3.0.0 - 멋진 API 통합 및 SDK를 구축하기 위한 패키지입니다.</p></li><li><p><a href="https://github.com/phpro/soap-client">phpro&#x2F;soap-client</a> 3.0.0 - SOAP를 처리해야 하는 경우 유지 관리되지 않는 PHP 확장 프로그램을 사용하지 마세요. 대신 이 범용 PHP용 SOAP 클라이언트를 사용해 보세요. 새로운 옵션이 될 수도 있습니다.</p></li><li><p><a href="https://github.com/flow-php/flow">flow-php&#x2F;flow</a> - Flow PHP는 강력하게 유형화된 데이터 처리 프레임워크입니다.<br><img src="https://blog.jetbrains.com/wp-content/uploads/2023/10/flowphp.jpeg" alt="Flow PHP 사용 예시"></p></li><li><p><a href="https://github.com/benholmen/defrag">benholmen&#x2F;defrag</a> - 이 패키지는 90년대 조각 모음 도구 스타일의 출력을 PHPUnit 테스트 스위트로 생성합니다.<br><img src="https://blog.jetbrains.com/wp-content/uploads/2023/10/defrag.gif" alt="defrag 실행 화면"></p></li><li><p><a href="https://github.com/flavioheleno/watchr">flavioheleno&#x2F;watchr</a> - 도메인 이름과 TLS 인증서의 만료일을 확인하는 명령줄 유틸리티 및 GitHub Action입니다.</p></li><li><p><a href="https://github.com/ad-aures/castopod">ad-aures&#x2F;castopod</a> - CodeIgniter로 구축된 오픈 소스 호스팅 플랫폼으로, 청중의 참여를 유도하고 소통하고자 하는 팟캐스터를 위해 만들어졌습니다.</p></li></ul><h1 id="PhpStorm"><a href="#PhpStorm" class="headerlink" title="PhpStorm"></a>PhpStorm</h1><ul><li><a href="https://blog.jetbrains.com/phpstorm/2023/10/the-pest-plugin-is-now-maintained-by-jetbrains/">이제 Pest 플러그인을 JetBrains에서 유지 관리합니다.</a></li><li><a href="https://blog.jetbrains.com/phpstorm/2023/10/the-phpstorm-2023-3-early-access-program-is-now-open/">PhpStorm 2023.3 얼리 액세스 프로그램이 이제 시작되었습니다.</a></li><li><a href="https://plugins.jetbrains.com/plugin/22839-llm?_ga=2.23494835.84822179.1698885071-32683301.1677629892&_gl=1*1c873x*_ga*MzI2ODMzMDEuMTY3NzYyOTg5Mg..*_ga_9J976DJZ68*MTY5OTE0ODIxMC41My4xLjE2OTkxNTIxMzIuMTYuMC4w">LLM</a> - 이 플러그인을 사용하면 PhpStorm에서 모든 Hugging Face 모델을 사용할 수 있습니다.</li><li><a href="https://plugins.jetbrains.com/plugin/22766-voices?_ga=2.23494835.84822179.1698885071-32683301.1677629892&_gl=1*1c873x*_ga*MzI2ODMzMDEuMTY3NzYyOTg5Mg..*_ga_9J976DJZ68*MTY5OTE0ODIxMC41My4xLjE2OTkxNTIxMzIuMTYuMC4w">Voices</a> - 이 플러그인을 사용하면 코드에 음성 주석을 남길 수 있습니다 👁️👄👁️.</li></ul><h1 id="Symfony"><a href="#Symfony" class="headerlink" title="Symfony"></a>Symfony</h1><ul><li><p>Symfony turns 18 🎂</p><blockquote class="twitter-tweet"><p lang="en" dir="ltr">🎉 Today marks 18 years since the first public commit of the Symfony project (<a href="https://t.co/PbX1sp6poL">https://t.co/PbX1sp6poL</a>). Big thanks to all contributors, the community, and projects that have embraced Symfony! Your dedication has made a huge impact in the <a href="https://twitter.com/hashtag/PHP?src=hash&amp;ref_src=twsrc%5Etfw">#PHP</a> ecosystem! 🚀 <a href="https://twitter.com/hashtag/OpenSource?src=hash&amp;ref_src=twsrc%5Etfw">#OpenSource</a> <a href="https://t.co/qtp1ujHSER">pic.twitter.com/qtp1ujHSER</a></p>&mdash; Symfony News (@symfony_en) <a href="https://twitter.com/symfony_en/status/1714531602502504877?ref_src=twsrc%5Etfw">October 18, 2023</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script></li><li><p>Symfony 6.4에 새롭게 추가된 기능 시리즈 by Javier Eguiluz:</p><ul><li><a href="https://symfony.com/blog/new-in-symfony-6-4-command-profiler">Command Profiler</a></li><li><a href="https://symfony.com/blog/new-in-symfony-6-4-chips-cookies">CHIPS Cookies</a></li><li><a href="https://symfony.com/blog/new-in-symfony-6-4-subprocess-handler">Subprocess Handler</a></li><li><a href="https://symfony.com/blog/new-in-symfony-6-4-fqcn-based-routes">FQCN-based Routes</a></li><li><a href="https://symfony.com/blog/new-in-symfony-6-4-impersonation-utilities">Impersonation Utilities</a></li><li><a href="https://symfony.com/blog/new-in-symfony-6-4-class-based-serializer-contexts">Class-based Serializer Contexts</a></li></ul></li><li><p><a href="https://wouterj.nl/2023/10/combatting-login-csrf-with-symfony">Symfony로 로그인 CSRF 대응하기</a> by Wouter de Jong.</p></li><li><p>Symfony 7.1에는 <a href="https://github.com/symfony/symfony/pull/51718#issuecomment-1750332095">새로운 JSON 인코더 컴포넌트</a>도 도입됩니다.</p></li><li><p>Symfony&#x2F;Workflow에는 워크플로우를 탐색하고 그래픽 표현을 볼 수 있는 <a href="https://twitter.com/lyrixx/status/1715316400242274623">새로운 프로파일러</a>가 가되었습니다.</p></li></ul><h1 id="Laravel"><a href="#Laravel" class="headerlink" title="Laravel"></a>Laravel</h1><ul><li><a href="https://timacdonald.me/single-use-tests/">일회용 테스트</a> by Tim MacDonald.</li><li><a href="https://blog.joe.codes/hacking-laravel-prompts-for-fun-and-profit">재미와 이익을 위해 라라벨 프롬프트 해킹하기</a> by Joe Tannenbaum.</li><li><a href="https://flareapp.io/blog/67-building-a-flexible-yet-abstract-external-integrations-structure">유연하면서도 추상적인 외부 통합 구조 구축</a> by Ruben Van Assche.</li><li><a href="https://blog.laracasts.com/posts/8-ways-laravel-helps-you-write-clean-and-terse-code">깔끔하고 간결한 코드를 작성하는 데 도움이 되는 8가지 방법</a> by Benjamin Crozat.</li><li><a href="https://martinjoo.dev/devops-with-laravel-getting-started-with-kubernetes">라라벨을 사용한 데브옵스: Kubernetes 시작하기</a> by Martin Joo.</li><li><a href="https://blog.deleu.dev/laravel-without-dotenv-files/">.env 파일 없는 Laravel</a> by Marco Deleu.</li><li><a href="https://github.com/tomatophp">TomatoPHP</a> - Laravel&#x2F;Splade로 빌드된 이 프레임워크에는 앱 빌드를 위한 수많은 플러그인과 헬퍼가 있습니다.</li></ul><h1 id="기타"><a href="#기타" class="headerlink" title="기타"></a>기타</h1><ul><li><a href="https://tonsky.me/blog/unicode/?ref=architecturenotes.co">2023년 모든 소프트웨어 개발자가 유니코드에 대해 알아야 할 최소한의 정보(여전히 변명의 여지가 없습니다!)</a> by Nikita Prokopov.<br>이모티콘으로 문자열의 정확한 길이를 어떻게 구할 수 있을까요?</li></ul><p><code>strlen(&#39;👨‍👩‍👧‍👦&#39;);</code> 반환값 25.<br><code>mb_strlen(&#39;👨‍👩‍👧‍👦&#39;);</code> 반환값 7.<br><code>grapheme_strlen(&#39;👨‍👩‍👧‍👦&#39;);</code>은 1을 반환합니다.</p><p>이 포스트에서 그 이유를 설명합니다.</p><ul><li><a href="https://pronskiy.com/blog/php-script-as-binary/">모든 PHP 스크립트를 네이티브 단일 파일 바이너리로 전환하기</a> by Roman Pronskiy.</li><li><a href="https://soyuka.me/how-to-create-a-php-playground-for-your-documentation/">문서화를 위한 PHP 플레이그라운드를 만드는 방법</a> by Antoine Bluchet.</li><li><a href="https://phpbyexample.dev/">예제로 보는 PHP</a> - Go와 <a href="https://doc.rust-lang.org/rust-by-example/">Rust의 비슷한 예제</a>에서 영감을 얻은 이 글은 PHP 초보자에게 좋은 입문서가 될 수 있습니다.</li><li><a href="https://fideloper.com/php-weird-stateless-and-beautiful">PHP는 이상하고, 무상태이며, 아름답다</a> by Chris Fidao.</li><li>📺 <a href="https://www.youtube.com/watch?v=XKi460z5knA">PHP-FPM과 Swoole 실행 모델 비교</a> by Mateus Guimarães.</li><li>📺 <a href="https://www.youtube.com/watch?v=JtmRG5lCENA">PHP 제네릭은 오지 않는다…</a> by Brent Roose.</li></ul><h1 id="Fun"><a href="#Fun" class="headerlink" title="Fun"></a>Fun</h1><ul><li><p>📺 <a href="https://youtu.be/cmq1g3ZQ1Xo?si=3ZProLa0fwoV20R9">PHP는 자바스크립트보다 4배 빠릅니다!</a> by Nuno Maduro.</p></li><li><p><a href="https://www.php.net/robots.txt">php.net&#x2F;robots.txt</a>에는 아시모프의 로봇 공학 법칙이 포함되어 있습니다 🤖:<br><img src="https://blog.jetbrains.com/wp-content/uploads/2023/10/php-net-robots.png" alt="php.net/robots.txt 내용"></p></li><li><p><a href="https://github.com/jeremeamia/mu">jeremeamia&#x2F;mu</a> - 이 “진짜” 🌚 마이크로 프레임워크는 단 세 줄의 코드(3-LOC)에 들어갑니다.</p><figure class="highlight php"><table><tr><td class="code"><pre><span class="line">(<span class="keyword">new</span> µ)-&gt;<span class="title function_ invoke__">get</span>(<span class="string">&#x27;/hello/(?&lt;name&gt;\w+)&#x27;</span>, function (<span class="variable">$app</span>, <span class="variable">$params</span>) &#123;</span><br><span class="line">  <span class="keyword">echo</span> <span class="string">&quot;&lt;p&gt;Hello, <span class="subst">&#123;$params[&#x27;name&#x27;]&#125;</span>!&lt;/p&gt;&quot;</span>;</span><br><span class="line">&#125;)</span><br><span class="line">-&gt;<span class="title function_ invoke__">run</span>();</span><br></pre></td></tr></table></figure></li></ul><h1 id="Conferences"><a href="#Conferences" class="headerlink" title="Conferences"></a>Conferences</h1><p>발표를 위해 방문하고 신청할 만한 다음 PHP 행사를 확인해 보세요:</p><ul><li><a href="https://laracon.au/">Laracon AU</a> – Sydney, Australia, November 16–17, 2023.</li><li><a href="https://2023.phpcon.pl/en/">PHPCon Poland</a> – Zawiercie, Poland, November 17–18, 2023.</li><li><a href="https://live.symfony.com/2023-brussels-con/">SymfonyCon</a> – Brussels, Belgium, December 7–8, 2023.</li><li><a href="https://laracon.eu/">Laracon EU</a> – Amsterdam, The Netherlands, Feb 5–6, 2024. CFP</li><li><a href="https://www.phpconference.co.uk/">PHP UK</a> – London, UK, February 15–16, 2024. CFP</li><li><a href="https://laracon.in/">Laracon India</a> – Udaipur, India, March 23–24, 2024. CFP 🆕</li><li><a href="https://tek.phparch.com/">PHP[TEK] 2024</a> – Chicago, IL, USA, April 23–25, 2024. CFP 🆕</li><li><a href="https://2024.phpday.it/">phpday 2024</a> – Verona, Italy, May 16–17, 2024. CFP 🆕</li></ul><p>가까운 곳에서 다음 PHP 밋업이 언제 열리는지 궁금하다면 <a href="https://twitter.com/VotrubaT">Tomas Votruba</a>가 운영하는 멋진 밋업 애그리게이터 <a href="https://friendsofphp.org/">friendsofphp.org</a>에서 확인할 수 있습니다. php.net - 이벤트에도 캘린더가 있습니다: <a href="https://www.php.net/cal.php">2023년 11월</a>.</p>]]></content>
    
    
      
      
        
        
    <summary type="html">&lt;p&gt;&lt;img src=&quot;https://blog.jetbrains.com/wp-content/uploads/2023/10/php-annotated-featured_blog_1280x720.png&quot; alt=&quot;PHP Annotated</summary>
        
      
    
    
    
    
    <category term="PHP" scheme="https://haah.kr/tags/PHP/"/>
    
    <category term="php-annotated" scheme="https://haah.kr/tags/php-annotated/"/>
    
    <category term="php-annotated-monthly" scheme="https://haah.kr/tags/php-annotated-monthly/"/>
    
  </entry>
  
  <entry>
    <title>PHP Annotated – September 2023</title>
    <link href="https://haah.kr/2023/09/30/php-annotated-september-2023/"/>
    <id>https://haah.kr/2023/09/30/php-annotated-september-2023/</id>
    <published>2023-09-30T02:12:18.000Z</published>
    <updated>2026-05-31T19:29:57.263Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://blog.jetbrains.com/wp-content/uploads/2023/09/php-annotated-featured_blog_1280x720.png" alt="PHP Annotated 이미지"></p><p><a href="https://blog.jetbrains.com/author/rpronskiy">Roman Pronskiy</a>가 쓰고 JetBrains에서 제공하는 PHP Annotated <a href="https://blog.jetbrains.com/phpstorm/2023/09/php-annotated-september-2023/">2023년 9월</a>호입니다.</p><hr><p>PHP Annotated 9월호에 오신 것을 환영합니다! 엄선된 뉴스, 기사, 도구, 동영상을 통해 지난 한 달간 PHP 커뮤니티에서 가장 흥미로운 발전 사항을 요약해드립니다.</p><h1 id="Highlights"><a href="#Highlights" class="headerlink" title="Highlights"></a>Highlights</h1><h2 id="PHP-8-0-30-PHP-8-1-22-and-PHP-8-2-9-have-been-released"><a href="#PHP-8-0-30-PHP-8-1-22-and-PHP-8-2-9-have-been-released" class="headerlink" title="PHP 8.0.30, PHP 8.1.22, and PHP 8.2.9 have been released"></a>PHP 8.0.30, PHP 8.1.22, and PHP 8.2.9 have been released</h2><p><a href="https://www.php.net/ChangeLog-8#8.0.30">PHP 8.0.30</a>, <a href="https://www.php.net/ChangeLog-8#8.1.22">PHP 8.1.22</a> 및 <a href="https://www.php.net/ChangeLog-8#8.2.9">PHP 8.2.9</a>가 릴리스되었습니다.</p><p>❗보안 릴리스이며 <a href="https://github.com/php/php-src/security/advisories/GHSA-3qrf-m4j2-pcrr">GHSA-3qrf-m4j2-pcrr</a>(XML에서 외부 엔티티를 활성화하지 않고 로드) 및 <a href="https://github.com/php/php-src/security/advisories/GHSA-jqcx-ccgc-xwhv">GHSA-jqcx-ccgc-xwhv</a>(<code>phar_dir_read()</code>의 버퍼 오버플로 및 초과 읽기)에 대한 수정이 포함되어 있습니다.</p><p>아직 PHP 7.*을 사용 중이라면 <a href="https://blog.remirepo.net/post/2022/11/29/PHP-7.4-is-retired#comments">Remi의 리포지토리</a>에 백포트된 보안 수정이 포함된 업데이트가 있습니다.</p><h2 id="PHP-8-3-0RC2-has-been-released"><a href="#PHP-8-3-0RC2-has-been-released" class="headerlink" title="PHP 8.3.0RC2 has been released"></a>PHP 8.3.0RC2 has been released</h2><p><a href="https://www.php.net/archive/2023.php#2023-09-14-1">PHP 8.3.0RC2가 출시되었습니다.</a></p><p>두 번째 RC가 <a href="https://wiki.php.net/todo/php83">일정</a>에 따라 제공되었습니다. 다음 릴리스는 9월 28일에 예정된 RC3이며, PHP 8.3의 자세한 기능 목록은 <a href="https://php.watch/versions/8.3">php.watch</a> 또는 <a href="https://stitcher.io/blog/new-in-php-83">stitcher.io</a>에서 확인할 수 있습니다.</p><h2 id="RFC-Vote"><a href="#RFC-Vote" class="headerlink" title="RFC Vote"></a>RFC Vote</h2><p><a href="https://rfc.stitcher.io/">RFC 투표</a></p><p>Brent Roose가 RFC에 대한 커뮤니티 투표를 위한 프로젝트를 시작했습니다.</p><p>공식 RFC 투표는 내부 개발자로 제한되지만, RFC 투표는 모든 사람에게 목소리를 제공합니다. 이는 공식 PHP RFC 결과에 직접적인 영향을 미치지는 않지만 의사 결정 과정에 참여하는 사람들에게 귀중한 자료가 될 수 있습니다.</p><p><a href="https://github.com/brendt/rfc-vote">brendt&#x2F;rfc-vote</a> 프로젝트는 오픈소스이며, 브렌트가 유튜브의 <a href="https://www.youtube.com/playlist?list=PL0bgkxUS9EaLguM2puiMD-NiiV6r5b8RY">PHP Annotated</a>에서 개발 전 과정을 스트리밍하고 있습니다.</p><h2 id="WordPress-6-3-“Lionel”-is-out"><a href="#WordPress-6-3-“Lionel”-is-out" class="headerlink" title="WordPress 6.3 “Lionel” is out"></a>WordPress 6.3 “Lionel” is out</h2><p>워드프레스 6.3 “라이오넬”이 출시되었습니다.</p><p>무엇보다도 <a href="https://make.wordpress.org/core/2023/08/07/wordpress-6-3-performance-improvements/">성능이 크게 개선</a>되었습니다.</p><h2 id="PhpStorm-2023-2-Is-Available-and-the-PhpStorm-2023-3-roadmap-has-been-released"><a href="#PhpStorm-2023-2-Is-Available-and-the-PhpStorm-2023-3-roadmap-has-been-released" class="headerlink" title="PhpStorm 2023.2 Is Available and the PhpStorm 2023.3 roadmap has been released"></a>PhpStorm 2023.2 Is Available and the PhpStorm 2023.3 roadmap has been released</h2><p><a href="https://www.jetbrains.com/phpstorm/whatsnew/?_ga=2.184534370.594458224.1696039667-32683301.1677629892&_gl=1*9ok68n*_ga*MzI2ODMzMDEuMTY3NzYyOTg5Mg..*_ga_9J976DJZ68*MTY5NjAzOTY2Ni40NC4xLjE2OTYwNDE0MzkuNjAuMC4w">PhpStorm 2023.2</a> 사용 가능하고<a href="https://blog.jetbrains.com/phpstorm/2023/09/phpstorm-public-roadmap-whats-coming-in-2023-3/">PhpStorm 2023.3 로드맵</a>이 출시되었습니다.</p><h2 id="The-PHP-Foundation-is-hiring-PHP-core-developers"><a href="#The-PHP-Foundation-is-hiring-PHP-core-developers" class="headerlink" title="The PHP Foundation is hiring PHP core developers"></a>The PHP Foundation is hiring PHP core developers</h2><p><a href="https://thephp.foundation/blog/2023/09/06/application-form-2023/">PHP 재단에서 PHP 코어 개발자를 채용합니다.</a></p><p>PHP 코어에 기여하거나 확장 프로그램을 개발한 경험이 있고 유급 오픈소스 작업을 하고 싶다면 이번 기회가 좋은 기회가 될 수 있습니다.</p><p>지원서 접수는 <strong>9월 30일까지</strong>입니다.</p><h2 id="CakePHP-5-is-out"><a href="#CakePHP-5-is-out" class="headerlink" title="CakePHP 5 is out"></a>CakePHP 5 is out</h2><p><a href="https://bakery.cakephp.org/2023/09/09/cakephp_500.html">CakePHP 5 출시</a></p><p>이번 릴리스에서는 프레임워크 전반에 걸쳐 향상된 타입 힌트, PHPUnit 10.x로의 업그레이드, ORM의 새로운 열거형 유형 매핑 지원, PSR17 HTTP 팩토리 지원 등을 제공합니다.</p><h2 id="Concerns-over-the-European-Union’s-Cyber-Resilience-Act-CRA"><a href="#Concerns-over-the-European-Union’s-Cyber-Resilience-Act-CRA" class="headerlink" title="Concerns over the European Union’s Cyber Resilience Act (CRA)"></a>Concerns over the European Union’s Cyber Resilience Act (CRA)</h2><p><a href="https://wordpress.org/news/2023/08/concerns-over-the-european-unions-cyber-resilience-act-cra/">유럽연합의 사이버 복원력 법(CRA)에 대한 우려</a></p><p>WordPress, Drupal, Joomla! 및 TYPO3 프로젝트는 유럽에서 오픈소스의 더 나은 미래를 위해 CRA를 개선하는 방법에 대한 비판과 권고 사항을 담은 <a href="https://wordpress.org/news/files/2023/08/Open_Letter_on_the_Significance_of_Free_and_Open_Source_Software_in_the_EU_s_Proposed_Cyber_Resilience_Act.pdf">공개 서한</a>을 EU 입법자들에게 보냈습니다.</p><blockquote><p>개인, 중소기업, 기관은 CRA에 따른 처벌을 우려해 막대한 행정적 부담이나 활동 위축(그리고 미국 기술 대기업으로의 쏠림 현상)으로 인해 방해를 받게 될 것입니다.</p></blockquote><p>EU-CRA에 대한 가장 좋은 요약은 Apache Software Foundation의 이 <a href="https://news.apache.org/foundation/entry/save-open-source-the-impending-tragedy-of-the-cyber-resilience-act">블로그 게시물</a>에서 확인할 수 있습니다.</p><blockquote><p>TLDR;<br>오픈 소스를 포함한 소프트웨어는 전 세계적으로 규제를 받고 있습니다. 이 긴 블로그 게시물에서는 유럽 연합의 사이버 복원력법(Cyber ​​Resilience Act)의 배경, 좋은 점, 결점, 오픈 소스에 미칠 수 있는 부정적인 영향에 대해 설명합니다.</p></blockquote><p>더 간단하게 정리된 한글 문서를 원하시면 <a href="https://www.kita.net/cmmrcInfo/cmmrcNews/overseasMrktNews/overseasMrktNewsDetail.do?type=0&nIndex=1834414">유럽의회 ‘사이버복원력법(CRA)’ 수정안 개요</a>를 읽어보세요.</p><h1 id="PHP-Core"><a href="#PHP-Core" class="headerlink" title="PHP Core"></a>PHP Core</h1><p>대부분의 핵심 소식은 PHP 재단의 <a href="https://thephp.foundation/blog/2023/07/01/php-core-roundup-14/">PHP Core Roundup series</a>에서 자세히 다루고 있으므로 여기서는 몇 가지만 간략하게 언급하겠습니다:</p><h2 id="📣RFC-A-new-JIT-implementation-based-on-IR-Framework"><a href="#📣RFC-A-new-JIT-implementation-based-on-IR-Framework" class="headerlink" title="📣RFC: A new JIT implementation based on IR Framework"></a>📣RFC: A new JIT implementation based on IR Framework</h2><p><a href="https://wiki.php.net/rfc/jit-ir">RFC: IR 프레임워크에 기반한 새로운 JIT 구현</a></p><p>Dmitry Stogov가 별도로 개발된 <a href="https://github.com/dstogov/ir">IR 프레임워크</a>에 기반한 새로운 JIT 구현을 제안합니다.</p><p>이 제안이 받아들여지면 일반 PHP 사용자는 성능 향상을 크게 느끼지 못할 수도 있습니다. 현재 상태의 새로운 JIT를 사용하면 PHP-Parser 및 AMPHP와 같이 CPU를 사용하는 애플리케이션의 속도가 약간 향상될 것입니다. 추가 최적화를 통해 속도가 더 빨라지겠지만 극적인 증가는 없을 것입니다.</p><p>새 엔진의 가장 큰 장점은 사용이 간편하다는 점입니다. PHP와는 별개의 컴포넌트로 개발되었기 때문에 IR 프로젝트는 PHP 외부에서 활용할 수 있습니다. 이는 잠재적으로 JIT 구현과 관련된 ‘버스 팩터’를 줄이는 데 도움이 될 수 있습니다.</p><h2 id="📣RFC-DOM-HTML5-parsing-and-serialization"><a href="#📣RFC-DOM-HTML5-parsing-and-serialization" class="headerlink" title="📣RFC: DOM HTML5 parsing and serialization"></a>📣RFC: DOM HTML5 parsing and serialization</h2><p><a href="https://wiki.php.net/rfc/domdocument_html5_parser">RFC: DOM HTML5 구문 분석 및 직렬화</a></p><p>Niels Dossche는 DOM 확장에 두 개의 새로운 클래스를 추가할 것을 제안합니다: <code>DOM\HTMLDocument</code>와 <code>DOM\XMLDocument</code>입니다.</p><p><code>HTMLDocument</code> 클래스는 사양을 준수하는 HTML5 문서 구문 분석 및 직렬화에 대한 지원을 추가할 것입니다. <code>XMLDocument</code> 클래스는 호환성을 위해 유지되는 <code>\DOMDocument</code>의 최신 대안으로 사용될 것입니다. 이 새로운 클래스는 또한 문서 로딩을 위한 보다 오용을 방지할 수 있는 API를 제공할 것입니다.</p><p>전역 네임스페이스에 있는 기존 DOM 클래스는 새 DOM 네임스페이스에서 별칭을 갖게 되므로 새 구현이 기본값이 됩니다.</p><h2 id="Who-Is-Behind-PHP-by-Christoph-Rumpel"><a href="#Who-Is-Behind-PHP-by-Christoph-Rumpel" class="headerlink" title="Who Is Behind PHP by Christoph Rumpel."></a>Who Is Behind PHP by Christoph Rumpel.</h2><p><a href="https://christoph-rumpel.com/2023/7/who-is-behind-php">PHP의 배후는 누구인가</a> by Christoph Rumpel.</p><p>이 블로그 게시물에서 Christoph는 누가 투표권을 갖는지, Karma란 무엇인지, PHP에 기여자가 되는 방법 등 PHP 개발 프로세스에서 명확하지 않은 모든 종류의 사항을 명확하게 설명합니다.</p><h1 id="Tools"><a href="#Tools" class="headerlink" title="Tools"></a>Tools</h1><ul><li><p><a href="https://github.com/theodo-group/LLPhant">theodo-group&#x2F;LLPhant</a> - Langchain과 LLamaIndex에서 영감을 얻은 OpenAI GPT 4를 사용하는 포괄적인 PHP 생성 AI 프레임워크입니다.<br>이 프레임워크를 사용하면 한 줄로 함수를 자동으로 정의하고 OpenAI가 응답에서 그렇게 말하면 함수를 실행할 수 있습니다.</p><blockquote class="twitter-tweet"><p lang="en" dir="ltr">Super happy that I&#39;ve added a crazy simple way to make <a href="https://twitter.com/OpenAI?ref_src=twsrc%5Etfw">@OpenAI</a> calls any function from your codebase with <a href="https://twitter.com/hashtag/LLPhant?src=hash&amp;ref_src=twsrc%5Etfw">#LLPhant</a> in <a href="https://twitter.com/hashtag/PHP?src=hash&amp;ref_src=twsrc%5Etfw">#PHP</a> 🐘<br><br>This is one of my favorite feature from <a href="https://twitter.com/hashtag/GPT4?src=hash&amp;ref_src=twsrc%5Etfw">#GPT4</a> because it opens a vast amount of possibilities.<br>If you don&#39;t know it, OpenAI has refined its model to… <a href="https://t.co/hwH25mJap2">pic.twitter.com/hwH25mJap2</a></p>&mdash; Maxime Thoonsen 🌳 (@maxthoon) <a href="https://twitter.com/maxthoon/status/1694337788999561486?ref_src=twsrc%5Etfw">August 23, 2023</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>더 많은 예제는 이 블로그 게시물에서 확인할 수 있습니다: https://blog.theodo.com/2023/08/qdrant-llphant-generative-ai-php/.또한 PHP로 AutoGPT 클론을 만들 수도 있습니다:<blockquote class="twitter-tweet"><p lang="en" dir="ltr">🤩Really happy to announce AutoPHP, the autonomous agent in <a href="https://twitter.com/hashtag/PHP?src=hash&amp;ref_src=twsrc%5Etfw">#PHP</a> !<br><br>Here is a video to showcase it with the objective :<br>&quot;find the name of wives or girfriends from at least 2 players from the 2023 male french football team&quot; <a href="https://t.co/AGeHhnrET6">pic.twitter.com/AGeHhnrET6</a></p>&mdash; Maxime Thoonsen 🌳 (@maxthoon) <a href="https://twitter.com/maxthoon/status/1702610376548901051?ref_src=twsrc%5Etfw">September 15, 2023</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> </li><li><p><a href="https://github.com/emreyarligan/enum-concern">emreyarligan&#x2F;enum-concern</a> – 라라벨 컬렉션으로 손쉽게 열거를 처리할 수 있는 패키지입니다.</p></li><li><p><a href="https://github.com/hyperf/hyperf">hyperf&#x2F;hyperf</a> – 초고속과 유연성에 중점을 둔 Swoole 기반 코루틴 프레임워크입니다.</p></li><li><p><a href="https://github.com/loupe-php/loupe">loupe-php&#x2F;loupe</a> – 토큰화, stemming(어간추출), 오타 허용, 필터 및 지역 지원 기능을 갖춘 PHP와 SQLite만을 기반으로 하는 전체 텍스트 검색 엔진입니다.</p></li><li><p><a href="https://github.com/TomasVotruba/lines/">TomasVotruba&#x2F;lines</a> – 어디서나 실행 가능한 CLI 도구로 PHP 프로젝트의 규모를 빠르게 측정할 수 있습니다.</p></li><li><p><a href="https://github.com/Chemaclass/bashunit">Chemaclass&#x2F;bashunit</a> – bash 스크립트를 위한 최소한의 테스트 라이브러리입니다.</p></li><li><p><a href="https://github.com/laminas/laminas-text/">laminas&#x2F;laminas-text</a> – 멋진 아스키 텍스트 배너를 원하셨나요?</p><figure class="highlight php"><table><tr><td class="code"><pre><span class="line"><span class="variable">$figlet</span> = <span class="keyword">new</span> <span class="title class_">Laminas\Text\Figlet\Figlet</span>();</span><br><span class="line"><span class="keyword">echo</span> <span class="variable">$figlet</span>-&gt;<span class="title function_ invoke__">render</span>(<span class="string">&#x27;PHP Rocks&#x27;</span>);</span><br></pre></td></tr></table></figure></li><li><p><a href="https://github.com/espocrm/espocrm">espocrm&#x2F;espocrm</a> – PHP로 구축된 성숙한 오픈소스 CRM입니다.</p></li><li><p><a href="https://caniphp.com/">Can I PHP?</a> – 특정 기능을 도입한 PHP 버전을 빠르게 확인할 수 있습니다.</p></li></ul><h1 id="Symfony"><a href="#Symfony" class="headerlink" title="Symfony"></a>Symfony</h1><ul><li><a href="https://dunglas.dev/2023/08/6x-faster-docker-builds-for-symfony-and-api-platform-projects/">심포니 및 API 플랫폼 프로젝트를 위한 6배 더 빠른 Docker 빌드</a> by Kévin Dunglas.</li><li><a href="https://jolicode.com/blog/a-new-way-to-squash-your-doctrine-migrations">새로운 Doctrine 마이그레이션 방법</a> by Grégoire Pineau.</li><li><a href="https://sergiiblog.com/symfony-vs-flask-vs-spring-boot-part-1-usability-and-speed-of-coding/">Symfony vs Flask vs Spring Boot</a> – Usability and Speed of Codingby Sergii Demianchuk.</li><li><a href="https://medium.com/@skowron.jakub1/unlock-the-power-of-dto-in-symfony-with-this-one-library-b00db41e0e66">이 하나의 라이브러리로 Symfony에서 DTO의 강력한 기능을 활용하세요!</a> by Jakub Skowron.</li><li><a href="https://symfony.com/blog/symfony-7-0-type-declarations">Symfony 7.0 Type 선언</a> by Wouter de Jong.</li><li><a href="https://github.com/zenstruck/messenger-monitor-bundle">zenstruck&#x2F;messenger-monitor-bundle</a> – 메신저 작업자, 전송, 일정, 메시지를 모니터링할 수 있는 UI입니다.</li><li>❗<a href="https://symfony.com/blog/cve-2023-41336-symfony-ux-autocomplete-prevent-injection-of-invalid-entity-ids-for-autocomplete-fields">CVE-2023-41336: symfony&#x2F;ux-autocomplete Prevent injection of invalid entity ids for “autocomplete” fields</a> by Ryan Weaver.</li><li>❗<a href="https://symfony.com/blog/twig-2-end-of-life">Twig 2 end of life</a> by Fabien Potencier.</li></ul><h1 id="Laravel"><a href="#Laravel" class="headerlink" title="Laravel"></a>Laravel</h1><ul><li><a href="https://filamentphp.com/community/danharrin-filament-v3">Filament 3.0.0</a>이 출시되었습니다</li><li><a href="https://tomasvotruba.com/blog/experiment-how-i-replaced-symfony-di-with-laravel-container-in-ecs">실험: ECS에서 Symfony DI를 Laravel 컨테이너로 교체한 방법 및 Laravel 컨테이너에서 서비스를 제거하는 것은 그렇게 쉽지 않습니다</a> by Tomas Votruba.</li><li><a href="https://benjamincrozat.com/custom-filesystem-adapter-laravel">Laravel에서 사용자 정의 파일 시스템 어댑터를 만드는 방법</a> by Benjamin Crozat.</li><li><a href="https://dev.to/aschmelyun/making-the-case-for-laravel-as-a-nextjs-alternative-3o5p">Next.js의 대안으로서 Laravel의 사례 만들기</a> by Andrew Schmelyun.</li><li><a href="https://stateoflaravel.com/results">라라벨 현황 설문조사 결과</a>.</li><li><a href="https://laravel-news.com/nativephp-tutorial">NativePHP 튜토리얼: Mac MenuBar 애플리케이션 구축하기</a> by Shane D Rosenthal.</li><li><a href="https://julienbourdeau.com/laravel-hashid">라라벨에서 Hashid 사용하기(UUID 대신)</a> by Julien Bourdeau.</li><li><a href="https://muhammedsari.me/unorthodox-eloquent">정통적이지 않은 Eloquent</a> by Muhammed Sari.<ul><li>그리고 이 글에서는 Shawn McCool의 <a href="https://shawnmc.cool/2023-02-13_active-record-how-we-got-persistence-perfectly-wrong">Active Record에 관한 글</a>을 읽어 보도록 여러번 강조합니다.</li></ul></li><li><a href="https://github.com/thedevdojo/genesis">thedevdojo&#x2F;genesis</a> – Laravel Folio 및 Volt로 구축된 애플리케이션 스타터 키트.</li><li><a href="https://github.com/WendellAdriel/laravel-lift">WendellAdriel&#x2F;laravel-lift</a> – Eloquent models with PHP attributes.</li><li><a href="https://github.com/readme/featured/laravel-community">Laravel은 지구상에서 가장 행복한 개발자 커뮤니티인가</a> by Klint Finley – GitHub의 ReadME 프로젝트 블로그에 게시되었습니다.</li></ul><h1 id="기타"><a href="#기타" class="headerlink" title="기타"></a>기타</h1><ul><li><a href="https://www.conroyp.com/articles/building-resilient-code-harnessing-the-power-of-value-objects">탄력적인 코드 구축: 값 객체의 힘 활용하기</a> by Paul Conroy.</li><li><a href="https://tomasvotruba.com/blog/how-to-remove-transitional-dependencies-you-dont-need">불필요한 트랜지션 종속성을 제거하는 방법</a> by Tomas Votruba (Rector).</li><li><a href="https://ryangjchandler.co.uk/posts/understanding-serialisation-in-php">PHP에서 직렬화 이해하기 작성자</a> by Ryan Chandler.</li><li><a href="https://derickrethans.nl/concealed-code.html">숨겨진 코드</a> by Derick Rethans – TIL: php.ini에서 확장을 추가하는 순서가 매우 중요하며, 특히 Xdebug는 Opcache 다음에 추가해야 합니다.</li><li><a href="https://php.watch/articles/parse_ini_string-file-security-considerations">사용자가 제공한 INI 문자열과 파일을 구문 분석할 때 고려해야 할 보안 사항</a> by Ayesh Karunaratne.</li><li><a href="https://aoeex.com/phile/php-fibers-a-practical-example/">PHP Fibers: 실용적인 예제</a> by Keith Maika.</li><li><a href="https://tideways.com/profiler/blog/the-php-stat-cache-explained">The PHP stat cache explained</a> by Benjamin Eberlei (Tideways, PHP Foundation).</li><li><a href="https://github.com/dykyi-roman/architecture">소프트웨어 아키텍처 패턴</a> by Roman Dykyi – DIP, SOLID, GRASP, CQR, CQRS, 육각형 아키텍처, 계층형 아키텍처, 모듈형 모놀리스, 마이크로서비스, 이벤트 중심 아키텍처, DDD에 대한 간결한 설명입니다.</li><li><a href="https://themsaid.com/infrastructure-management-for-several-high-traffic-php-applications">트래픽이 많은 여러 PHP 애플리케이션을 위한 인프라 관리</a> by Mohamed Said.</li><li><a href="https://www.splitbrain.org/blog/2023-08/15-using_sqlite_as_vector_store_in_php">PHP에서 SQLite를 벡터 저장소로 사용하기</a> by Andreas Gohr.</li><li>📺 <a href="https://www.youtube.com/watch?v=x9bj30cWolA">PHP에서 Trait, Interface, Abstract 클래스를 언제 사용해야 하는가</a> by Andrew Schmelyun.</li><li>📺 <a href="https://www.youtube.com/watch?v=u420A89tIMY">Debugging FFI and PHP</a> by Derick Rethans (Xdebug, PHP Foundation).</li><li><a href="https://stitcher.io/blog/attributes-in-php-8">PHP 8: Attributes</a> by Brent Roose (JetBrains).</li><li><a href="https://timotijhof.net/posts/2023/an-internet-of-php/">An Internet of PHP</a> by Timo Tijhof (Wikimedia).</li><li><a href="https://gist.github.com/mindplay-dk/1b0dde22160c31e4f76b4347bb3da1b1">Upgrading PHP</a> by Rasmus Schultz – 패키지 및 프로젝트의 최소 PHP 버전 요구 사항을 업그레이드하기 위한 가이드라인입니다.</li></ul><h1 id="Fun"><a href="#Fun" class="headerlink" title="Fun"></a>Fun</h1><ul><li><p>디스크 조각 모음기 스타일의 PHPUnit 출력: <blockquote class="twitter-tweet"><p lang="en" dir="ltr">Update: the somebody is me, I&#39;m doing it.<br><br>My prototype is mostly working! Now to hook into the PHPUnit event system. <a href="https://t.co/0TFWShakuI">https://t.co/0TFWShakuI</a> <a href="https://t.co/nU0LBdHZbj">pic.twitter.com&#x2F;nU0LBdHZbj</a></p>&amp;mdash; Ben Holmen (@benholmen) <a href="https://twitter.com/benholmen/status/1703831426343256116?ref_src=twsrc%5Etfw">September 18, 2023</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script></p></li><li><p><a href="https://github.com/phpgl/flappyphpant">phpgl&#x2F;flappyphpant</a> – PHP로 작성되고 PHP-GLFW 및 VISU 프레임워크를 기반으로 하는 간단한 플래피 버드와 유사한 게임입니다. <img src="https://user-images.githubusercontent.com/956212/258669173-9d32a533-73cb-40e6-b940-7976b765d658.gif" alt="flappyphpant gif"></p></li><li><p>A love snippet from <a href="https://twitter.com/FredBouchery/status/1702670198598140006">Frédéric Bouchery</a>:</p><figure class="highlight php"><table><tr><td class="code"><pre><span class="line"><span class="meta">&lt;?php</span> <span class="keyword">for</span> (<span class="variable">$y</span> = <span class="number">15</span>; <span class="variable">$y</span> &gt;= -<span class="number">15</span>; <span class="variable">$y</span>--) &#123;</span><br><span class="line">  <span class="keyword">for</span> (<span class="variable">$x</span> = -<span class="number">30</span>; <span class="variable">$x</span> &lt; <span class="number">30</span>; <span class="variable">$x</span>++) &#123;</span><br><span class="line">      <span class="keyword">echo</span> (</span><br><span class="line">          <span class="title function_ invoke__">pow</span>(<span class="title function_ invoke__">pow</span>(<span class="variable">$x</span>*<span class="number">0.05</span>, <span class="number">2</span>)+<span class="title function_ invoke__">pow</span>(<span class="variable">$y</span>*<span class="number">0.1</span>, <span class="number">2</span>)-<span class="number">1</span>, <span class="number">3</span>)-</span><br><span class="line">          <span class="title function_ invoke__">pow</span>(<span class="variable">$x</span>*<span class="number">0.05</span>, <span class="number">2</span>)*<span class="title function_ invoke__">pow</span>((<span class="variable">$y</span>*<span class="number">0.1</span>), <span class="number">3</span>) &lt;= <span class="number">0</span></span><br><span class="line">      ) ? <span class="string">&#x27;LovePHP!&#x27;</span>[(<span class="variable">$x</span> - <span class="variable">$y</span>) % <span class="number">8</span>]:<span class="string">&#x27; &#x27;</span>;</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="keyword">echo</span> <span class="string">&quot;\n&quot;</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">          P!LovePHP           vePHP!Lov               </span><br><span class="line">    ePHP!LovePHP!Love   !LovePHP!LovePHP!           </span><br><span class="line">  vePHP!LovePHP!LovePHP!LovePHP!LovePHP!Lov         </span><br><span class="line"> vePHP!LovePHP!LovePHP!LovePHP!LovePHP!LoveP        </span><br><span class="line">vePHP!LovePHP!LovePHP!LovePHP!LovePHP!LovePHP       </span><br><span class="line">ePHP!LovePHP!LovePHP!LovePHP!LovePHP!LovePHP!       </span><br><span class="line">PHP!LovePHP!LovePHP!LovePHP!LovePHP!LovePHP!L       </span><br><span class="line">HP!LovePHP!LovePHP!LovePHP!LovePHP!LovePHP!Lo       </span><br><span class="line">P!LovePHP!LovePHP!LovePHP!LovePHP!LovePHP!Lov       </span><br><span class="line">!LovePHP!LovePHP!LovePHP!LovePHP!LovePHP!Love       </span><br><span class="line"> ovePHP!LovePHP!LovePHP!LovePHP!LovePHP!Love        </span><br><span class="line">  ePHP!LovePHP!LovePHP!LovePHP!LovePHP!Love         </span><br><span class="line">  PHP!LovePHP!LovePHP!LovePHP!LovePHP!LoveP         </span><br><span class="line">    !LovePHP!LovePHP!LovePHP!LovePHP!Love           </span><br><span class="line">     ovePHP!LovePHP!LovePHP!LovePHP!Love            </span><br><span class="line">      ePHP!LovePHP!LovePHP!LovePHP!Love             </span><br><span class="line">        P!LovePHP!LovePHP!LovePHP!Lov               </span><br><span class="line">          ovePHP!LovePHP!LovePHP!Lo                 </span><br><span class="line">            PHP!LovePHP!LovePHP!L                   </span><br><span class="line">               LovePHP!LovePHP                      </span><br><span class="line">                  PHP!LoveP                         </span><br><span class="line">                     Lov                            </span><br><span class="line">                      v                                          </span><br></pre></td></tr></table></figure></li></ul><h1 id="Conferences"><a href="#Conferences" class="headerlink" title="Conferences"></a>Conferences</h1><ul><li><a href="https://www.longhornphp.com/">Longhorn PHP</a> – Austin, TX, USA, November 2–4, 2023.</li><li><a href="https://laracon.au/">Laracon AU</a> – Sydney, Australia, November 16–17, 2023.</li><li><a href="https://2023.phpcon.pl/en/">PHPCon Poland</a> – Zawiercie, Poland, November 17–18, 2023.</li><li><a href="https://live.symfony.com/2023-brussels-con/">SymfonyCon</a> – Brussels, Belgium, December 7–8, 2023.</li><li><a href="https://laracon.eu/">Laracon EU</a> – Amsterdam, The Netherlands, Feb 5-6, 2024. CFP 🆕</li><li><a href="https://www.phpconference.co.uk/">PHP UK</a> – London, UK, February 15–16, 2024. CFP</li><li><a href="https://tek.phparch.com/">PHP[TEK] 2024</a> – Chicago, IL, USA, April 23–25, 2024. CFP 🆕</li></ul>]]></content>
    
    
      
      
        
        
    <summary type="html">&lt;p&gt;&lt;img src=&quot;https://blog.jetbrains.com/wp-content/uploads/2023/09/php-annotated-featured_blog_1280x720.png&quot; alt=&quot;PHP Annotated</summary>
        
      
    
    
    
    
    <category term="PHP" scheme="https://haah.kr/tags/PHP/"/>
    
    <category term="php-annotated" scheme="https://haah.kr/tags/php-annotated/"/>
    
    <category term="php-annotated-monthly" scheme="https://haah.kr/tags/php-annotated-monthly/"/>
    
  </entry>
  
  <entry>
    <title>PHP Annotated – July 2023</title>
    <link href="https://haah.kr/2023/08/01/php-annotated-july-2023/"/>
    <id>https://haah.kr/2023/08/01/php-annotated-july-2023/</id>
    <published>2023-08-01T14:09:52.000Z</published>
    <updated>2026-05-31T19:29:57.260Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://blog.jetbrains.com/wp-content/uploads/2023/08/php-annotated-featured_blog_1280x720.png" alt="PHP Annotated 이미지"></p><p><a href="https://blog.jetbrains.com/author/rpronskiy">Roman Pronskiy</a>가 쓰고 JetBrains에서 제공하는 PHP Annotated <a href="https://blog.jetbrains.com/phpstorm/2023/08/php-annotated-july-2023/">2023년 7월</a>호입니다.</p><hr><p>PHP Annotated 7월호에 오신 것을 환영합니다! 엄선된 뉴스, 기사, 도구, 동영상을 통해 지난 한 달간 PHP 커뮤니티에서 가장 흥미로운 발전 사항을 요약해드립니다.</p><h1 id="Highlights"><a href="#Highlights" class="headerlink" title="Highlights"></a>Highlights</h1><h2 id="PHP-8-3-0-beta-1-released"><a href="#PHP-8-3-0-beta-1-released" class="headerlink" title="PHP 8.3.0 beta 1 released"></a>PHP 8.3.0 beta 1 released</h2><p><a href="https://www.php.net/archive/2023.php#2023-07-20-1">PHP 8.3.0 베타 1 출시</a></p><p>첫 번째 베타 릴리스를 통해 활발한 개발 단계가 종료되었으므로 8.3 브랜치의 새로운 기능 및 변경 사항 목록은 최종 버전으로 간주할 수 있습니다.</p><p>Mac을 사용하는 경우 Nuno Maduro의 <a href="https://nunomaduro.com/how_to_install_php83_rc_on_mac">PHP 8.3 설치 방법</a>을 확인하세요. 이외에는 <a href="https://hub.docker.com/_/php/tags?page=1&name=8.3.0">Docker 이미지</a>가 번거로움 없이 시도해 볼 수 있는 가장 좋은 옵션일 것입니다.</p><p><a href="https://github.com/php/web-php/pull/785">Thomas Jarrand</a> 덕분에 이제 php.net에 모든 PHP 브랜치의 현재 상태를 확인할 수 있는 엔드포인트가 생겼습니다: <a href="https://www.php.net/releases/states">php.net&#x2F;releases&#x2F;states</a>.</p><h2 id="PHP-9-logo"><a href="#PHP-9-logo" class="headerlink" title="PHP 9 logo"></a>PHP 9 logo</h2><p>elePHPant 디자인의 저자이자 PHP 8 로고의 저자 Vincent Pontier가 PHP 9 로고에 대한 아이디어를 <a href="https://twitter.com/Elroubio/status/1670905153258487808">떠올렸습니다</a>:</p><p><img src="https://pbs.twimg.com/media/FzA3w_oWYAMKQEN?format=jpg&name=large" alt="php9 이미지 아이디어"></p><h2 id="PHP-Version-Stats-–-July-2023"><a href="#PHP-Version-Stats-–-July-2023" class="headerlink" title="PHP Version Stats – July, 2023"></a>PHP Version Stats – July, 2023</h2><p><a href="https://stitcher.io/blog/php-version-stats-july-2023">PHP 버전 통계 - 2023년 7월</a></p><p><a href="https://packagist.org/php-statistics">클라이언트가 packagist.org로 보내는</a> 데이터(예: 컴포저 업데이트 명령 실행 시)를 기반으로 사용하는 PHP 버전에 대한 정기적인 개요입니다. 68.8%의 클라이언트가 PHP 8.*을 사용하고 있으며, PHP 7.*은 29.7%를 차지합니다. PHP 8은 59.7%였던 작년과 비교하면 느리지만 좋은 성장세입니다.<br>사용자 세그먼트가 약간 다를 수 있는 Remi 리포지토리 통계에 따르면, 35%의 사용자가 PHP 8.*을, 63%의 사용자가 PHP 7.*을 사용하고 있습니다.</p><blockquote class="twitter-tweet"><p lang="en" dir="ltr">PHP download numbers for 2 weeks:<br>- 8.2: 9%<br>- 8.1: 16%<br>- 8.0: 10%<br>- 7.4: 27%<br>- 7.3: 8%<br>- 7.2: 12%<br>- 7.1: 15%<br>- 7.0: 1%<br>- 5.6: 3%<br><br>So 2/3 for EOL versions <a href="https://t.co/QwZvO9e3zC">pic.twitter.com/QwZvO9e3zC</a></p>&mdash; RemiRepository (@RemiRepository) <a href="https://twitter.com/RemiRepository/status/1671149139684642820?ref_src=twsrc%5Etfw">June 20, 2023</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script><p>참고로 <a href="https://make.wordpress.org/core/2023/07/05/dropping-support-for-php-5/">워드프레스는 다음 워드프레스 6.3 릴리스에서 PHP 5 지원을 중단할 예정입니다</a>. 현재 워드프레스 설치의 <a href="https://wordpress.org/about/stats/">5.5%</a>가 여전히 PHP 5를 사용하고 있습니다.</p><h2 id="PHP-Core"><a href="#PHP-Core" class="headerlink" title="PHP Core"></a>PHP Core</h2><p>대부분의 코어 소식은 PHP 재단의 <a href="https://thephp.foundation/blog/2023/07/01/php-core-roundup-14/">PHP Core Roundup 시리즈</a>에서 자세히 다루고 있으므로 여기서는 몇 가지만 간략하게 언급하겠습니다:</p><h2 id="❌-RFC-Interface-Default-Methods"><a href="#❌-RFC-Interface-Default-Methods" class="headerlink" title="❌ RFC: Interface Default Methods"></a>❌ RFC: Interface Default Methods</h2><p><a href="https://wiki.php.net/rfc/interface-default-methods">https://wiki.php.net/rfc/interface-default-methods</a></p><p>Levi Morisson의 이 RFC는 많은 논의를 불러일으켰습니다.<br>Levi는 인터페이스에 메서드에 대한 구현이 있을 수 있다고 제안했는데, 이는 Kotlin, Swift(<a href="https://twitter.com/nicoverbruggen/status/1676308257013395460?s=46&t=AoDDh-tuqkhbA8A12mAl_g">extend protocols</a>), Java, C# 및 기타 언어에서 가능한 것과 유사합니다.</p><p>다중 상속이 잘못되었고 인터페이스에 구현이 있어서는 안 된다고 생각한다면 래리 가필드는 이상한 아이디어를 거부하기 전에 다시 한 번 생각해 볼 것을 <a href="https://twitter.com/brendt_gd/status/1679455844600012801">제안합니다</a>.</p><p>Brent도 <a href="https://www.youtube.com/watch?v=lXsbFXYwxWU">What is a Best Practice?</a> 동영상에서 이에 대해 이야기하고 있으며, <a href="https://stitcher.io/blog/is-a-or-acts-as">“Is A” or “Acts As”</a> 게시물에서 더 자세히 설명합니다.</p><p>조지가 <a href="https://externals.io/message/120725#120792">언급했듯이</a> 일부 사람들은 이 제안이 PHP 8.3의 기능 동결에 너무 근접한 급격한 변화이기 때문에 반대표를 던졌을 수도 있습니다.</p><h2 id="✅-RFC-Marking-overridden-methods-Override"><a href="#✅-RFC-Marking-overridden-methods-Override" class="headerlink" title="✅ RFC: Marking overridden methods (#[\Override])"></a>✅ RFC: Marking overridden methods (#[\Override])</h2><p><a href="https://wiki.php.net/rfc/marking_overriden_methods">https://wiki.php.net/rfc/marking_overriden_methods</a></p><p>PHP 8.3에는 <code>#[\Override]</code> 속성이 새로 추가됩니다. 메서드에 적용하면 엔진이 부모 클래스 또는 구현된 인터페이스에 같은 이름의 메서드가 있는지 확인하라는 메시지를 표시합니다.</p><p>이는 Java, Kotlin, Swift 및 C#과 같은 다른 언어의 기능과 유사합니다.</p><h2 id="✅-RFC-Path-to-Saner-Increment-x2F-Decrement-operators"><a href="#✅-RFC-Path-to-Saner-Increment-x2F-Decrement-operators" class="headerlink" title="✅ RFC: Path to Saner Increment&#x2F;Decrement operators"></a>✅ RFC: Path to Saner Increment&#x2F;Decrement operators</h2><p><a href="https://wiki.php.net/rfc/saner-inc-dec-operators">https://wiki.php.net/rfc/saner-inc-dec-operators</a></p><p><code>++</code> 및 <code>--</code> 연산자의 동작은 PHP 8.3에서 더욱 일관성 있게 변경됩니다.</p><p>이 문제를 실제로 보여주고 싶다면 이 예제를 확인해 보세요:</p><blockquote class="twitter-tweet"><p lang="en" dir="ltr"><a href="https://twitter.com/hashtag/PHP?src=hash&amp;ref_src=twsrc%5Etfw">#PHP</a> is always good for some excitement during the day. What do you expect the following code to print?<a href="https://twitter.com/search?q=%24value&amp;src=ctag&amp;ref_src=twsrc%5Etfw">$value</a> = &#39;5d9&#39;;<a href="https://twitter.com/search?q=%24value&amp;src=ctag&amp;ref_src=twsrc%5Etfw">$value</a>++;<a href="https://twitter.com/search?q=%24value&amp;src=ctag&amp;ref_src=twsrc%5Etfw">$value</a>++;<a href="https://twitter.com/search?q=%24value&amp;src=ctag&amp;ref_src=twsrc%5Etfw">$value</a>++;<br>var_dump($value);</p>&mdash; alcaeus (@alcaeus) <a href="https://twitter.com/alcaeus/status/1674334407023374336?ref_src=twsrc%5Etfw">June 29, 2023</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>-> PHP 8.2까지 위 문제의 정답은 7입니다.<h2 id="✅-RFC-PDO-driver-specific-subclasses"><a href="#✅-RFC-PDO-driver-specific-subclasses" class="headerlink" title="✅ RFC: PDO driver specific subclasses"></a>✅ RFC: PDO driver specific subclasses</h2><p><a href="https://wiki.php.net/rfc/pdo_driver_specific_subclasses">https://wiki.php.net/rfc/pdo_driver_specific_subclasses</a></p><p>현재 PHP에는 모든 데이터베이스에 대해 단일 PDO 클래스가 있습니다. 그러나 설치한 실제 DB 드라이버 확장에 따라 이 클래스는 다른 메서드 집합을 가질 수 있습니다.</p><p>Dan Ack의 RFC는 지원되는 각 데이터베이스에 대해 별도의 클래스가 있는 특정 서브클래스 집합을 추가할 것을 제안합니다.</p><h2 id="✅-PR-Add-fallback-value-syntax-for-ini-variables"><a href="#✅-PR-Add-fallback-value-syntax-for-ini-variables" class="headerlink" title="✅ PR: Add fallback value syntax for ini variables"></a>✅ PR: Add fallback value syntax for ini variables</h2><p><a href="https://github.com/php/php-src/pull/11351">https://github.com/php/php-src/pull/11351</a></p><p>가브리엘 폰테스가 PHP 8.3에 깔끔하게 추가한 기능입니다! 환경 변수 외에 php.ini 설정에서 기본값을 사용할 수 있게 됩니다:</p><p><code>xdebug.start_with_request = $&#123;PHP_XDEBUG_START_WITH_REQUEST:-default&#125;</code></p><h2 id="dunglas-x2F-php-dev-docker-–-Docker-image-to-hack-the-PHP-interpreter"><a href="#dunglas-x2F-php-dev-docker-–-Docker-image-to-hack-the-PHP-interpreter" class="headerlink" title="dunglas&#x2F;php-dev-docker – Docker image to hack the PHP interpreter."></a>dunglas&#x2F;php-dev-docker – Docker image to hack the PHP interpreter.</h2><p><a href="https://github.com/dunglas/php-dev-docker">dunglas&#x2F;php-dev-docker</a> – PHP interpreter를 해킹하기 위한 Docker 이미지.</p><p>PHP 버그(segmentation faults)를 추적하고, 확장 기능 또는 PHP 인터프리터 자체를 개발하는 데 편리한 Docker 이미지입니다.</p><p>Kévin Dunglas는 PHP 인터프리터를 디버깅하고 개발하기 위해 특별히 Docker 이미지를 <a href="https://twitter.com/dunglas/status/1674395527415300097">준비했습니다</a>. PHP 스크립트로 인해 세그폴트가 발생하나요? PHP 확장을 개발하고 싶으신가요? 이 이미지가 바로 여러분을 위한 것입니다! 필요한 모든 도구가 포함되어 있습니다.</p><h1 id="Tools"><a href="#Tools" class="headerlink" title="Tools"></a>Tools</h1><ul><li><p><a href="https://nativephp.com/">NativePHP – PHP로 데스크톱 애플리케이션 개발</a><br>Marcel Pociot가 만든 이 도구는 일반적인 웹 앱을 구축할 때와 마찬가지로 크로스 플랫폼 데스크톱 앱을 구축할 수 있는 간단한 API와 툴을 제공합니다.<br>이 도구는 일렉트론이나 타우리를 사용하므로 이름에 ‘네이티브’라는 단어가 약간 오해의 소지가 있을 수 있습니다. 하지만 PHP 개발자의 관점에서 보면 이 모든 것이 익숙한 도구와 구문으로 멋지게 포장되어 있습니다. Marcel이 이 발표에서 <a href="https://beyondco.de/blog/announcing-laravel-herd/">작동 방식</a>을 설명했습니다.</p><p>현재까지는 Laravel에서만 작동하지만, 다른 프레임워크와 네이티브 PHP용 어댑터를 구현할 예정이라고 합니다.</p><p>다음은 NativePHP로 구축된 앱의 예시입니다. 크론 작업을 관리하기 위한 간단한 도구인 <a href="https://github.com/simonhamp/cronikl">simonhamp&#x2F;cronikl</a>입니다.</p></li><li><p><a href="https://herd.laravel.com/">https://herd.laravel.com/</a> - 원클릭 PHP 개발 환경.<br>Marcel Pociot와 Beyond Code의 또 다른 도구입니다. macOS에서 PHP를 위한 로컬 개발 환경으로, 모든 것이 미리 빌드되어 제공되므로 홈브루나 다른 것을 다룰 필요가 전혀 없습니다.<br>저는 마찬가지로 로컬 환경을 제공하지만 더 많은 유연성을 제공하는 <a href="https://indigostack.app/">IndigoStack</a>의 열렬한 팬입니다.</p></li><li><p><a href="https://github.com/aschmelyun/diode">aschmelyun&#x2F;diode</a> - Laravel을 위한 WASM 기반 로컬 개발 환경과 <a href="https://developer.wordpress.com/2023/05/23/wp-now-launch-a-local-environment-in-seconds/">wp-now</a>에서 영감을 얻은 로컬 개발 환경에 대한 또 다른 <a href="https://twitter.com/aschmelyun/status/1675789869572845570">접근 방식</a>입니다. 이 <a href="https://www.youtube.com/watch?v=YA0KB2DPJms">비디오</a>는 비하인드 스토리를 제공합니다.</p></li><li><p><a href="https://github.com/yzen-dev/plain-to-class">yzen-dev&#x2F;plain-to-class</a> - 이 Hydrator는 데이터를 유형화된 객체로 변환합니다. 상속이 필요하지 않고 프레임워크에 의존하지 않으며 <a href="https://github.com/yzen-dev/php-dto-transform-benchmark">벤치마크</a>에 따르면 가장 효과적인 방법 중 하나입니다.</p></li><li><p><a href="https://github.com/cerbero90/json-parser">cerbero90&#x2F;json-parser</a> - 종속성이 없는 구문 분석기로 모든 소스에서 메모리 효율적인 방식으로 대용량 JSON을 읽을 수 있습니다.</p></li><li><p><a href="https://github.com/alexandre-daubois/lazy-stream">alexandre-daubois&#x2F;lazy-stream</a> - 필요할 때만 스트림에 데이터를 쓰고 읽을 수 있습니다.</p></li><li><p><a href="https://numpower.org/">NumPower</a> - 이 PHP용 C 확장 프로그램은 PHP에서 효율적인 과학 컴퓨팅을 위한 기반을 제공하고, 이미 존재하며 이를 활용할 수 있는 머신 러닝 도구와 라이브러리를 활용하기 위해 만들어졌습니다.<br>“A library for numerical calculations and scientific computing made for PHP”</p></li></ul><h1 id="Symfony"><a href="#Symfony" class="headerlink" title="Symfony"></a>Symfony</h1><ul><li><p><a href="https://github.com/Romaixn/gosumer">Romaixn&#x2F;gosumer</a> - 심포니 메신저 메시지를 Go로 소비하기. <a href="https://dev.to/romaixn/supercharge-your-applications-performance-consuming-symfony-messenger-messages-with-go-2b3f">소개 게시물</a>을 확인하세요.</p></li><li><p><a href="https://symfony.com/blog/prepare-yourself-for-symfony-6-4-and-symfony-7-0">Symfony 6.4 및 Symfony 7.0에 대비하기</a></p></li></ul><h1 id="Laravel"><a href="#Laravel" class="headerlink" title="Laravel"></a>Laravel</h1><ul><li><p><a href="https://laravel-news.com/laracon-recap">Laracon Recap</a> - 신제품 발표: Herd, Volt, Folio, Prompts(AI와 관련이 없음), NativePHP, Pest 2.9 및 Livewire v3. 모든 강연은 Laravel YouTube 채널에서 시청할 수 있습니다.</p></li><li><p><a href="https://github.com/blinq-dev/laravel-synth">blinq-dev&#x2F;laravel-synth</a> - ChatGPT로 라라벨 코드를 생성하세요.</p></li><li><p><a href="https://github.com/yllw-digital/laravel-chatgpt-mock-api">yllw-digital&#x2F;laravel-chatgpt-mock-api</a> - ChatGPT 프롬프트를 사용하여 라라벨에서 스마트 API 모의 프로그램을 생성하세요.</p></li><li><p><a href="https://blog.codewithdary.com/8-bad-coding-habits-laravel-devs-make">라라벨 개발자가 코드에서 저지르는 8가지 나쁜 습관</a> by Code With Dary.</p><ol><li>Not Separating Validation from Controllers</li><li>Not Following the Single Responsibility Principle (SRP)</li><li>Not Using Middlewares (or not correctly)</li><li>Not Testing Code</li><li>Not Using Database Migrations</li><li>Not Using Route Model Binding</li><li>Naming Conventions</li><li>Not Using Eloquent Properly</li></ol></li><li><p>📺 Steve, Brent, Bobby와 함께 <a href="https://www.youtube.com/watch?v=HmBDHhRgxOc">Laravel 앱을 구성하는 방법에 대한 강력한 의견</a>을 나눕니다.</p></li><li><p>📺 <a href="https://laracasts.com/series/phpstorm-for-laravel-developers">라라캐스트: 라라벨 개발자를 위한 PhpStorm</a>.</p></li></ul><h1 id="Other-frameworks"><a href="#Other-frameworks" class="headerlink" title="Other frameworks"></a>Other frameworks</h1><ul><li><a href="https://forum.yiiframework.com/t/embracing-the-future-yii-framework-updates-and-yii-2-2-discussions/135451">미래를 포용합니다: Yii 프레임워크 업데이트 및 Yii 2.2 토론, Yii 3.0</a>.</li></ul><h1 id="기타"><a href="#기타" class="headerlink" title="기타"></a>기타</h1><ul><li><p><a href="https://ahmadrosid.com/blog/create-php-extension-with-rust">재미와 이익을 얻기 위한 Rust로 PHP 확장 프로그램 구축하기</a> by Ahmad Rosid.</p></li><li><p><a href="https://ryangjchandler.co.uk/posts/build-your-own-template-engine-in-php-rendering-echo">PHP로 나만의 템플릿 엔진 구축 - 렌더링 및 에코</a> by Ryan Chandler.</p></li><li><p><a href="https://christoph-rumpel.com/2023/6/three-compelling-reasons-for-developers-to-write-tests">개발자가 테스트를 작성해야 하는 3가지 강력한 이유</a>by Christoph Rumpel</p></li><li><p>📺 <a href="https://www.youtube.com/watch?v=mdrR-ynTZIk">Composer, Packagist, and Open Source</a> – Interview with Jordi Boggiano.</p></li><li><p>Too much fun with legacy PHP hacks today<br>-&gt; PHPStan을 위한 해킹인 것으로 보입니다. 다음 PR을 참고하세요. <a href="https://github.com/reactphp/promise/pull/246#discussion_r1235943582">https://github.com/reactphp/promise/pull/246#discussion_r1235943582</a></p><blockquote class="twitter-tweet"><p lang="en" dir="ltr">Too much fun with legacy PHP hacks today, time to go home! 😃👋 <a href="https://twitter.com/hashtag/php?src=hash&amp;ref_src=twsrc%5Etfw">#php</a> <a href="https://t.co/QqFr99rcta">pic.twitter.com/QqFr99rcta</a></p>&mdash; Christian Lück (@another_clue) <a href="https://twitter.com/another_clue/status/1671189006162464768?ref_src=twsrc%5Etfw">June 20, 2023</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script></li></ul><h1 id="Fun"><a href="#Fun" class="headerlink" title="Fun"></a>Fun</h1><ul><li><blockquote class="twitter-tweet"><p lang="en" dir="ltr">Do you like mysteries? Here&#39;s one for you, PHP lovers. 🐘 <a href="https://t.co/EodRpuYGny">https://t.co/EodRpuYGny</a> <a href="https://t.co/4kC9X0WnDz">pic.twitter.com/4kC9X0WnDz</a></p>&mdash; Nuno Maduro (@enunomaduro) <a href="https://twitter.com/enunomaduro/status/1670745186400444416?ref_src=twsrc%5Etfw">June 19, 2023</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script></li><li><blockquote class="twitter-tweet"><p lang="en" dir="ltr">If your app has more than 1 php file you have launched too late.</p>&mdash; Jon Yongfook (@yongfook) <a href="https://twitter.com/yongfook/status/1677505684504735744?ref_src=twsrc%5Etfw">July 8, 2023</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script></li><li><p><a href="https://www.yomeva.com/#elephant">새로운 코끼리가 판매 중입니다!</a><br><img src="https://pbs.twimg.com/media/FzymO2wX0AIYVI6?format=jpg&name=large" alt="새로운 코끼리 이미지"></p></li></ul><h1 id="Conferences"><a href="#Conferences" class="headerlink" title="Conferences"></a>Conferences</h1><p>방문하고 발표를 신청할 만한 다음 PHP 행사를 확인해 보세요:</p><ul><li><a href="https://2023.phpkonf.org/">PHPKonf</a> – Istanbul, Turkey, September 2, 2023. CFP 🆕</li><li><a href="https://cakefest.org/">CakeFest</a> – Los Angeles, CA, USA, September 28–Oct 3, 2023.</li><li><a href="https://www.longhornphp.com/">Longhorn PHP</a> – Austin, TX, USA, November 2–4, 2023.</li><li><a href="https://2023.phpcon.pl/en/">PHPCon Poland</a> – Zawiercie, Poland, November 17–18, 2023. CFP 🆕</li><li><a href="https://laracon.au/">Laracon AU</a> – Sydney, Australia, November 16–17, 2023.</li><li><a href="https://live.symfony.com/2023-brussels-con/">SymfonyCon</a> – Brussels, Belgium, December 7–8, 2023. CFP</li><li><a href="https://www.phpconference.co.uk/">PHP UK</a> – London, UK, February 15–16, 2024. CFP 🆕</li></ul><p>다음 PHP 밋업이 언제 열리는지 궁금하다면 Tomas Votruba가 운영하는 멋진 밋업 애그리게이터 <a href="https://friendsofphp.org/">friendsofphp.org</a>를 참고하세요. php.net - 이벤트에도 캘린더가 있습니다: <a href="https://www.php.net/cal.php">2023년 6월</a>.</p>]]></content>
    
    
      
      
        
        
    <summary type="html">&lt;p&gt;&lt;img src=&quot;https://blog.jetbrains.com/wp-content/uploads/2023/08/php-annotated-featured_blog_1280x720.png&quot; alt=&quot;PHP Annotated</summary>
        
      
    
    
    
    
    <category term="PHP" scheme="https://haah.kr/tags/PHP/"/>
    
    <category term="php-annotated" scheme="https://haah.kr/tags/php-annotated/"/>
    
    <category term="php-annotated-monthly" scheme="https://haah.kr/tags/php-annotated-monthly/"/>
    
  </entry>
  
  <entry>
    <title>PHP Annotated – June 2023</title>
    <link href="https://haah.kr/2023/06/15/php-annotated-june-2023/"/>
    <id>https://haah.kr/2023/06/15/php-annotated-june-2023/</id>
    <published>2023-06-15T14:57:21.000Z</published>
    <updated>2026-05-31T19:29:57.260Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://blog.jetbrains.com/wp-content/uploads/2023/06/php-annotated-featured_blog_1280x720.png" alt="PHP Annotated 이미지"></p><p><a href="https://blog.jetbrains.com/author/rpronskiy">Roman Pronskiy</a>가 쓰고 JetBrains에서 제공하는 PHP Annotated <a href="https://blog.jetbrains.com/phpstorm/2023/06/php-annotated-june-2023/">2023년 6월</a>호입니다.</p><hr><p>PHP Annotated 6월호에 오신 것을 환영합니다. 엄선된 뉴스, 기사, 도구, 동영상을 통해 지난 한 달간 PHP 커뮤니티에서 가장 흥미진진하게 발전한 내용을 요약해 보겠습니다.</p><h1 id="Highlights"><a href="#Highlights" class="headerlink" title="Highlights"></a>Highlights</h1><h2 id="Happy-28th-birthday-PHP"><a href="#Happy-28th-birthday-PHP" class="headerlink" title="Happy 28th birthday, PHP!"></a>Happy 28th birthday, PHP!</h2><p>6월 8일, PHP가 28살이 되었습니다! 과거를 돌아보고 싶으시다면 Rasmus Lerdorf의 <a href="https://groups.google.com/g/comp.infosystems.www.authoring.cgi/c/PyJ25gZ6z7A/m/M9FkTUVDfcwJ">PHP 최초 공개 발표</a>를 참조하세요.</p><p>앞으로도 개발자에게 힘을 실어주고 웹 기술의 경계를 넓히는 데 기여하기를 바랍니다. 생일 축하합니다, PHP! 🎉🥳🎂</p><p>JetBrains PhpStorm 팀은 PHP 커뮤니티 회원 20명에게 가장 좋아하는 코딩 트랙의 이름을 물어보았습니다. 그 결과 PHP로 코딩하는 동안 생산성을 더욱 높일 수 있도록 맞춤화된 재생 목록이 탄생했습니다:<br><a href="https://open.spotify.com/playlist/02xXEV3NPVzuhgLg4tOpVr">https://open.spotify.com/playlist/02xXEV3NPVzuhgLg4tOpVr</a></p><p>활기차고 다양한 PHP 커뮤니티의 증거인 이 재생 목록에는 아래와 같은 PHP의 거장들이 기여한 콘텐츠가 포함되어 있습니다,<br>A testament to the vibrant and diverse PHP community, this playlist features contributions from PHP greats such as <a href="https://twitter.com/christophrumpel">Christoph Rumpel</a>, <a href="https://twitter.com/seldaek">Jordi Boggiano</a>, <a href="https://twitter.com/asgrim">James Titcumb</a>, <a href="https://twitter.com/matthieunapoli">Matthieu Napoli</a>, <a href="https://twitter.com/frankdejonge">Frank de Jonge</a>, <a href="https://twitter.com/valorin">Stephen Rees-Carter</a>, <a href="https://twitter.com/CalEvans">Cal Evans</a>, <a href="https://twitter.com/PovilasKorop">Povilas Korop</a>, <a href="https://twitter.com/taylorotwell">Taylor Otwell</a>, <a href="https://twitter.com/beberlei">Benjamin Eberlei</a>, <a href="https://twitter.com/nicolasgrekas">Nicolas Grekas</a>, <a href="https://twitter.com/ericlbarnes">Eric Barnes</a>, <a href="https://twitter.com/ianlandsman">Ian Landsman</a>, <a href="https://twitter.com/derickr">Derick Rethans</a>, <a href="https://twitter.com/Caneco">Caneco</a>, <a href="https://twitter.com/zuzana_kunckova">Zuzana Kunckova</a>, <a href="https://twitter.com/brendt_gd">Brent</a>, <a href="https://twitter.com/timacdonald87">Tim MacDonald</a>, <a href="https://twitter.com/themsaid">Mohamed Said</a>, and <a href="https://twitter.com/paulredmond">Paul Redmond</a>.</p><p>이 기념일을 기념하기 위해 Brent는 <a href="https://www.youtube.com/watch?v=pzsA_Kyusi8">PHP Annotated YouTube channel</a>에서 PhpStorm Elephpant 추첨을 진행했습니다.</p><h2 id="Celebrating-20-Years-of-WordPress"><a href="#Celebrating-20-Years-of-WordPress" class="headerlink" title="Celebrating 20 Years of WordPress"></a>Celebrating 20 Years of WordPress</h2><p><a href="https://wordpress.org/news/2023/05/celebrating-20-years-of-wordpress/">워드프레스 20주년 기념</a></p><p>28살은 아니지만, 충분히 훌륭한 성과입니다! 축하합니다!</p><h2 id="PHP-8-3-Alpha-1-available-for-testing"><a href="#PHP-8-3-Alpha-1-available-for-testing" class="headerlink" title="PHP 8.3 Alpha 1 available for testing"></a>PHP 8.3 Alpha 1 available for testing</h2><p><a href="https://www.php.net/archive/2023.php#2023-06-08-3">PHP 8.3 알파 1 테스트 가능</a></p><p>첫 번째 알파 버전이 출시되어 PHP 8.3 릴리즈 프로세스의 시작을 알렸습니다. 업데이트는 정해진 일정에 따라 2주마다 릴리스되며 최종 릴리스는 11월 23일경에 예정되어 있습니다.</p><p>7월 18일에 기능 동결이 예정되어 있으므로 일부 변경 사항이 릴리스에 반영되지 않을 수도 있습니다. 현재 가장 주목할 만한 변경 사항은 다음과 같습니다:</p><ul><li><a href="https://wiki.php.net/rfc/readonly_amendments">Readonly amendments</a></li><li><a href="https://github.com/php/php-src/blob/49fbbea2ea5fe1f6bab0719c95a46a119ea3d91f/UPGRADING#LL60C1-L60C1">Anonymous readonly classes</a></li><li><a href="https://wiki.php.net/rfc/arbitrary_static_variable_initializers">Arbitrary static variable initializers</a></li><li><a href="https://wiki.php.net/rfc/typed_class_constants">Typed class constants</a></li><li><a href="https://wiki.php.net/rfc/json_validate">New json_validate() function</a></li><li><a href="https://wiki.php.net/rfc/dynamic_class_constant_fetch">Dynamic class constant fetch</a></li><li><a href="https://wiki.php.net/rfc/datetime-exceptions">More Appropriate Date&#x2F;Time Exceptions</a></li></ul><p>모든 변경사항에 대해 자세히 알아보려면 브렌트의 <a href="https://stitcher.io/blog/new-in-php-83">What’s new in PHP 8.3</a>를 참조하세요.</p><p>Mac을 사용하는 경우, <a href="https://github.com/shivammathur/homebrew-php">shivammathur&#x2F;homebrew-php</a>를 통해 Nightly 채널을 통해 홈브루로 PHP 8.3을 사용해 볼 수 있습니다. 그렇지 않은 경우, 번거로움 없이 사용해 보려면 <a href="https://hub.docker.com/_/php/tags?page=1&name=8.3.0">Docker 이미지</a>가 가장 좋은 옵션일 것입니다.</p><blockquote class="twitter-tweet"><p lang="en" dir="ltr">- &quot;What is the newest PHP version?&quot;<br>- &quot;What the latest SUPPORTED version?&quot;<br>- &quot;When is the next version due?&quot;<br>- &quot;When my specific PHP version will stop being supported?&quot;<br><br>All answers to these - on this PHP documentation page: <a href="https://t.co/VTVmWkwIBZ">https://t.co/VTVmWkwIBZ</a> <a href="https://t.co/anp9AUoO7F">pic.twitter.com/anp9AUoO7F</a></p>&mdash; Povilas Korop | Laravel Courses Creator &amp; Youtuber (@PovilasKorop) <a href="https://twitter.com/PovilasKorop/status/1658780656002822144?ref_src=twsrc%5Etfw">May 17, 2023</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script><blockquote><ul><li>“최신 PHP 버전은 무엇인가요?”</li><li>“지원되는 최신 버전은 무엇인가요?”</li><li>“다음 버전은 언제 출시되나요?”</li><li>“특정 PHP 버전은 언제 지원이 중단되나요?”</li></ul><p>이에 대한 모든 답변은 이 PHP 문서 페이지에서 확인할 수 있습니다: <a href="https://php.net/supported-versions.php">https://php.net/supported-versions.php</a></p></blockquote><h2 id="PHP-8-1-20-and-PHP-8-2-7-have-been-released"><a href="#PHP-8-1-20-and-PHP-8-2-7-have-been-released" class="headerlink" title="PHP 8.1.20 and PHP 8.2.7 have been released"></a>PHP 8.1.20 and PHP 8.2.7 have been released</h2><p><a href="https://www.php.net/ChangeLog-8.php#8.1.20">PHP 8.1.20</a> 및 <a href="https://www.php.net/ChangeLog-8.php#8.2.7">PHP 8.2.7</a>이 릴리스되었습니다.</p><p>❗ 모든 사용자는 이러한 보안 릴리스로 업데이트할 것을 강력히 권장합니다.</p><h2 id="❗️Packagist-org-maintainer-account-takeover"><a href="#❗️Packagist-org-maintainer-account-takeover" class="headerlink" title="❗️Packagist.org maintainer account takeover"></a>❗️Packagist.org maintainer account takeover</h2><p><a href="https://blog.packagist.com/packagist-org-maintainer-account-takeover/">Packagist.org 관리자 계정 탈취</a><br>어떤 일이 발생했는지, 영향을 받았는지 알아보세요.</p><h2 id="PhpStorm-2023-2-Early-Access-Program-Is-Open"><a href="#PhpStorm-2023-2-Early-Access-Program-Is-Open" class="headerlink" title="PhpStorm 2023.2 Early Access Program Is Open"></a>PhpStorm 2023.2 Early Access Program Is Open</h2><p><a href="https://blog.jetbrains.com/phpstorm/2023/05/the-phpstorm-2023-2-early-access-program-is-open/">PhpStorm 2023.2 미리 체험 프로그램 시작</a></p><p>정식 출시에 앞서 IDE에 추가된 최신 기능을 무료로 미리 사용해 보세요.</p><h2 id="PHP가-르네상스를-맞이하고-있나요"><a href="#PHP가-르네상스를-맞이하고-있나요" class="headerlink" title="PHP가 르네상스를 맞이하고 있나요?"></a>PHP가 르네상스를 맞이하고 있나요?</h2><p>PHP가 “잘 작동한다”는 명성을 되찾고 있습니다. 이 언어는 더 빠르고, 더 안전하며, 더 즐겁게 사용할 수 있도록 진화하고 있습니다.</p><p>아직 PHP에 대해 회의적인 친구들과 공유할 수 있는 몇 가지 링크를 소개합니다:</p><ul><li>📺 <a href="https://www.youtube.com/watch?v=xmvD_EjNE-4">PHP is the future</a> by Aaron Francis (mostly about Laravel).</li><li><a href="https://themsaid.com/go-with-php">Go with PHP</a> by Mohamed Said.</li><li>📺 <a href="https://www.youtube.com/watch?v=ZDZDvMB-O74">PHP in 2023</a> by Brent.</li></ul><h2 id="ChatGPT-and-PHP"><a href="#ChatGPT-and-PHP" class="headerlink" title="ChatGPT and PHP"></a>ChatGPT and PHP</h2><p><a href="https://twitter.com/FredBouchery/status/1663923243772702723">Frédéric Bouchery</a>가 <a href="https://gist.github.com/f2r/233047300462cca9d8b14a07a888fd51">Promises RFC</a>와 <a href="https://gist.github.com/f2r/6b6f37c9089a6a9de94141af7919bafb">Generics RFC</a>를 예로 들어 PHP RFC 초안을 쉽게 생성하는 방법을 설명하는 동안, 다음은 PHP에서 LLM을 사용하는 것과 관련된 몇 가지 링크입니다:</p><ul><li><a href="https://benjamincrozat.com/chatgpt-plugin-laravel">Laravel을 사용하여 ChatGPT 플러그인 빌드하기</a> by Benjamin Crozat</li><li><a href="https://barreto.jp/blog/chatgpt-plugin-with-laravel/">라라벨을 사용한 ChatGPT 플러그인</a> by Juan Pablo Barreto.</li><li><a href="https://freek.dev/2487-saying-goodbye-to-wip-commit-messages">WIP 커밋 메시지에게 작별 인사</a> by Freek Van der Herten.</li><li><a href="https://dev.to/aschmelyun/ai-is-a-fad-and-programming-is-dead-180f">AI는 유행이고 프로그래밍은 죽었다</a> by Andrew Schmelyun.</li></ul><h1 id="PHP-Core"><a href="#PHP-Core" class="headerlink" title="PHP Core"></a>PHP Core</h1><p>대부분의 핵심 소식은 PHP 재단의 <a href="https://thephp.foundation/blog/2023/01/30/php-core-roundup-9/">PHP Core Roundup series</a>에서 자세히 다루고 있으므로 여기서는 몇 가지만 간략하게 언급하겠습니다:</p><h2 id="📣-RFC-Property-hooks"><a href="#📣-RFC-Property-hooks" class="headerlink" title="📣 RFC: Property hooks"></a>📣 RFC: Property hooks</h2><p>이 RFC에서 Ilija Tovillo와 Larry Garfield는 get&#x2F;set 함수를 사용하여 가상 프로퍼티를 선언할 것을 제안합니다.<br>디자인과 구문은 <a href="https://kotlinlang.org/docs/properties.html?_ga=2.86253151.655392603.1686965063-32683301.1677629892&_gl=1*1djnan4*_ga*MzI2ODMzMDEuMTY3NzYyOTg5Mg..*_ga_9J976DJZ68*MTY4Njk2NTA2My4yNC4xLjE2ODY5NjgxNzguNjAuMC4w#getters-and-setters">Kotlin</a>과 가장 유사하지만 C# 및 <a href="https://docs.swift.org/swift-book/documentation/the-swift-programming-language/properties/#Computed-Properties">Swift</a>의 영향을 받기도 합니다.</p><figure class="highlight php"><table><tr><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">User</span> <span class="keyword">implements</span> <span class="title">Named</span></span></span><br><span class="line"><span class="class"></span>&#123;</span><br><span class="line">    <span class="keyword">private</span> <span class="keyword">bool</span> <span class="variable">$isModified</span> = <span class="literal">false</span>;</span><br><span class="line"> </span><br><span class="line">    <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">__construct</span>(<span class="params"><span class="keyword">private</span> <span class="keyword">string</span> <span class="variable">$first</span>, <span class="keyword">private</span> <span class="keyword">string</span> <span class="variable">$last</span></span>) </span>&#123;&#125;</span><br><span class="line"> </span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">string</span> <span class="variable">$fullName</span> &#123;</span><br><span class="line">        <span class="comment">// Override the &quot;read&quot; action with arbitrary logic.</span></span><br><span class="line">        get =&gt; <span class="variable language_">$this</span>-&gt;first . <span class="string">&quot; &quot;</span> . <span class="variable language_">$this</span>-&gt;last;</span><br><span class="line"> </span><br><span class="line">        <span class="comment">// Override the &quot;write&quot; action with arbitrary logic.</span></span><br><span class="line">        <span class="title function_ invoke__">set</span>(<span class="variable">$value</span>) =&gt; [<span class="variable language_">$this</span>-&gt;first, <span class="variable language_">$this</span>-&gt;last] = <span class="title function_ invoke__">explode</span>(<span class="string">&#x27; &#x27;</span>, <span class="variable">$value</span>);</span><br><span class="line">    &#125;</span><br></pre></td></tr></table></figure><h2 id="📣-RFC-Marking-overridden-methods-Override"><a href="#📣-RFC-Marking-overridden-methods-Override" class="headerlink" title="📣 RFC: Marking overridden methods (#[\Override])"></a>📣 RFC: Marking overridden methods (#[\Override])</h2><p>Tim Düsterhus는 새로운 <code>#[\Override]</code> 어트리뷰트를 도입할 것을 제안합니다. 이 속성을 메서드에 적용하면 엔진이 부모 클래스 또는 구현된 인터페이스에 같은 이름의 메서드가 있는지 확인하라는 메시지를 표시합니다.</p><figure class="highlight php"><table><tr><td class="code"><pre><span class="line"><span class="class"><span class="keyword">interface</span> <span class="title">I</span> </span>&#123;    <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">i</span>(<span class="params"></span>): <span class="title">void</span></span>;</span><br><span class="line">&#125;</span><br><span class="line"> </span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">P</span> </span>&#123;</span><br><span class="line">    <span class="meta">#[\Override</span><span class="meta">]</span></span><br><span class="line">    <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">i</span>(<span class="params"></span>): <span class="title">void</span> </span>&#123;&#125; <span class="comment">// Fatal error: P::i() has #[\Override] attribute, but no matching parent method exists</span></span><br><span class="line">&#125;</span><br><span class="line"> </span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">C</span> <span class="keyword">extends</span> <span class="title">P</span> <span class="keyword">implements</span> <span class="title">I</span> </span>&#123;&#125; <span class="comment">// All good 👍</span></span><br></pre></td></tr></table></figure><h2 id="📣RFC-NameOf"><a href="#📣RFC-NameOf" class="headerlink" title="📣RFC: NameOf"></a>📣RFC: NameOf</h2><p>Robert Landers는 글로벌 <code>nameof()</code> 함수를 추가할 것을 제안합니다. 이 함수를 사용하면 개발자가 거의 모든 사용자 정의 변수, property, 상수 또는 멤버의 이름을 빠르고 쉽게 검색할 수 있습니다.</p><figure class="highlight php"><table><tr><td class="code"><pre><span class="line"><span class="keyword">echo</span> <span class="title function_ invoke__">nameof</span>(<span class="variable">$variable</span>); <span class="comment">// variable </span></span><br><span class="line"><span class="keyword">echo</span> <span class="title function_ invoke__">nameof</span>(<span class="variable">$object</span>-&gt;property); <span class="comment">// property</span></span><br><span class="line"><span class="keyword">echo</span> <span class="title function_ invoke__">nameof</span>(<span class="title class_">Enum</span>::<span class="variable constant_">Case</span>); <span class="comment">// Case</span></span><br><span class="line"><span class="keyword">echo</span> <span class="title function_ invoke__">nameof</span>(<span class="title class_">Object</span>::<span class="variable constant_">Const</span>); <span class="comment">// Const</span></span><br><span class="line"><span class="keyword">echo</span> <span class="title function_ invoke__">nameof</span>(<span class="title function_ invoke__">myFunction</span>(...)); <span class="comment">// myFunction</span></span><br><span class="line"><span class="keyword">echo</span> <span class="title function_ invoke__">nameof</span>(MY_CONSTANT); <span class="comment">// MY_CONSTANT</span></span><br></pre></td></tr></table></figure><h1 id="Tools"><a href="#Tools" class="headerlink" title="Tools"></a>Tools</h1><ul><li><a href="https://developer.wordpress.com/2023/05/23/wp-now-launch-a-local-environment-in-seconds/">wp-now</a> - 워드프레스 엔지니어링 팀의 로컬 개발 환경.<br>이 도구는 웹어셈블리를 활용하여 Node.js의 웹서버 위에서 PHP를 작동합니다. 도커 기반 환경보다 빠르며 모든 PHP 앱에서 사용할 수 있지만 DB를 실행하는 방법을 찾아야 합니다.</li><li><a href="https://nicoverbruggen.be/blog/phpmon-6.0-release">PHP Monitor 6.0 출시</a> - 이번 주요 업데이트에서는 새로운 PHP 버전 관리자, Valet을 설치하지 않고도 앱이 작동할 수 있는 새로운 독립형 모드 등이 도입되었습니다.</li><li><a href="https://github.com/pmjones/AutoShell">pmjones&#x2F;AutoShel</a> - CLI 명령 이름을 지정된 네임스페이스의 PHP 명령 클래스에 자동으로 매핑하여 해당 클래스 내의 지정된 메인 메서드에 반영하여 인수 및 옵션 값을 결정합니다. 메서드 매개변수는 스칼라 값(int, float, string, bool) 또는 배열일 수 있습니다.</li><li><a href="https://github.com/jolicode/castor">jolicode&#x2F;castor</a> - 개발자 경험에 중점을 두고 설계된 작업 실행기 및 명령 런처로, PHP를 사용하여 구축되었습니다.</li><li><a href="https://github.com/ProjektGopher/whisky">ProjektGopher&#x2F;whisky</a> - 팀 전체에서 PHP 프로젝트의 git hook을 관리하고 적용하기 위한 간단하고 프레임워크에 구애받지 않는 CLI 도구입니다.</li><li><a href="https://github.com/schranz-search/schranz-search">schranz-search&#x2F;schranz-search</a> - PHP로 작성된 다양한 검색 엔진에 대한 검색 추상화. 현재 구현된 엔진으로는 Elasticsearch, Opensearch, Algolia, Meilisearch, RediSearch, Solr, Typesense 등이 있습니다.</li><li><a href="https://testgenai.com/">TestGenAI</a> - <a href="https://github.com/rectorphp/rector">Rector</a>의 저자 Tomas Votruba가 만든 PHP 코드에 대한 단위 테스트를 생성하는 도구입니다.</li><li><a href="https://github.com/librarianphp/librarian">librarianphp&#x2F;librarian</a> - 휴고와 DEV에서 영감을 받아 PHP로 작성된 정적 사이트 생성기 및 마크다운 인덱서입니다. 개발 비하인드 <a href="https://dev.to/erikaheidi/librarian-4-a-static-site-generator-inspired-by-hugo-influenced-by-dev-built-in-php-4gp7">스토리</a>를 읽어보세요.</li></ul><h1 id="Symfony"><a href="#Symfony" class="headerlink" title="Symfony"></a>Symfony</h1><ul><li><a href="https://symfony.com/blog/symfony-6-3-0-released">Symfony 6.3.0 출시</a><br>이번 업데이트에는 스케줄러 구성 요소, 메일러 및 알림 기능과의 웹후크 통합, 자산 맵퍼 구성 요소, Dependency Injection 개선, DX 개선, 새로운 알림 기능 통합, HttpClient 개선, Clock 개선 등 다양한 새로운 기능 및 개선 사항이 포함되어 있습니다. 새로운 <a href="https://blog.jetbrains.com/phpstorm/2023/06/php-annotated-june-2023/the%20https://symfony.com/blog/category/living-on-the-edge/6.3">심포니 6.3 시리즈</a>에서 자세히 알아보세요.</li><li><a href="https://hackernoon.com/say-goodbye-to-null-checking-and-exceptions-using-the-maybe-monad-in-symfony/">널 검사 및 예외와 작별하세요: Symfony에서 Maybe Monad 사용하기</a>. by Aleksei Kankov.</li><li><a href="https://jolicode.com/blog/we-are-open-sourcing-our-qotd-application">jolicode&#x2F;qotd 애플리케이션 오픈 소스화</a> - 블로그 게시물에서 Grégoire Pineau가 <a href="https://github.com/jolicode/qotd">jolicode&#x2F;qotd</a> 교육용 애플리케이션에서 <a href="https://github.com/symfony/ux">symfony&#x2F;ux</a> 및 고급 PostgreSQL을 Doctrine과 함께 사용하는 방법에 대해 이야기합니다.</li><li><a href="https://angelovdejan.me/2023/06/01/resolving-values-for-unmapped-properties-when-mapping-request-data-to-dtos-in-symfony-6-3.html">Symfony 6.3+에서 요청 데이터를 DTO에 매핑할 때 매핑되지 않은 속성에 대한 값 확인</a> by Dejan Angelov</li><li><a href="https://github.com/oroinc/twig-inspector">oroinc&#x2F;twig-inspector</a> - 이 도구는 개발 중에 HTML 페이지 렌더링에 사용되는 twig 템플릿과 블록을 더 빠르게 찾을 수 있는 기능을 추가합니다.</li></ul><h1 id="Laravel"><a href="#Laravel" class="headerlink" title="Laravel"></a>Laravel</h1><ul><li><a href="https://github.com/laravel/octane/releases/tag/v2.0.0">laravel&#x2F;octane</a> 2.0.0 - <a href="https://roadrunner.dev/">Roadrunner v3</a> 지원과 함께 출시되었습니다.</li><li><a href="https://github.com/TomasVotruba/punchcard">TomasVotruba&#x2F;punchcard</a> - 이 도구는 구성 배열을 메서드 체이닝되는 객체로 대체하여 IDE에서 자동 완성을 가능하게 하고 기타 <a href="https://tomasvotruba.com/blog/introducing-punchcard-object-configs-for-laravel">이점</a>을 제공합니다.</li><li><a href="https://laravel-package-ocean.com/">Laravel Package Ocean</a> - 유용한 Laravel 패키지의 모음입니다.</li><li><a href="https://github.com/WendellAdriel/laravel-exa">WendellAdriel&#x2F;laravel-exa</a> - 라라벨을 위한 완전관리형으로(Opinionated) 모듈화된 API 스켈레톤.</li><li><a href="https://github.com/nasirkhan/laravel-starter">nasirkhan&#x2F;laravel-starter</a> - 라라벨 10.x로 구축된 CMS와 유사한 모듈식 스타터 애플리케이션 프로젝트.</li><li><a href="https://laravel-news.com/laravel-security-middleware">Laravel Security Middleware</a> by Steve (King) McDougall.</li><li><a href="https://laravel-news.com/top-10-laravel-audit-security-issues">라라벨 보안 감사 문제 Top 10</a> by Stephen Rees-Carter.</li><li><a href="https://fly.io/laravel-bytes/queues-with-other-languages/">다른 언어와 연결하는 라라벨 Queue</a> by Chris Fidao.</li><li>📺 <a href="https://www.youtube.com/playlist?list=PLr0BjDocnuI0HEC7WqDW9dU-8tCixIGKF">라라벨 연락처 앱 시리즈</a> by Bert De Swaef.</li><li>📺 <a href="https://www.youtube.com/watch?v=CHSL0Btbj_o&list=PL3pX4NAc7vJvBhW5bcngX011BsaFpD-Yo">풀 스택 틱톡 클론 만들기(Nuxt 3, Vue 3, Tailwind CSS, 라라벨)</a> - @johnweeksdev는 Laravel, Vue, Tailwind로 기존 앱의 클론을 만드는 방법에 대한 인상적인 전체 길이의 튜토리얼을 제작해 왔습니다. 그의 프로젝트에는 TikTok, Instagram, Netflix, Facebook 등을 재현하는 작업이 포함되어 있습니다. 추천을 해준 <a href="https://twitter.com/aschmelyun/status/1654821059051257856">Andrew Schmelyun</a>에게 감사드립니다.</li></ul><h1 id="Other-frameworks"><a href="#Other-frameworks" class="headerlink" title="Other frameworks"></a>Other frameworks</h1><ul><li><a href="https://opencollective.com/yiisoft/updates/yii-news-2023-issue-2">Yii 뉴스 2023, 2호</a> by Alexander Makarov.</li><li><a href="https://github.com/leafsphp/leaf">leafsphp&#x2F;leaf</a> 3 - 웹 앱과 API를 빠르게 구축하기 위한 간단한 프레임워크.</li></ul><h1 id="기타"><a href="#기타" class="headerlink" title="기타"></a>기타</h1><ul><li><a href="https://localheinz.com/articles/2023/05/10/avoiding-empty-in-php/">PHP에서 empty() 피하기</a> by Andreas Möller.</li><li><a href="https://peakd.com/hive-168588/@crell/technical-debt-is-over-used">기술 부채는 과도하게 사용됩니다</a> by Larry Garfield.</li><li><a href="https://matthiasnoback.nl/2022/03/too-much-magic/">마법이 너무 많다고요?</a> by Matthias Noback.<blockquote><p>당신이 이해하기 전까진 모든 것이 마법이죠</p></blockquote></li><li><a href="https://wasmlabs.dev/articles/mitigating-php-vulnerabilities-with-webassembly/">WebAssembly로 PHP 취약성 완화하기</a> – VMware의 Jesús González가 WebAssembly를 사용하여 격리된 샌드박스에서 PHP 애플리케이션을 실행하는 방법을 설명합니다..</li><li><a href="https://butschster.medium.com/unleashing-the-power-of-high-performance-queue-services-for-php-applications-dcc5c1426511">PHP 애플리케이션을 위한 고성능 대기열 서비스의 강력한 기능 활용하기</a> - Pavel Buchnev가 PHP 애플리케이션에 RoadRunner를 사용하는 방법에 대해 설명합니다.</li><li><a href="https://staabm.github.io/2023/05/01/diff-speeding.html">Diff 속도 향상 | 나의 개발자 경험</a> - 마크스 스타브가 sebastian&#x2F;diff의 속도를 크게 개선한 방법에 대해 이야기합니다. PHPUnit, Psalm, PHP-CS-Fixer, Codeception을 비롯한 수많은 도구가 이 diff 라이브러리를 활용하고 있으며, 이제 이러한 개선의 이점을 누리고 있습니다.<br>마르쿠스는 <a href="https://staabm.github.io/2023/05/06/racing-rector.html">Racing Rector</a>와 <a href="https://staabm.github.io/2023/05/18/doctor-rst-speedup.html">Doctor Rst Speedup</a>에서 성능 조사를 계속했습니다.</li><li><a href="https://ryangjchandler.co.uk/posts/lets-write-an-esolang-in-php">PHP로 Esolang을 작성하자</a> by Ryan Chandler – PHP에서 Brainf*ck과 유사한 난해한 프로그래밍 언어를 작성하는 방법.</li><li>📺 <a href="https://youtu.be/LUydbYBzjAk">PHP의 타입 시스템 해부?</a> by George Peter Banyard</li></ul><h1 id="Conferences"><a href="#Conferences" class="headerlink" title="Conferences"></a>Conferences</h1><p>오프라인 이벤트가 한창 진행 중입니다. 방문하고 발표를 신청할 만한 예정된 PHP 공연을 확인해 보세요:</p><ul><li><a href="https://laracon.us/">Laracon US</a> – Nashville, TN, USA, July 19–20, 2023.</li><li><a href="https://cakefest.org/">CakeFest</a> – Los Angeles, CA, USA, Sep 28–Oct 3, 2023.</li><li><a href="https://www.longhornphp.com/">Longhorn PHP</a> – Austin, TX, USA, November 2-4, 2023.</li><li><a href="https://live.symfony.com/2023-brussels-con/">SymfonyCon</a> – Brussels, Belgium, December 7–8, 2023.</li></ul><p>다음 PHP 밋업이 언제 열리는지 궁금하다면 Tomas Votruba의 멋진 밋업 애그리게이터 <a href="https://friendsofphp.org/">friendsofphp.org</a>에서 확인할 수 있습니다. php.net - 이벤트에도 캘린더가 있습니다: <a href="https://www.php.net/cal.php">2023년 6월</a>.</p>]]></content>
    
    
      
      
        
        
    <summary type="html">&lt;p&gt;&lt;img src=&quot;https://blog.jetbrains.com/wp-content/uploads/2023/06/php-annotated-featured_blog_1280x720.png&quot; alt=&quot;PHP Annotated</summary>
        
      
    
    
    
    
    <category term="PHP" scheme="https://haah.kr/tags/PHP/"/>
    
    <category term="php-annotated" scheme="https://haah.kr/tags/php-annotated/"/>
    
    <category term="php-annotated-monthly" scheme="https://haah.kr/tags/php-annotated-monthly/"/>
    
  </entry>
  
  <entry>
    <title>PHP Annotated – April 2023</title>
    <link href="https://haah.kr/2023/04/22/php-annotated-april-2023/"/>
    <id>https://haah.kr/2023/04/22/php-annotated-april-2023/</id>
    <published>2023-04-22T07:18:18.000Z</published>
    <updated>2026-05-31T19:29:57.258Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://blog.jetbrains.com/wp-content/uploads/2023/04/php-annotated-blog-featured-image-1280x600-1.png" alt="PHP Annotated 이미지"></p><p><a href="https://blog.jetbrains.com/author/rpronskiy">Roman Pronskiy</a>가 쓰고 JetBrains에서 제공하는 PHP Annotated <a href="https://blog.jetbrains.com/phpstorm/2023/04/php-annotated-april-2023/">2023년 4월</a>의 번역&#x2F;해석본입니다.</p><hr><p>For convenience, sequences may also be applied using the sequence method, which simply invokes the state method internally. The sequence method accepts a closure or arrays of sequenced attributes:<br>번역: </p><p>여러분 안녕하세요!</p><p>엄선된 뉴스, 기사, 도구, 동영상 등 지난 한 달간 PHP 세계에서 일어난 가장 흥미로운 일들을 살펴보는 PHP Annotated 4월호에 오신 것을 환영합니다.</p><h1 id="News"><a href="#News" class="headerlink" title="News"></a>News</h1><h3 id="PHP-8-1-18-and-PHP-8-2-5-released"><a href="#PHP-8-1-18-and-PHP-8-2-5-released" class="headerlink" title="PHP 8.1.18 and PHP 8.2.5 released."></a>PHP 8.1.18 and PHP 8.2.5 released.</h3><p><a href="https://www.php.net/ChangeLog-8.php#8.1.18">PHP 8.1.18</a>과 <a href="https://www.php.net/ChangeLog-8.php#8.2.5">PHP 8.2.5</a>가 릴리스 되었습니다.</p><p>🐛 버그 수정 릴리스입니다.</p><h3 id="Pest-2-0-released"><a href="#Pest-2-0-released" class="headerlink" title="Pest 2.0 released"></a>Pest 2.0 released</h3><p><a href="https://pestphp.com/docs/announcing-pest2">Pest 2.0 출시</a>.</p><p>Pest v2는 테스트 재시도, 느린 테스트 프로파일링, 새로운 arch 플러그인 지원 등 많은 새로운 기능을 제공합니다.</p><ul><li>📺 <a href="https://youtu.be/9EGPo_enEc8">The future of Pest v2</a> by Nuno Maduro.</li><li>📺 <a href="https://www.youtube.com/live/E19wJt-YQ44?feature=share">Let’s look at Pest v2</a> by Laravel News.</li></ul><h3 id="Bref-2-0-released"><a href="#Bref-2-0-released" class="headerlink" title="Bref 2.0 released"></a>Bref 2.0 released</h3><p><a href="https://bref.sh/docs/news/02-bref-2.0.html">Bref 2.0 출시</a></p><p>Bref를 사용하면 AWS Lambda 서버리스 플랫폼에 PHP 앱을 쉽게 배포할 수 있습니다.</p><p>이번 주요 업데이트에서는 PHP 설정을 위한 더 간단한 구성, 개선된 Laravel 통합, 더 빠른 배포, 런타임 시 환경 변수의 시크릿 자동 로드, 로컬 개발을 위한 더 간소화된 docker-compose.yml이 제공됩니다.</p><p><a href="https://serverless-php.news/">서버리스 PHP 뉴스레터</a>를 구독하여 해당 주제에 대한 더 많은 콘텐츠를 확인하세요.</p><h3 id="PER-Coding-Style-2-0-released"><a href="#PER-Coding-Style-2-0-released" class="headerlink" title="PER Coding Style 2.0 released"></a>PER Coding Style 2.0 released</h3><p><a href="https://github.com/php-fig/per-coding-style/releases/tag/2.0.0">PER 코딩 스타일 2.0 출시</a></p><p>새 버전의 PHP 코딩 스타일 가이드라인은 몇 가지 문제를 수정하고 최근 추가된 PHP 구문에 대한 가이드를 업데이트합니다.</p><p>PER CS 2.0이 PSR-12와 어떻게 다른지 확인하려면 <a href="https://github.com/php-fig/per-coding-style/compare/8201676d799ca5d03bec8ee702df1dd3fda8d2b0..2.0.0">여기를 클릭하세요</a>.</p><h3 id="PhpStorm-2023-1-released"><a href="#PhpStorm-2023-1-released" class="headerlink" title="PhpStorm 2023.1 released"></a>PhpStorm 2023.1 released</h3><p><a href="https://blog.jetbrains.com/phpstorm/2023/04/phpstorm-2023-1/">PhpStorm 2023.1 출시</a></p><p>이번 업데이트는 올해 PhpStorm의 첫 번째 주요 업데이트입니다. 3v4l.org와의 통합, 향상된 성능, 새로운 UI 개선 사항, PHP용 DFA 디버거 등 다양한 기능이 제공됩니다.</p><iframe width="560" height="315" src="https://www.youtube.com/embed/hTvi67mBhx0" title="Better performance, 3v4l support, new UI features, and more — What&#39;s New in PhpStorm 2023.1" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe><h3 id="PHP-Foundation-Update-March-2023"><a href="#PHP-Foundation-Update-March-2023" class="headerlink" title="PHP Foundation Update, March 2023"></a>PHP Foundation Update, March 2023</h3><p><a href="https://thephp.foundation/blog/2023/03/31/php-foundation-update-march-2023/">PHP 재단 업데이트, 2023년 3월</a></p><p>PHP 재단 팀은 GitHub 스폰서를 통한 PHP 지원 가능성을 발표하고 새로운 자문위원회 이니셔티브를 공개했습니다.</p><h3 id="PHP-8-3-release-managers-announced"><a href="#PHP-8-3-release-managers-announced" class="headerlink" title="PHP 8.3 release managers announced"></a>PHP 8.3 release managers announced</h3><p><a href="https://wiki.php.net/todo/php83">PHP 8.3 릴리즈 매니저 발표</a></p><p>전통에 따라 PHP 8.3에는 두 명의 신인 릴리즈 매니저가 있습니다: <a href="https://thephp.foundation/">PHP 재단</a>이 후원하는 PHP 핵심 개발자 <a href="https://github.com/bukka">Jakub Zelenka</a>와 <a href="https://github.com/ericmann">Eric Mann</a>입니다. 이들은 베테랑 RM <a href="https://github.com/adoy">Pierrick Charron</a>의 도움을 받게 됩니다.</p><h1 id="PHP-Core"><a href="#PHP-Core" class="headerlink" title="PHP Core"></a>PHP Core</h1><p>대부분의 핵심 소식은 PHP 재단에서 제공하는 PHP 코어 라운드업 시리즈에서 자세히 다루고 있으므로 몇 가지 주요 내용만 나열하겠습니다:</p><h3 id="✅-RFC-Arbitrary-static-variable-initializers"><a href="#✅-RFC-Arbitrary-static-variable-initializers" class="headerlink" title="✅ RFC: Arbitrary static variable initializers"></a>✅ RFC: Arbitrary static variable initializers</h3><p><a href="https://wiki.php.net/rfc/arbitrary_static_variable_initializers">RFC: 임의의 정적 변수 이니셜라이저</a></p><p>PHP는 모든 함수 내에서 정적 변수를 선언할 수 있습니다. 정적 변수의 값은 함수 호출보다 오래 지속되며 향후 함수 실행 시에도 공유됩니다.</p><p>PHP 8.3에서는 다른 함수의 결과와 같은 모든 표현식을 할당할 수 있습니다.</p><figure class="highlight php"><table><tr><td class="code"><pre><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">bar</span>(<span class="params"></span>) </span>&#123;    </span><br><span class="line">    <span class="keyword">echo</span> <span class="string">&quot;bar() called\n&quot;</span>;</span><br><span class="line">    <span class="keyword">return</span> <span class="number">1</span>;</span><br><span class="line">&#125;</span><br><span class="line"> </span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">foo</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line">    <span class="built_in">static</span> <span class="variable">$i</span> = <span class="title function_ invoke__">bar</span>();  <span class="comment">// This currently produces a fatal error, but will work in PHP 8.3</span></span><br><span class="line">    <span class="keyword">echo</span> <span class="variable">$i</span>++, <span class="string">&quot;\n&quot;</span>;</span><br><span class="line">&#125;</span><br><span class="line"> </span><br><span class="line"><span class="title function_ invoke__">foo</span>();</span><br><span class="line"><span class="comment">// bar() called</span></span><br><span class="line"><span class="comment">// 1</span></span><br><span class="line"><span class="title function_ invoke__">foo</span>();</span><br><span class="line"><span class="comment">// 2</span></span><br><span class="line"><span class="title function_ invoke__">foo</span>();</span><br><span class="line"><span class="comment">// 3</span></span><br></pre></td></tr></table></figure><p>부작용으로, PHP 8.3에서는 정적 변수를 다시 선언하는 것이 금지됩니다. 이렇게 하면 아마도 실제 코드에서 볼 수 없었을 PHP의 몇 가지 단점이 수정됩니다:</p><figure class="highlight php"><table><tr><td class="code"><pre><span class="line"><span class="meta">&lt;?php</span></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">f</span>(<span class="params"></span>)</span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">  <span class="built_in">static</span> <span class="variable">$x</span> = <span class="number">1</span>;</span><br><span class="line"></span><br><span class="line">  <span class="keyword">return</span> <span class="variable">$x</span>;</span><br><span class="line"></span><br><span class="line">  <span class="built_in">static</span> <span class="variable">$x</span> = <span class="number">2</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">echo</span> <span class="title function_ invoke__">f</span>();</span><br></pre></td></tr></table></figure><p>두 번째 정적 선언에 연결할 수 없을 것이라고 예상했다면 안타깝게도 착각입니다:<br>PHP 8.3 이전 버전에서의 결과: <a href="https://3v4l.org/HhpYj">https://3v4l.org/HhpYj</a></p><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">Output for 8.0.1 - 8.0.28, 8.1.0 - 8.1.18, 8.2.0 - 8.2.5</span><br><span class="line">2</span><br></pre></td></tr></table></figure><h3 id="📣-RFC-Clone-with"><a href="#📣-RFC-Clone-with" class="headerlink" title="📣 RFC: Clone with"></a>📣 RFC: Clone with</h3><p><a href="https://wiki.php.net/rfc/clone_with">RFC: Clone with</a></p><p>Máté Kocsis는 클론 연산자를 확장하여 “clone with”라는 새로운 언어 구조에 대한 지원을 추가하여 더 적은 코드로 모든 종류의 인스턴스 속성(declared&#x2F;dynamic, typed&#x2F;untyped, readonly&#x2F;non-readonly)에 대한 “wither” 메서드를 작성할 수 있도록 할 것을 제안했습니다.</p><p>example:</p><figure class="highlight php"><table><tr><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Response</span> <span class="keyword">implements</span> <span class="title">ResponseInterface</span> </span>&#123;    </span><br><span class="line"><span class="keyword">public</span> <span class="keyword">readonly</span> <span class="keyword">int</span> <span class="variable">$statusCode</span>;</span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">readonly</span> <span class="keyword">string</span> <span class="variable">$reasonPhrase</span>;</span><br><span class="line">    <span class="comment">// ...</span></span><br><span class="line">    <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">withStatus</span>(<span class="params"><span class="variable">$code</span>, <span class="variable">$reasonPhrase</span> = <span class="string">&#x27;&#x27;</span></span>): <span class="title">Response</span></span></span><br><span class="line"><span class="function">    </span>&#123;</span><br><span class="line">        <span class="keyword">return</span> <span class="keyword">clone</span> <span class="variable language_">$this</span> with &#123;</span><br><span class="line">            statusCode: <span class="variable">$code</span>,</span><br><span class="line">            reasonPhrase: <span class="variable">$reasonPhrase</span></span><br><span class="line">        &#125;;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="comment">// ...</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="variable">$response</span> = <span class="keyword">new</span> <span class="title class_">Response</span>(<span class="number">200</span>);</span><br><span class="line"><span class="variable">$response</span>-&gt;<span class="title function_ invoke__">withStatus</span>(<span class="number">201</span>)-&gt;<span class="title function_ invoke__">withStatus</span>(<span class="number">202</span>);</span><br></pre></td></tr></table></figure><h3 id="📣-RFC-New-core-autoloading-mechanism-with-support-for-function-autoloading"><a href="#📣-RFC-New-core-autoloading-mechanism-with-support-for-function-autoloading" class="headerlink" title="📣 RFC: New core autoloading mechanism with support for function autoloading"></a>📣 RFC: New core autoloading mechanism with support for function autoloading</h3><p><a href="https://wiki.php.net/rfc/core-autoloading">RFC: 새로운 코어 자동 로딩 메커니즘과 함수 자동 로딩 지원</a></p><p>George Peter Banyard와 Dan Ackroyd는 더 나은 설계의 클래스 자동 로딩 메커니즘과 새로운 함수 자동 로딩 메커니즘을 제안합니다.</p><h3 id="📣-Jakub-Zelenka-proposes-to-form-PHP-Technical-Committee"><a href="#📣-Jakub-Zelenka-proposes-to-form-PHP-Technical-Committee" class="headerlink" title="📣 Jakub Zelenka proposes to form PHP Technical Committee"></a>📣 Jakub Zelenka proposes to form PHP Technical Committee</h3><p><a href="https://wiki.php.net/rfc/php_technical_committee">Jakub Zelenka는 PHP 기술 위원회를 구성하는 것을 제안합니다.</a></p><p>PHP는 RFC 투표를 사용하여 사용자가 볼 수 있는 언어 변경을 결정하는데, 이는 몇 가지 알려진 문제에도 불구하고 잘 작동합니다. 그러나 PHP 내부 및 확장 API에 영향을 미치는 기술적 변경에는 효과적이지 않으며, 기술적 기반에 대한 기여자 간의 갈등이 쉽게 해결되지 않습니다.<br>제안된 위원회는 선출된 5명의 위원으로 구성되며, 변경에 대한 분쟁이나 질문이 발생할 경우 위원회에 해결을 요청할 수 있습니다.</p><h1 id="Tools"><a href="#Tools" class="headerlink" title="Tools"></a>Tools</h1><ul><li><p><a href="https://github.com/crazywhalecc/static-php-cli/blob/refactor/README-en.md">crazywhalecc&#x2F;static-php-cli</a> - PHP 앱을 추가 의존성 없이 단일 바이너리 파일로 빌드하는 도구입니다.</p></li><li><p><a href="https://github.com/aschmelyun/subvert">aschmelyun&#x2F;subvert</a> - 비디오에서 초 단위로 자막, 요약 및 챕터를 생성합니다.</p></li><li><p><a href="https://github.com/yiisoft/db">yiisoft&#x2F;db</a> - 다양한 유형의 데이터베이스(MariaDB, MSSQL, MySQL, Oracle, PostgreSQL, SQLite)에 대한 프레임워크에 구애받지 않은 쿼리 빌더입니다.</p></li><li><p><a href="https://github.com/Crell/EnvMapper">Crell&#x2F;EnvMapper</a> - 정의된 클래스 객체에 환경 변수를 쉽게 매핑하여 의존성 주입을 위해 준비합니다.</p></li><li><p><a href="https://dev.to/mrsuh/php-skeleton-for-bison-po2">PHP Skeleton for Bison</a> by Anton Sukhachev.<br>PHP와 많은 다른 언어의 구문은 Bison 형식의 문법으로 설명됩니다. <a href="https://github.com/mrsuh/php-bison-skeleton">mrsuh&#x2F;php-bison-skeleton</a>을 사용하면 third-party 의존없이 PHP에서 Bison 파서를 생성할 수 있습니다. </p></li><li><p>🚧 NativePHP<br>Marcel Pociot는 <a href="https://www.electronjs.org/">Electron</a> 또는 <a href="https://tauri.app/">Tauri</a> 위에 Laravel&#x2F;PHP 앱을 데스크톱에서 실행하는 도구를 개발하고 있습니다.</p><blockquote class="twitter-tweet"><p lang="en" dir="ltr">I heard you like 🔥 tweets, so here&#39;s some NativePHP hot-reloading for you. <a href="https://t.co/ULALsxdsxv">pic.twitter.com/ULALsxdsxv</a></p>&mdash; Marcel Pociot 🧪 (@marcelpociot) <a href="https://twitter.com/marcelpociot/status/1646530594971729922?ref_src=twsrc%5Etfw">April 13, 2023</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script></li></ul><h1 id="Symfony"><a href="#Symfony" class="headerlink" title="Symfony"></a>Symfony</h1><ul><li><a href="https://jolicode.com/blog/aggressive-caching-with-symfony-http-client">심포니 HTTP 클라이언트를 통한 공격적인 캐싱</a> by Grégoire Pineau.</li><li>Symfony 6.3에서 새로운 기능<ul><li><a href="https://symfony.com/blog/new-in-symfony-6-3-targeted-value-resolvers">Targeted Value Resolvers</a></li><li><a href="https://symfony.com/blog/new-in-symfony-6-3-early-hints">Early Hints</a></li><li><a href="https://symfony.com/blog/new-in-symfony-6-3-nosuspiciouscharacters-constraint">NoSuspiciousCharacters Constraint</a></li><li><a href="https://symfony.com/blog/new-in-symfony-6-3-http-exception-attributes">HTTP Exception Attributes</a></li><li><a href="https://symfony.com/blog/new-in-symfony-6-3-mapping-request-data-to-typed-objects">Mapping Request Data to Typed Objects</a></li></ul></li><li><a href="https://jolicode.com/blog/leverage-symfony-vardumper-component-to-enhance-your-dumps">Symfony VarDumper 컴포넌트를 사용하여 덤프를 향상시키기</a> by Grégoire Pineau.</li></ul><h1 id="Laravel"><a href="#Laravel" class="headerlink" title="Laravel"></a>Laravel</h1><ul><li><p><a href="https://laravel-news.com/valet-v4-is-released">Laravel Valet 4.0 released</a><br>이름과 달리 Laravel Valet은 모든 PHP 프로젝트에 사용할 수 있는 최소한의 macOS용 개발 환경입니다.</p><p>이번 릴리즈는 대부분 내부를 다시 작성하는 데 중점을 두었기 때문에 디버그, 수정 및 수정이 더 쉬워졌습니다. 또한 새로운 <code>valet status</code> 명령이 추가되었으며 공유 옵션으로 <a href="https://expose.dev/">Expose</a> 기능을 지원합니다.</p></li><li><p><a href="https://plugins.jetbrains.com/plugin/13441-laravel-idea">Laravel IDEA 7.0</a><br>인기있는 플러그인 PhpStorm에 대한 주요 업데이트가 있었습니다. “새로운 Eloquent 모델” UI와 Twig 템플릿 지원이 포함되어 있습니다. Laravel Daily에서 이 <a href="https://www.youtube.com/watch?v=xGiqQwFbIZk">비디오 데모</a>를 확인하십시오.</p></li><li><p>Marcel Pociot의 <a href="https://beyondco.de/blog/build-a-chatgpt-clone-with-laravel">새로운 OpenAI Chat API를 사용하여 ChatGPT 클론을 만드는 방법</a>.</p></li><li><p>Christoph Rumpel의 <a href="https://christoph-rumpel.com/2023/3/everything-you-can-test-in-your-laravel-application">Laravel 애플리케이션에서 테스트할 수 있는 모든 것</a>.<br>실제 응용 프로그램에서 테스트해야 할 시나리오의 예제가 포함된 훌륭한 가이드입니다.</p></li><li><p><a href="https://github.com/TomasVotruba/bladestan">TomasVotruba&#x2F;bladestan</a> – Blade 템플릿을 위한 PHPStan 분석.</p></li><li><p><a href="https://github.com/lunarphp/lunar">lunarphp&#x2F;lunar</a> – 오픈 소스 헤드리스 e-커머스 패키지로 Laravel에 사용할 수 있습니다. 자체 스토어 프런트를 만들 수 있지만 백엔드 작업은 이미 완성되어 있었습니다.</p></li><li><p><a href="https://github.com/area17/twill">area17&#x2F;twill</a> - 직관적이고 강력하며 유연한 사용자 지정 관리 콘솔을 빠르게 생성하는 데 도움이 되는 Laravel용 CMS 툴킷입니다.</p></li><li><p>📺 <a href="https://www.youtube.com/watch?v=Pp_Q_Wmi8JM&list=PLcjapmjyX17gSav3WQA5UR7iv0ZOaZIh9&index=6">Laravel Weekly Update #6</a> – 이제 팀에서 매주 라라벨 뉴스와 업데이트를 짧은 동영상으로 정리하여 제공합니다.</p></li></ul><h1 id="기타"><a href="#기타" class="headerlink" title="기타"></a>기타</h1><ul><li><p><a href="https://wasmer.io/posts/announcing-wcgi?s=31">Announcing WCGI: WebAssembly + CGI</a> – Wasmer의 사람들이 기존 CGI 애플리케이션을 WASI로 컴파일하여 재사용할 수 있는 새로운 기술을 발표합니다. 이를 통해 비즈니스 로직과 정적 asset만 포함하고 HTTP 스택이나 부피가 큰 Docker 컨테이너가 없는 초소형 패키지를 출시할 수 있습니다.</p></li><li><p><a href="https://localheinz.com/articles/2023/03/18/avoiding-one-liners-in-php/">PHP에서 한 줄 코드를 피하기</a> by Andreas Möller. 코드를 이해하고 디버깅하기 쉽게 만들어 줍니다.<br>break point를 정확히 원하는 곳에 사용해 디버깅할 수 있고, 코드 커버리지를 정확히 측정하면서, 가독성을 높일 수 있다고 주장합니다.</p></li><li><p><a href="https://blog.jetbrains.com/qodana/2023/03/secure-your-php-code-with-taint-analysis-by-qodana/">Secure Your PHP Code With Taint Analysis by Qodana</a> by Valerie Kuzmina.<br>JetBrains의 코드 품질 플랫폼인 Qodana의 손상 분석(Taint Analysis)으로 PHP 코드 보호<br><img src="https://blog.jetbrains.com/wp-content/uploads/2023/03/image-34.png" alt="오염의 예"></p><ul><li>오염의 예. GET 매개변수의 임의 데이터가 화면에 표시됩니다. 예를 들어 악의적인 사용자는 이 취약점을 악용하여 프로그램 레이아웃을 변경할 수 있습니다.<br><img src="https://resources.jetbrains.com/storage/products/blog/wp-content/uploads/Qodana/taint-open.gif" alt="PhpStorm에서 issue 열기"></li></ul></li><li><p><a href="https://freek.dev/2458-discovering-phps-first-class-callable-syntax">Discovering PHP’s first-class callable syntax</a> by Freek Van der Herten.<br>PHP의 first-class callable 구문 알아보기</p></li><li><p><a href="https://ryangjchandler.co.uk/posts/blazingly-fast-markdown-parsing-in-php-using-ffi-and-rust">Blazingly Fast Markdown Parsing in PHP using FFI and Rust</a> by Ryan Chandler.<br>PHP의 FFI와 Rust를 사용한 놀랍도록 빠른 마크다운 파싱</p></li><li><p><a href="https://stitcher.io/blog/cloning-readonly-properties-in-php-83">Cloning readonly properties in PHP 8.3</a> by Brent Roose.<br>PHP 8.3에서 읽기 전용 프로퍼티 복제하기</p></li><li><p><a href="https://peakd.com/hive-168588/@crell/using-psr-3-placeholders-properly">Using PSR-3 placeholders properly</a> by Larry Garfield.<br>PSR-3 플레이스홀더 올바르게 사용하기</p></li><li><p><a href="https://laravel-news.com/extending-php-enums-with-attributes">Extending PHP 8.1 enums with attributes</a> by Rob Fonseca.<br>Attribute로 PHP 8.1 열거형(enum) 확장하기. 간단하지만 깔끔한 어트리뷰트 사용법.</p></li></ul><h1 id="Community"><a href="#Community" class="headerlink" title="Community"></a>Community</h1><ul><li><p>여러분이 놓쳤을 수도 있는데, Brent와 Roman이 이제 PHP Annotated의 비디오 버전을 제작하고 있습니다. 최신 소식을 확인하고 PHP Annotated YouTube 채널 구독도 잊지 마세요.</p><iframe width="560" height="315" src="https://www.youtube.com/embed/v5VtCWgDebw" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe></li><li><p><a href="https://www.otsch.codes/blog/pophpularity">PoPHPularity: Is it decreasing and what to do about it?</a> by Christian Olear.<br>PoPHPularity: PHP의 인기는 줄어들고 있고, 이에 대해 어떻게 대처해야 할까?</p></li><li><p><a href="https://dnlytras.com/blog/modern-php">Modern PHP by Dimitrios Lytras</a><br>“내가 신경을 쓰지 않은 동안, PHP가 꽤 좋아졌다.”</p><ul><li>Array destructuring (v7.1)</li><li>Spread operator within arrays (v7.4) &amp; (v8.1)</li><li>Match expressions (v8.0)</li><li>Enumerations (enums) (v8.1)</li><li>Arrow functions (v7.4)</li><li>Named parameters (v8.0)</li><li>Null coalescing operator (v7.0)</li><li>Null coalescing assignment operator (v7.4)</li><li>Null-safe operator (v8.0)</li><li>Spaceship operator (v7.0)</li><li>Multi catch exception handling (v7.1)</li><li>str_starts_with, str_ends_with, str_contains (v8.0)</li><li>Return Types (v7.0)</li><li>Union types (v8.0)</li><li>Null and Void return types (v7.1)</li><li>Never return type (v8.1)</li><li>Grouped imports (v7.0)</li><li>Constructor property promotion (v8.0)</li><li>WeakMaps (v8.0)</li></ul></li><li><p>“그 차는 PHP 전도사 역할을 톡톡히 해왔습니다.”</p><blockquote class="twitter-tweet"><p lang="en" dir="ltr">Every time a kid flags me down in the Lambo and asks me what I do for work I tell them I code in PHP the greatest programming language of all time 😂<br><br>That car has done so much PHP evangelism</p>&mdash; Taylor Otwell 🪐 (@taylorotwell) <a href="https://twitter.com/taylorotwell/status/1647010323147177985?ref_src=twsrc%5Etfw">April 14, 2023</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script></li></ul><h1 id="Conferences"><a href="#Conferences" class="headerlink" title="Conferences"></a>Conferences</h1><p>참가하고 신청할 가치가 있는 다가오는 PHP 모임을 확인하십시오.</p><ul><li><a href="https://tek.phparch.com/">php[tek]</a> – Chicago (US), May 16–18, 2023.</li><li><a href="https://2023.phpday.it/">phpday 2023</a> – Verona (Italy), May 18–19, 2023.</li><li><a href="https://phpconference.com/berlin-en/">International PHP Conference</a> – Berlin (Germany), May 22–26, 2023.</li><li><a href="https://laracon.us/">Laracon US</a> – Nashville (US), July 19–20, 2023.</li><li><a href="https://cakefest.org/">CakeFest</a> – Los Angeles (US), Sep 28–3, 2023.</li><li><a href="https://live.symfony.com/2023-brussels-con/">SymfonyCon</a> – Brussels (Belgium), December 7–8, 2023.</li></ul>]]></content>
    
    
      
      
        
        
    <summary type="html">&lt;p&gt;&lt;img src=&quot;https://blog.jetbrains.com/wp-content/uploads/2023/04/php-annotated-blog-featured-image-1280x600-1.png&quot; alt=&quot;PHP Annotated</summary>
        
      
    
    
    
    
    <category term="PHP" scheme="https://haah.kr/tags/PHP/"/>
    
    <category term="php-annotated" scheme="https://haah.kr/tags/php-annotated/"/>
    
    <category term="php-annotated-monthly" scheme="https://haah.kr/tags/php-annotated-monthly/"/>
    
  </entry>
  
  <entry>
    <title>PHP Annotated – February 2023</title>
    <link href="https://haah.kr/2023/03/04/php-annotated-february-2023/"/>
    <id>https://haah.kr/2023/03/04/php-annotated-february-2023/</id>
    <published>2023-03-04T05:10:14.000Z</published>
    <updated>2026-05-31T19:29:57.259Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://blog.jetbrains.com/wp-content/uploads/2023/02/php-annotated-blog-featured-image-1280x600-1.png" alt="PHP Annotated 이미지"></p><p><a href="https://blog.jetbrains.com/author/rpronskiy">Roman Pronskiy</a>가 쓰고 JetBrains에서 제공하는 PHP Annotated <a href="https://blog.jetbrains.com/phpstorm/2023/02/php-annotated-february-2023/">2023년 2월</a>의 번역&#x2F;해석본입니다.</p><p>이 중에서 몇 가지 제 취향껏 골라 그 안의 내용도 좀 뒤져보고 개발새발 번역해서 소개합니다.</p><hr><p>안녕하세요, 여러분!</p><p>PHP Annotated 2월호에 오신 것을 환영합니다. 엄선된 뉴스, 기사, 도구, 동영상 등 지난 한 달간 PHP 세계에서 일어난 가장 흥미로운 일들을 소개합니다.</p><h1 id="News"><a href="#News" class="headerlink" title="News"></a>News</h1><h3 id="PHP-8-0-28-PHP-8-1-16-and-PHP-8-2-3-have-been-released"><a href="#PHP-8-0-28-PHP-8-1-16-and-PHP-8-2-3-have-been-released" class="headerlink" title="PHP 8.0.28, PHP 8.1.16, and PHP 8.2.3 have been released."></a>PHP 8.0.28, PHP 8.1.16, and PHP 8.2.3 have been released.</h3><p><a href="https://www.php.net/archive/2023.php#2023-02-14-1">PHP 8.0.28</a>, <a href="https://www.php.net/archive/2023.php#2023-02-14-3">PHP 8.1.16</a> 및 <a href="https://www.php.net/archive/2023.php#2023-02-14-2">PHP 8.2.3</a>이 릴리스되었습니다.</p><p>❗️ 이들은 <a href="https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2023-0568">CVE-2023-0568</a>, <a href="https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2023-0567">CVE-2023-0567</a>, <a href="https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2023-0662">CVE-2023-0662</a> 에 대한 수정이 포함된 보안 업데이트입니다.</p><p>당분간은 여전히 PHP 7.4를 사용하는 경우 <a href="https://blog.remirepo.net/post/2022/11/29/PHP-7.4-is-retired#comments">Remi의 리포지토리</a>에 백포트된 보안 수정 사항이 포함된 업데이트가 있습니다. 그러나 이 리포지토리는 Remi가 얼마나 많은 여유 시간을 제공할 수 있는지에 따라 달라지는 최선의 노력 프로젝트임을 명심하세요. 즉, 사용자에게 마이그레이션할 시간을 더 주기 위한 것이므로 향후 업데이트에 대한 보장은 없습니다.</p><h3 id="Laravel-v10-has-been-released"><a href="#Laravel-v10-has-been-released" class="headerlink" title="Laravel v10 has been released"></a>Laravel v10 has been released</h3><p><a href="https://blog.laravel.com/laravel-v10-released">Laravel v10이 출시되었습니다.</a></p><p>다음은 이 업데이트에 대해 자세히 알아보는 데 도움이 되는 몇 가지 리소스입니다:</p><ul><li>Jeffrey Way의 <a href="https://laracasts.com/series/whats-new-in-laravel-10">Laracasts: What’s New in Laravel 10</a></li><li>Benjamin Crozat의 <a href="https://benjamincrozat.com/laravel-10-upgrade-guide">Laravel 10: the mindful upgrade guide</a></li><li>Marcel Pociot의 <a href="https://beyondco.de/blog/laravel-10-new-process-facade/">The new Process facade in Laravel 10</a></li><li>Laravel 팀의 <a href="https://github.com/laravel/pennant">laravel&#x2F;pennant</a>. 이 새로운 패키지는 Laravel 10과 함께 제공되며 애플리케이션에 대한 기능 플래그를 제공합니다.</li></ul><p>팀에서 발표한 주요 변경 사항 중 하나는 전체 Laravel 패키지 세트에 유형 선언을 추가한 것입니다.<br>이로 인해 컨트롤러 스텁(stub)에서 사용자에게 문제가 발생했습니다. 그리고 얼마 후 Laravel 팀은 유형 선언을 모두 제거하기로 결정했습니다.</p><p>Martin Joo(@mmartin_joo)의 <a href="https://twitter.com/mmartin_joo/status/1627599438880333824">트윗</a></p><blockquote><p>All the drama about the Controller return types🚀🎉😀</p></blockquote><p><img src="https://pbs.twimg.com/media/FpXbsSAWIAAHfbv?format=jpg&name=small" alt="트윗 이미지"></p><p>Taylor Otwell(@taylorotwell)의 <a href="https://twitter.com/taylorotwell/status/1627338753332084737">트윗</a></p><blockquote><p>컨트롤러 스텁에서 반환 유형을 제거하기로 결정했습니다. 👍<br>원한다면 추가하세요. ✅</p></blockquote><h3 id="PHPUnit-10-is-out"><a href="#PHPUnit-10-is-out" class="headerlink" title="PHPUnit 10 is out"></a>PHPUnit 10 is out</h3><p><a href="https://phpunit.de/announcements/phpunit-10.html">PHPUnit 10이 출시되었습니다.</a></p><p>2년간의 개발 끝에 Sebastian Bergmann과 PHPUnit 팀이 이 major 릴리스를 발표했습니다.</p><blockquote><p>이번 릴리즈는 PHP 7이 PHPUnit에 그랬던 것처럼 대규모 정리, 리팩토링, 현대화를 통해 향후 개발의 토대를 마련한 것입니다.</p></blockquote><p>Attribute, 정적 데이터 공급자(static data providers), 더 적은 오류 알림(notice), 더 간소화된 이벤트 시스템을 제공합니다.</p><ul><li>PHPUnit 10은 E_USER_NOTICE를 예외로 변환하지 않으므로 테스트 실행이 중단되지 않습니다</li></ul><p>PHP Release Radar 채널에 게시된 PHPUnit 개발자와의 인터뷰를 확인해 보세요: <a href="https://www.youtube.com/watch?v=QwsH4IlolyU&t=2531s">PHP Release Radar – Episode 14: PHPUnit 10.0</a>.</p><p>이번 릴리즈의 내부 변경 사항 중 하나는 새로운 이벤트 시스템으로, PHPUnit extension 개발자에게 영향을 줍니다. <a href="https://localheinz.com/articles/2023/02/14/extending-phpunit-with-its-new-event-system/">새로운 이벤트 시스템으로 PHPUnit 확장하기</a> 게시물에서 자세히 알아보세요.</p><h3 id="A-big-release-for-the-PER-coding-style-is-coming"><a href="#A-big-release-for-the-PER-coding-style-is-coming" class="headerlink" title="A big release for the PER coding style is coming."></a>A big release for the PER coding style is coming.</h3><p><a href="https://github.com/php-fig/per-coding-style/blob/master/spec.md">PER 코딩 스타일</a>에 대한 대규모 릴리스가 곧 출시됩니다.</p><p>PER 코딩 스타일은 코드를 더 읽기 쉽게 만들고 “여기에 공백을 추가해야 할까요?” 또는 “이 문장은 별도의 줄에 넣어야 할까요?”와 같은 질문을 끝내고 정말 중요한 일에 시간을 할애할 수 있도록 하는 것을 목표로 하며, PER은 롤링 문서이므로 팀이 여러 PSR을 만드는 대신 여러 버전에 태그를 지정하게 됩니다.</p><p>버전 1.0.0은 PSR-12의 복사본이었습니다. 다음 버전은 최신 PHP 기능을 포함하도록 사양을 업데이트하고 문제를 수정하는 데 중점을 둘 것입니다.</p><p>GitHub 이슈 탭(<a href="https://github.com/php-fig/per-coding-style/blob/master/spec.md">https://github.com/php-fig/per-coding-style</a>)에 피드백을 남길 수 있습니다.</p><hr><h1 id="PHP-Core"><a href="#PHP-Core" class="headerlink" title="PHP Core"></a>PHP Core</h1><p>대부분의 핵심 소식은 PHP 재단에서 제공하는 <a href="https://thephp.foundation/blog/2023/01/30/php-core-roundup-9/">PHP Core Roundup 시리즈</a>에서 자세히 다루고 있으므로 여기서는 간략하게만 언급하겠습니다:</p><h3 id="❌-RFC-Asymmetric-Visibility"><a href="#❌-RFC-Asymmetric-Visibility" class="headerlink" title="❌ RFC: Asymmetric Visibility"></a>❌ RFC: Asymmetric Visibility</h3><p><a href="https://wiki.php.net/rfc/asymmetric-visibility">RFC: 비대칭 가시성</a></p><p>Ilija Tovilo와 Larry Garfield는 필요한 피드백을 받아 이 RFC의 수정 버전을 발표할 예정이지만, 지금은 프로퍼티에 대한 후크와 접근자를 추가하는 제안에 집중할 것입니다.</p><h3 id="✅-RFC-Readonly-amendments-PHP-8-3"><a href="#✅-RFC-Readonly-amendments-PHP-8-3" class="headerlink" title="✅ RFC: Readonly amendments #PHP 8.3"></a>✅ RFC: Readonly amendments #PHP 8.3</h3><p><a href="https://wiki.php.net/rfc/readonly_amendments">RFC: Readonly 수정 사항 #PHP 8.3</a></p><figure class="highlight php"><table><tr><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Foo</span> </span>&#123;    </span><br><span class="line"><span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">__construct</span>(<span class="params"></span></span></span><br><span class="line"><span class="params"><span class="function">        <span class="keyword">public</span> <span class="keyword">readonly</span> DateTime <span class="variable">$bar</span>,</span></span></span><br><span class="line"><span class="params"><span class="function">    </span>) </span>&#123;&#125;</span><br><span class="line"> </span><br><span class="line">    <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">__clone</span>(<span class="params"></span>)</span></span><br><span class="line"><span class="function">    </span>&#123;</span><br><span class="line">        <span class="variable language_">$this</span>-&gt;bar = <span class="keyword">clone</span> <span class="variable language_">$this</span>-&gt;bar;    <span class="comment">// This produces a Fatal error in PHP &lt;8.2 </span></span><br><span class="line">                                          <span class="comment">// and will work in PHP 8.3+</span></span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"> </span><br><span class="line"><span class="variable">$foo</span> = <span class="keyword">new</span> <span class="title class_">Foo</span>(<span class="keyword">new</span> <span class="title class_">DateTime</span>());</span><br><span class="line"><span class="variable">$foo2</span> = <span class="keyword">clone</span> <span class="variable">$foo</span>;</span><br></pre></td></tr></table></figure><h3 id="📣-RFC-Path-to-Saner-Increment-x2F-Decrement-operators-PHP-8-3"><a href="#📣-RFC-Path-to-Saner-Increment-x2F-Decrement-operators-PHP-8-3" class="headerlink" title="📣 RFC: Path to Saner Increment&#x2F;Decrement operators #PHP 8.3"></a>📣 RFC: Path to Saner Increment&#x2F;Decrement operators #PHP 8.3</h3><p><a href="https://wiki.php.net/rfc/saner-inc-dec-operators">RFC: 더 건전한 증분&#x2F;감소 연산자로 가는 길 #PHP 8.3</a></p><p>George Peter Banyard는 <code>++</code>와 <code>--</code> 연산자의 동작을 일관되게 만들 것을 제안합니다.</p><h3 id="📣-RFC-Pass-Scope-to-Magic-Accessors-PHP-8-3"><a href="#📣-RFC-Pass-Scope-to-Magic-Accessors-PHP-8-3" class="headerlink" title="📣 RFC: Pass Scope to Magic Accessors #PHP 8.3"></a>📣 RFC: Pass Scope to Magic Accessors #PHP 8.3</h3><p><a href="https://wiki.php.net/rfc/pass_scope_to_magic_accessors">RFC: 매직 접근자에 범위 전달 #PHP 8.3</a></p><p>Nicolas Grekas와 Ilija Tovilo가 호출 범위를 매직 접근자에게 전달하는 것을 제안했습니다.</p><p>논의 과정에서 커뮤니티 회원들은 범위를 올바르게 반환하는 별도의 함수를 추가할 것을 제안했고, RFC 작성자는 이 아이디어로 방향을 전환할 수 있습니다.</p><h3 id="📊-RFC-Typed-class-constants-PHP-8-3"><a href="#📊-RFC-Typed-class-constants-PHP-8-3" class="headerlink" title="📊 RFC: Typed class constants #PHP 8.3"></a>📊 RFC: Typed class constants #PHP 8.3</h3><p><a href="https://wiki.php.net/rfc/typed_class_constants">RFC: 타입 클래스 상수 #PHP 8.3</a></p><p>Benas Seliuginas와 Máté Kocsis는 클래스 및 인터페이스의 콘텐츠에 대한 타입 선언을 허용할 것을 제안합니다.<br>다음은 이 문제와 타입 상수가 어떻게 도움이 되는지 보여주는 몇 가지 예제 코드입니다:</p><figure class="highlight php"><table><tr><td class="code"><pre><span class="line"><span class="class"><span class="keyword">interface</span> <span class="title">I</span> </span>&#123;</span><br><span class="line">    <span class="keyword">const</span> <span class="variable constant_">TEST</span> = <span class="string">&quot;Test&quot;</span>;  <span class="comment">// We may naively assume that I::TEST is a string.</span></span><br><span class="line">&#125;</span><br><span class="line"> </span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Foo</span> <span class="keyword">implements</span> <span class="title">I</span> </span>&#123;</span><br><span class="line">    <span class="keyword">const</span> <span class="variable constant_">TEST</span> = [];      <span class="comment">// But it may be an array...</span></span><br><span class="line">&#125;</span><br><span class="line"> </span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Bar</span> <span class="keyword">extends</span> <span class="title">Foo</span> </span>&#123;</span><br><span class="line">    <span class="keyword">const</span> <span class="variable constant_">TEST</span> = <span class="literal">null</span>;    <span class="comment">// Or null</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="📣-RFC-Working-With-Substrings-PHP-8-3"><a href="#📣-RFC-Working-With-Substrings-PHP-8-3" class="headerlink" title="📣 RFC: Working With Substrings #PHP 8.3"></a>📣 RFC: Working With Substrings #PHP 8.3</h3><p><a href="https://wiki.php.net/rfc/working_with_substrings">RFC: 서브스트링으로 작업하기 #PHP 8.3</a></p><p>Thomas Hruska는 PHP에 꽤 많은 <a href="https://github.com/cubiclesoft/php-ext-qolfuncs">삶의 질 개선 기능</a>을 구현했으며, 이 RFC는 서브스트링 처리를 최적화하기 위해 그 중 일부를 코어로 가져온 최초의 RFC입니다.</p><hr><h1 id="PhpStorm"><a href="#PhpStorm" class="headerlink" title="PhpStorm"></a>PhpStorm</h1><h3 id="PhpStorm-2023-1-Early-Access-Program-Is-Open"><a href="#PhpStorm-2023-1-Early-Access-Program-Is-Open" class="headerlink" title="PhpStorm 2023.1 Early Access Program Is Open"></a>PhpStorm 2023.1 Early Access Program Is Open</h3><p><a href="https://blog.jetbrains.com/phpstorm/2023/01/phpstorm-2023-1-early-access-program-is-open/">PhpStorm 2023.1 Early Access 프로그램 시작</a></p><p>곧 출시될 주요 릴리스에서 다음과 같은 새로운 기능을 이미 사용해 볼 수 있습니다:</p><ul><li>3v4l.org에서 PHP 스크립트 실행 가능.</li><li>인기 있는 PHP 패키지의 공유 인덱스를 포함한 성능 개선.<ul><li>PhpStorm에서 로컬로 구축되는 일반 인덱스와 달리 공유 인덱스는 한 번 생성되고 나중에 필요할 때마다 다른 컴퓨터에서 재사용됩니다.</li></ul></li><li>새로운 UI에 대한 많은 개선.</li><li>사용자 정의 정규식 기반 검색 및 바꾸기 검사.</li></ul><h3 id="Command-Line-Launcher"><a href="#Command-Line-Launcher" class="headerlink" title="Command Line Launcher"></a>Command Line Launcher</h3><p><a href="https://plugins.jetbrains.com/plugin/14337-command-line-launcher">명령줄 실행기 plugin</a></p><p>터미널 명령을 실행하고 관리하는 데 도움이 되는 PhpStorm 플러그인입니다. 이 플러그인을 사용하여 서버, Docker를 시작하거나 원격 서버에서 명령을 실행할 수도 있습니다.</p><p><img src="https://plugins.jetbrains.com/files/14337/screenshot_21926.png" alt="Command Line Launcher plugin 스크린샷"></p><hr><h1 id="Tools"><a href="#Tools" class="headerlink" title="Tools"></a>Tools</h1><ul><li><a href="https://github.com/crwlrsoft/crawler">crwlrsoft&#x2F;crawler 1.0</a> – 신속한 (웹) 크롤러 및 스크레이퍼 개발을 위한 라이브러리입니다.<br><a href="https://www.crwlr.software/blog/good-reasons-to-use-the-crwlr-library">crwlr 라이브러리를 사용해야 하는 10가지 좋은 이유</a>를 확인하세요.</li><li><a href="https://github.com/olvlvl/composer-attribute-collector">olvlvl&#x2F;composer-attribute-collector</a> – PHP 8 attribute의 대상을 검색하는 편리하고 거의 제로 비용에 가까운 방법.</li><li><a href="https://github.com/brick/json-mapper">brick&#x2F;json-mapper</a> – JSON 데이터를 강하게 타입이 지정된 PHP DTO에 매핑합니다.<br><a href="https://www.reddit.com/r/PHP/comments/113dt5s/comment/j8q3ad7/?context=3">&#x2F;r&#x2F;php subreddit</a>에 제안된 것처럼, 꽤 많은 성숙한 대안이 있습니다:<ul><li><a href="https://github.com/schmittjoh/serializer">https://github.com/schmittjoh/serializer</a></li><li><a href="https://github.com/cweiske/jsonmapper">https://github.com/cweiske/jsonmapper</a></li><li><a href="https://github.com/spatie/data-transfer-object">https://github.com/spatie/data-transfer-object</a></li><li><a href="https://github.com/JsonMapper/JsonMapper">https://github.com/JsonMapper/JsonMapper</a></li><li><a href="https://github.com/CuyZ/Valinor">https://github.com/CuyZ/Valinor</a></li><li><a href="https://github.com/doctrine/doctrine-laminas-hydrator">https://github.com/doctrine/doctrine-laminas-hydrator</a></li></ul></li><li><a href="https://github.com/boxblinkracer/phpunuhi">boxblinkracer&#x2F;phpunuhi</a> - PHPUnuhi는 번역의 유효성을 검사하고 관리하기 위해 쉽게 구성할 수 있는 프레임워크입니다.</li><li><a href="https://github.com/markrogoyski/itertools-php">markrogoyski&#x2F;itertools-php</a> - 이 패키지는 이터러블 컬렉션 작업을 위한 방대한 함수 세트를 제공합니다. Laravel이나 Doctrine 컬렉션과 같은 다른 컬렉션 라이브러리와 가장 큰 차이점은 이터러블을 배열로 변환하지 않기 때문에 제너레이터로 작업할 때 메모리 효율이 훨씬 높다는 점입니다.</li><li><a href="https://github.com/Crell/mastobot">Crell&#x2F;mastobot</a> - Mastodon 계정을 위한 간단한 개인 스케줄링 봇입니다.<br>자세한 내용은 Larry Garfield의 블로그 포스팅 <a href="https://peakd.com/hive-168588/@crell/mastobot-for-your-fediverse-php-posting-needs">Mastobot: For your Fediverse PHP posting needs</a>을 읽어보세요.</li><li><a href="https://github.com/paratestphp/paratest">paratestphp&#x2F;paratest</a> - PHPUnit에 병렬 테스트를 지원하는 paratest의 버전 7.0이 출시되었습니다.</li><li><a href="https://github.com/TheDragonCode/benchmark">TheDragonCode&#x2F;benchmark</a> - 서로 다른 두 코드 블록을 실행하는 데 걸리는 시간을 비교할 수 있는 간단한 도구입니다.</li><li><a href="https://github.com/parsica-php/parsica">parsica-php&#x2F;parsica</a> - 특이한 구문을 가진 파서 빌더: <code>$parser = between(char(&#39;&#123;&#39;), char(&#39;&#125;&#39;), atLeastOne(alphaChar()));</code></li><li><a href="https://docs.saloon.dev/upgrade/whats-new-in-v2">Sammyjo20&#x2F;Saloon 2.0</a> - 이 패키지의 아이디어는 서비스용 SDK 생성을 단순화하거나 다양한 API에 대한 액세스를 단일 스타일로 구성하는 것입니다.</li><li><a href="https://github.com/yiisoft/validator">yiisoft&#x2F;validator</a> - 독립적으로도 사용할 수 있는 Yii 프레임워크의 강력한 유효성 검사기 패키지입니다.</li></ul><hr><h1 id="Symfony"><a href="#Symfony" class="headerlink" title="Symfony"></a>Symfony</h1><ul><li><a href="https://jolicode.com/blog/how-taggedlocator-can-help-you-design-better-symfony-application">TaggedLocator로 더 나은 심포니 애플리케이션을 디자인하는 방법</a> by Gregoire Pineau.</li><li><a href="https://medium.com/@franzose/optimizing-onetomany-doctrine-collections-398c782706a2">일대다 Doctrine collection 최적화</a> by Yan Ivanov.</li><li><a href="https://soyuka.me/api-platform-3.1-whats-new/">API Platform 3.1 is out!</a> – Symfony를 기반으로 구축된 이 성숙한 프레임워크를 통해 REST 및 GraphQL API 등을 만들 수 있습니다.</li></ul><hr><h1 id="Laravel"><a href="#Laravel" class="headerlink" title="Laravel"></a>Laravel</h1><ul><li><p><a href="https://beyondco.de/blog/ai-powered-error-solutions-for-laravel">AI로 라라벨 예외를 해결해 보세요.</a> by Marcel Pociot.<br><img src="https://beyondco.de/img-blog/ai-error-pages/memcached.png" alt="AI generated solution 화면"></p></li><li><p><a href="https://freek.dev/2428-using-laravel-sanctum-to-create-dynamic-abilities">라라벨 생텀을 사용하여 동적 기능 생성하기</a> by Freek Van der Herten.</p></li><li><p><a href="https://medium.com/studocu-techblog/you-might-not-need-a-repository-in-laravel-3-alternatives-c241638a3922">라라벨에 리포지토리가 필요하지 않을 수도 있다: 3가지 대안</a> by Mazen Touati.</p><ul><li>어차피 Laravel을 쓰면 보통은 Eloquent에 종속되어 사용</li><li>교체 가능성, 테스트 가능성을 높여주는 repository 패턴은 대규모 코드에서 잘 운용하기 어려움</li><li>그래서 이 셋으로 대체 가능 : scope 사용, 복잡한 데이터를 가져오고 캐싱하는 custom 쿼리, 데이터를 조작하기 위한 Action</li></ul></li><li><p><a href="https://tighten.com/insights/request-level-validation/">Request 단의 유효성 검사</a> by Tighten.</p></li><li><p><a href="https://laravel-news.com/laravel-content-security-policies">CSP를 사용하여 Laravel 애플리케이션의 보안을 개선하는 방법</a> by Ashley Allen.</p></li><li><p><a href="https://laravel-news.com/testing-json-api-endpoints-with-pestphp">PestPHP로 JSON:API Endpoint 테스트하기</a> by Steve (King) McDougall.</p></li><li><p><a href="https://laravel-news.com/managing-routes">대규모 Laravel 애플리케이션에서 Route 관리하기</a> by Steve (King) McDougall.</p></li></ul><hr><h1 id="Other-Frameworks"><a href="#Other-Frameworks" class="headerlink" title="Other Frameworks"></a>Other Frameworks</h1><ul><li><a href="https://opencollective.com/yiisoft/updates/yii-news-2023-issue-1">Yii news 2023, issue 1</a> by Wilmer Arambula.</li><li><a href="https://github.com/spiral/framework/releases/tag/3.6.0">Spiral&#x2F;framework v3.6.0</a> –  이미 알고 계실지도 모르지만, 이 인상적인 프레임워크를 개발한 팀도 <a href="https://github.com/roadrunner-server/roadrunner">RoadRunner</a>입니다. 최신 릴리스에서는 fiber를 지원하는 컨테이너에서 격리된 메모리 범위라는 PHP 프레임워크를 위한 고유한 기능을 만들었습니다. 이는 장기 실행(데몬) PHP 애플리케이션의 메모리 누수를 제한하는 데 도움이 됩니다.<br>프레임워크의 또 다른 흥미로운 아이디어는 CLI 명령을 사용하여 PHP attribute를 만드는 것입니다.</li></ul><hr><h1 id="기타"><a href="#기타" class="headerlink" title="기타"></a>기타</h1><h3 id="How-to-extend-lifetime-of-legacy-PHP-applications-by-Ayesh-Karunaratne-PHP-Watch"><a href="#How-to-extend-lifetime-of-legacy-PHP-applications-by-Ayesh-Karunaratne-PHP-Watch" class="headerlink" title="How to extend lifetime of legacy PHP applications by Ayesh Karunaratne (PHP.Watch)."></a>How to extend lifetime of legacy PHP applications by Ayesh Karunaratne (PHP.Watch).</h3><p><a href="https://php.watch/articles/extend-lifetime-legacy-php">레거시 PHP 애플리케이션의 수명을 연장하는 방법.</a></p><h3 id="Hakana-Taking-Hack-Seriously-by-Matt-Brown-from-Slack-and-author-of-Psalm"><a href="#Hakana-Taking-Hack-Seriously-by-Matt-Brown-from-Slack-and-author-of-Psalm" class="headerlink" title="Hakana: Taking Hack Seriously by Matt Brown from Slack, and author of Psalm."></a>Hakana: Taking Hack Seriously by Matt Brown from Slack, and author of Psalm.</h3><p><a href="https://slack.engineering/hakana-taking-hack-seriously/">Hakana: Hack을 진지하게 받아들이기</a></p><p> Slack의 Matt Brown과 Psalm의 저자 Matt는 Hakana라는 새로운 Hack용 정적 분석기를 발표했습니다. 이 분석기는 Psalm을 기반으로 하며 Rust로 작성되었습니다.</p><p>Hakana는 Psalm보다 훨씬 빠르지만 PHP와 호환되지 않습니다. 하지만 Matt는 호환이 가능할 것이라고 언급했습니다:</p><blockquote><p>쉽지는 않겠지만, PHP 코드베이스가 매우 큰 회사라면 Hakana를 포크하여 PHP 코드를 분석할 수 있도록 변경하는 것을 고려할 수 있습니다.</p></blockquote><h3 id="Good-Bye-Monorepo-by-Tomas-Votruba"><a href="#Good-Bye-Monorepo-by-Tomas-Votruba" class="headerlink" title="Good Bye, Monorepo by Tomas Votruba."></a>Good Bye, Monorepo by Tomas Votruba.</h3><p><a href="https://tomasvotruba.com/blog/good-bye-monorepo/">안녕, 모노레포.</a></p><h3 id="Documenting-the-system-under-test-in-PHPUnit-by-Andreas-Moller"><a href="#Documenting-the-system-under-test-in-PHPUnit-by-Andreas-Moller" class="headerlink" title="Documenting the system under test in PHPUnit by Andreas Möller."></a>Documenting the system under test in PHPUnit by Andreas Möller.</h3><p><a href="https://localheinz.com/articles/2023/02/22/documenting-the-system-under-test-in-phpunit/">테스트 대상 시스템(system under test)을 PHPUnit으로 문서화하기</a>.</p><h3 id="PHP-Development-Server-lt-x3D-7-4-21-–-Remote-Source-Disclosure-–-A-vulnerability-analysis"><a href="#PHP-Development-Server-lt-x3D-7-4-21-–-Remote-Source-Disclosure-–-A-vulnerability-analysis" class="headerlink" title="PHP Development Server &lt;&#x3D; 7.4.21 – Remote Source Disclosure – A vulnerability analysis."></a>PHP Development Server &lt;&#x3D; 7.4.21 – Remote Source Disclosure – A vulnerability analysis.</h3><p><a href="https://blog.projectdiscovery.io/php-http-server-source-disclosure/">PHP 개발 서버 &lt;&#x3D; 7.4.21 - 원격 서버의 소스 코드 누출</a> - 취약점 분석.</p><h3 id="PHP-wishlist"><a href="#PHP-wishlist" class="headerlink" title="PHP wishlist:"></a>PHP wishlist:</h3><ul><li><a href="https://sebastiandedeyne.com/php-wishlist-pipe-operator/">파이프(pipe) 연산자</a> by Seb De Deyne .</li><li><a href="https://ryangjchandler.co.uk/posts/4-things-id-like-to-see-in-a-future-version-of-php">향후 버전의 PHP에서 보고 싶은 4가지</a> by Ryan Chandler.<ol><li>Type aliases</li><li>Multi-line match arms</li><li>Generics</li><li>Pattern matching on value types</li></ol></li><li>더 많은 것을 원하신다면 Brent의 글도 있습니다: <a href="https://stitcher.io/blog/php-reimagined-part-2">PHP에 대해 내가 바꾸고 싶은 것들</a>.</li></ul><h3 id="PHPLift-–-Compatibility-Guide"><a href="#PHPLift-–-Compatibility-Guide" class="headerlink" title="PHPLift – Compatibility Guide"></a>PHPLift – Compatibility Guide</h3><p><a href="https://phplift.com/compatibility">PHPLift - 호환성 가이드</a></p><p>Anna Filina(@afilina)의 <a href="hhttps://twitter.com/afilina/status/1622668681925861386">트윗</a></p><blockquote><p>제가 한동안 작업해 온 프로젝트를 발표합니다: PHPLift입니다.</p><p>앱의 PHP 버전을 업그레이드하는 데 도움이 되는 가이드입니다. 현재 진행 중인 작업이므로 정기적으로 콘텐츠를 추가할 예정입니다. 누군가에게 도움이 되길 바랍니다. 즐거운 업그레이드 되세요!</p><p><a href="https://phplift.com/">https://phplift.com</a></p></blockquote><h3 id="azjezz-x2F-typed"><a href="#azjezz-x2F-typed" class="headerlink" title="azjezz&#x2F;typed"></a>azjezz&#x2F;typed</h3><p><a href="https://github.com/azjezz/typed/">azjezz&#x2F;typed</a></p><p>Sergii Shymko(@SergiiShymko)의 <a href="https://twitter.com/SergiiShymko/status/1623416976818282502">트윗</a></p><blockquote><p>와우! PHP에서 로컬 변수를 강력하게 입력할 수 있습니다! 이 변수는 아래에 생성된 익명 클래스의 유형화된 속성을 참조합니다.<br><a href="https://3v4l.org/T6GFS">https://3v4l.org/T6GFS</a></p><p>심지어 모든 기본 유형에 대한 선언이 포함된 Composer 패키지도 있습니다.</p></blockquote><figure class="highlight php"><table><tr><td class="code"><pre><span class="line"><span class="meta">&lt;?php</span></span><br><span class="line"><span class="keyword">declare</span>(strict_types=<span class="number">1</span>);</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> &amp;<span class="title">declare_int</span>(<span class="params"><span class="keyword">int</span> <span class="variable">$value</span></span>) </span>&#123;</span><br><span class="line">    <span class="built_in">static</span> <span class="variable">$references</span> = [];</span><br><span class="line">    </span><br><span class="line">    <span class="variable">$valueWrapper</span> = <span class="keyword">new</span> <span class="class"><span class="keyword">class</span>(<span class="title">value</span>) </span>&#123;</span><br><span class="line">        <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">__construct</span>(<span class="params"><span class="keyword">public</span> <span class="keyword">int</span> <span class="variable">$value</span></span>) </span>&#123;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;;</span><br><span class="line">    <span class="variable">$references</span>[] = <span class="variable">$valueWrapper</span>;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">return</span> <span class="variable">$valueWrapper</span>-&gt;value;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="variable">$intVariable</span> = &amp;<span class="title function_ invoke__">declare_int</span>(<span class="number">0</span>);</span><br><span class="line"></span><br><span class="line"><span class="variable">$intVariable</span> = <span class="number">42</span>; <span class="comment">// works</span></span><br><span class="line"><span class="variable">$intVariable</span> = <span class="string">&#x27;test&#x27;</span>; <span class="comment">// fails</span></span><br></pre></td></tr></table></figure><hr><h1 id="Video"><a href="#Video" class="headerlink" title="Video"></a>Video</h1><ul><li><p><a href="https://www.youtube.com/watch?v=Dx4knBnuJaw">PHP Annotated Monthly, January</a> - 놓치신 분들을 위해 브렌트와 로만이 PHP Annotated의 동영상 버전을 제작하고 있습니다. 최신 편을 확인하시고 <a href="https://www.youtube.com/@phpannotated">PHP Annotated</a> YouTube 채널을 구독하세요.</p></li><li><p>📺 <a href="https://youtu.be/k8EzKJDlbFo">PHP와 AI를 사용하여 마크다운을 동영상으로 변환하는 변환기를 구축합니다.</a></p></li></ul><hr><h1 id="Conferences"><a href="#Conferences" class="headerlink" title="Conferences"></a>Conferences</h1><p>오프라인 이벤트가 한창 진행 중입니다. 방문하고 발표를 신청해 볼 만한 대형 PHP 행사를 확인해 보세요:</p><ul><li><a href="https://tek.phparch.com/">Php[tek]</a> – Chicago (US), May 16-18, 2023.</li><li><a href="https://2023.phpday.it/">phpday 2023</a> – Verona (Italy), May 18-19, 2023.</li><li><a href="https://phpconference.com/berlin-en/">International PHP Conference</a> – Berlin (Germany), May 22-26, 2023.</li></ul><p>다음 PHP 밋업이 언제인지 궁금하다면 Tomas Votruba의 멋진 밋업 애그리게이터 <a href="https://friendsofphp.org/">friendsofphp.org</a>에서 확인할 수 있습니다. php.net 이벤트에도 캘린더가 있습니다: <a href="https://www.php.net/cal.php">2023년 3월</a>.</p>]]></content>
    
    
      
      
        
        
    <summary type="html">&lt;p&gt;&lt;img src=&quot;https://blog.jetbrains.com/wp-content/uploads/2023/02/php-annotated-blog-featured-image-1280x600-1.png&quot; alt=&quot;PHP Annotated</summary>
        
      
    
    
    
    
    <category term="PHP" scheme="https://haah.kr/tags/PHP/"/>
    
    <category term="php-annotated" scheme="https://haah.kr/tags/php-annotated/"/>
    
    <category term="php-annotated-monthly" scheme="https://haah.kr/tags/php-annotated-monthly/"/>
    
  </entry>
  
  <entry>
    <title>PHP Annotated – January 2023</title>
    <link href="https://haah.kr/2023/01/20/php-annotated-january-2023/"/>
    <id>https://haah.kr/2023/01/20/php-annotated-january-2023/</id>
    <published>2023-01-20T12:05:55.000Z</published>
    <updated>2026-05-31T19:29:57.260Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://blog.jetbrains.com/wp-content/uploads/2023/01/php-annotated-blog-featured-image-1280x600-1.png" alt="PHP Annotated 이미지"></p><p><a href="https://blog.jetbrains.com/author/rpronskiy">Roman Pronskiy</a>가 쓰고 JetBrains에서 제공하는 PHP Annotated <a href="https://blog.jetbrains.com/phpstorm/2023/01/php-annotated-january-2023/">2023년 1월</a>의 번역&#x2F;해석본입니다.</p><p>이 중에서 몇 가지 제 취향껏 골라 그 안의 내용도 좀 뒤져보고 개발새발 번역해서 소개합니다.</p><hr><p>안녕하세요 여러분!</p><p>선별된 뉴스, 기사, 도구 및 비디오를 포함하여 지난 한 달 동안 PHP 세계에서 일어난 가장 흥미로운 일을 따라잡을 PHP Annotated 1월 기사에 오신 것을 환영합니다.</p><h1 id="News"><a href="#News" class="headerlink" title="News"></a>News</h1><h2 id="PHP-8-0-27-PHP-8-1-14-PHP-8-2-1-have-been-released"><a href="#PHP-8-0-27-PHP-8-1-14-PHP-8-2-1-have-been-released" class="headerlink" title="PHP 8.0.27, PHP 8.1.14, PHP 8.2.1 have been released"></a>PHP 8.0.27, PHP 8.1.14, PHP 8.2.1 have been released</h2><p><a href="https://www.php.net/archive/2023.php#2023-01-05-3">PHP 8.0.27</a>, <a href="https://www.php.net/archive/2023.php#2023-01-05-1">PHP 8.1.14</a>, <a href="https://www.php.net/archive/2023.php#2023-01-05-2">PHP 8.2.1</a>이 릴리스되었습니다<br>. ⚠️️ 이들은 보안 수정 릴리스입니다.</p><h2 id="What’s-Next-in-PhpStorm-The-2023-1-Public-Roadmap"><a href="#What’s-Next-in-PhpStorm-The-2023-1-Public-Roadmap" class="headerlink" title="What’s Next in PhpStorm: The 2023.1 Public Roadmap"></a>What’s Next in PhpStorm: The 2023.1 Public Roadmap</h2><p><a href="https://blog.jetbrains.com/phpstorm/2023/01/what-s-next-in-phpstorm-the-2023-1-public-roadmap/">PhpStorm의 새로운 기능: 2023.1 공개 로드맵</a></p><p>2023년 첫 번째 릴리스에서는 성능을 개선하고 더 빠른 인덱싱을 제공하고, 3v4l 통합을 추가하고, 제네릭에 대한 지원을 개선하고, PHPStan 및 Psalm 태그를 추가하고, multi-composer와 multi-vendor project에 대한 지원을 추가하는 것을 목표로 합니다.</p><h2 id="PHP-as-WebAssembly-and-WASI-modules"><a href="#PHP-as-WebAssembly-and-WASI-modules" class="headerlink" title="PHP as WebAssembly and WASI modules"></a>PHP as WebAssembly and WASI modules</h2><p>WebAssembly 및 WASI 모듈로서의 PHP.</p><p>VMware OCTO WasmLabs의 사람들은 <a href="https://wasmlabs.dev/articles/php-wasm32-wasi-port/">WASI를 사용하여 PHP를 WebAssembly로 포팅</a>하는 작업을 하고 있습니다. 이 개념은 새로운 것이 아니며 오래 전에 <a href="https://emscripten.org/">emscripten</a>을 사용하여 PHP를 WebAssembly로 컴파일할 수 있었습니다.</p><p>그러나 이제 GitHub에 바로 사용할 수 있는 컴파일된 PHP Wasm 모듈(<a href="https://github.com/vmware-labs/webassembly-language-runtimes/releases/tag/php%2F8.1.11%2B20230111-d5e8a4a">PHP 8.1</a>, <a href="https://github.com/vmware-labs/webassembly-language-runtimes/releases/tag/php%2F8.2.0%2B20230111-d5e8a4a">PHP 8.2</a>)이 있기 때문에 훨씬 더 쉬워졌습니다.</p><p>다음은 몇 가지 흥미로운 사용 사례입니다.</p><ul><li><a href="https://wasmlabs.dev/articles/php-dev-server-on-wasm/">WebAssembly 및 소켓: WasmEdge의 PHP 개발 서버</a></li><li><a href="https://wasmlabs.dev/articles/docker-without-containers/">WebAssembly를 사용하는 컨테이너가 없는 Docker</a>. 콜드 스타트 지연 없이 어디서나 실행되는 작은 컨테이너(예: PHP 서버의 경우 5MB)를 상상해 보십시오.</li></ul><p>그건 그렇고, WebAssembly로 구동되어 브라우저에서 실행되는 WP인 <a href="https://developer.wordpress.org/playground/">WordPress 놀이터</a>를 확인하십시오.</p><p>VMware의 사람들은 PHP용 패치를 준비 했으며 WebAssembly가 애플리케이션 보안 및 배포(delivery)와 관련하여 제공하는 이점을 <a href="https://bugs.python.org/issue46315">Python</a> 및 <a href="https://www.ruby-lang.org/en/news/2022/04/03/ruby-3-2-0-preview1-released/">Ruby</a>와 유사하게 PHP로 가져오는 데 매우 관심이 있다고 <a href="https://externals.io/message/119322">말했습니다</a>.</p><h1 id="PHP-Core"><a href="#PHP-Core" class="headerlink" title="PHP Core"></a>PHP Core</h1><p>Core 뉴스의 대부분은 PHP Foundation의 <a href="https://thephp.foundation/blog/tag/roundup/">PHP Core Roundup 시리즈</a>에서 자세히 다루므로 간단히 언급하겠습니다.</p><h2 id="✅-RFC-Dynamic-class-constant-fetch"><a href="#✅-RFC-Dynamic-class-constant-fetch" class="headerlink" title="✅ RFC: Dynamic class constant fetch"></a>✅ RFC: Dynamic class constant fetch</h2><p><a href="https://wiki.php.net/rfc/dynamic_class_constant_fetch">RFC: 동적 클래스 상수 가져오기</a>.</p><p>PHP 8.3은 클래스 상수를 조회하기 위한 구문을 도입합니다.</p><figure class="highlight php"><table><tr><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Foo</span> </span>&#123;</span><br><span class="line">    <span class="keyword">const</span> <span class="variable constant_">BAR</span> = <span class="string">&#x27;bar&#x27;</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="variable">$bar</span> = <span class="string">&#x27;BAR&#x27;</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">// New syntax in PHP 8.3:</span></span><br><span class="line"><span class="keyword">echo</span> <span class="title class_">Foo</span>::&#123;<span class="variable">$bar</span>&#125;;</span><br></pre></td></tr></table></figure><h2 id="✅-RFC-More-Appropriate-Date-x2F-Time-Exceptions"><a href="#✅-RFC-More-Appropriate-Date-x2F-Time-Exceptions" class="headerlink" title="✅ RFC: More Appropriate Date&#x2F;Time Exceptions"></a>✅ RFC: More Appropriate Date&#x2F;Time Exceptions</h2><p><a href="https://wiki.php.net/rfc/datetime-exceptions">RFC: 더 적절한 날짜&#x2F;시간 예외</a></p><p>PHP 8.3부터 날짜&#x2F;시간 클래스를 사용할 때 무언가 잘못되면 PHP는 더 구체적인 예외를 발생시킵니다.<br>날짜&#x2F;시간 함수의 절차적 스타일은 영향을 받지 않으며 현재와 같이 경고 및 오류를 계속 사용합니다.</p><h2 id="📊-RFC-Asymmetric-Visibility"><a href="#📊-RFC-Asymmetric-Visibility" class="headerlink" title="📊 RFC: Asymmetric Visibility"></a>📊 RFC: Asymmetric Visibility</h2><p><a href="https://wiki.php.net/rfc/asymmetric-visibility">RFC: 비대칭 가시성</a></p><p>Ilija Tovilo와 Larry Garfield는 속성이 읽기 및 쓰기 작업에 대해 별도(“비대칭”)의 가시성을 가질 수 있도록 Swift와 유사한 구문을 추가할 것을 제안했습니다.</p><figure class="highlight php"><table><tr><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Foo</span> </span>&#123;</span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">private</span>(set) <span class="keyword">string</span> <span class="variable">$bar</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>현재 투표가 느리게 진행되고 있으며 기능이 2&#x2F;3 임계값에 도달할 만큼 충분한 투표를 받지 못하고 있습니다.</p><h2 id="📣-RFC-Add-SameSite-cookie-attribute-parameter-PHP-8-3"><a href="#📣-RFC-Add-SameSite-cookie-attribute-parameter-PHP-8-3" class="headerlink" title="📣 RFC: Add SameSite cookie attribute parameter #PHP 8.3"></a>📣 RFC: Add SameSite cookie attribute parameter #PHP 8.3</h2><p><a href="https://wiki.php.net/rfc/same-site-parameter">RFC: SameSite 쿠키 속성 매개변수 추가</a> #PHP 8.3</p><p>George Peter Banyard는 모든 SameSite 관련 함수에 SameSite 매개변수를 추가할 것을 제안합니다.</p><p>SameSite 쿠키 속성에 대한 지원이 PHP 7.3에 추가되었습니다. (<a href="https://wiki.php.net/rfc/same-site-cookie">Same Site Cookie RFC</a>)</p><p>그러나 선택한 값에 “samesite” 키가 정의된 옵션 배열을 전달해야만 설정할 수 있으며 이는 다른 모든 특성과 대조됩니다.</p><p>당시 RFC에서 SameSite 매개변수를 추가하자는 제안은 만장일치로 거절되었는데, 매개변수 추가에 반대하는 주요 주장 중 하나는 함수에 이미 6개의 선택적 매개변수가 있고 SameSite 특성을 설정하려면 다른 모든 선택적 매개변수를 제공해야 한다는 것입니다. </p><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">bool setcookie ( string $name [, string $value = &quot;&quot; [, int $expire = 0 [, string $path = &quot;&quot; [, string $domain = &quot;&quot; [, bool $secure = false [, bool $httponly = false [, string $samesite = &quot;&quot; ]]]]]]] )</span><br></pre></td></tr></table></figure><ul><li>당시 거절된 스타일</li></ul><p>그러나 PHP 8.0에 명명된 인수가 도입되면서 더 이상 문제가 되지 않습니다.</p><p>이 RFC에서는 SameSite enum을 추가하고</p><figure class="highlight php"><table><tr><td class="code"><pre><span class="line"><span class="class"><span class="keyword">enum</span> <span class="title">SameSite</span> </span>&#123;</span><br><span class="line">    <span class="keyword">case</span> None;</span><br><span class="line">    <span class="keyword">case</span> Lax;</span><br><span class="line">    <span class="keyword">case</span> Strict;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><code>SameSite $sameSite = SameSite::Lax</code> parameter를 setcookie(), setrawcookie(), session_set_cookie_params()에 추가합니다.</p><h2 id="A-set-of-18-functions-x2F-changes-to-improve-PHP-core"><a href="#A-set-of-18-functions-x2F-changes-to-improve-PHP-core" class="headerlink" title="A set of 18 functions&#x2F;changes to improve PHP core"></a>A set of 18 functions&#x2F;changes to improve PHP core</h2><p>PHP 코어를 개선하기 위한 18가지 기능&#x2F;변경 세트.</p><p>Thomas Hruska는 PHP 코어용으로 설계된 삶의 질 개선 기능 세트인 <a href="https://github.com/cubiclesoft/php-ext-qolfuncs">cubiclesoft&#x2F;php-ext-qolfuncs</a>를 구현했습니다.<br>이 세트에는 꽤 깔끔한 추가 기능이 있습니다. 몇가지를 언급하자면 <code>str_splice()</code>, <code>str_realloc()</code>, <code>fread_mem()</code>, <code>is_reference()</code>, <code>refcount()</code>. 공식적인 RFC로 볼 수 있기를 희망합니다.</p><h1 id="Tools"><a href="#Tools" class="headerlink" title="Tools"></a>Tools</h1><h2 id="amphp-x2F-amp-3-0-0"><a href="#amphp-x2F-amp-3-0-0" class="headerlink" title="amphp&#x2F;amp 3.0.0"></a>amphp&#x2F;amp 3.0.0</h2><p><a href="https://github.com/amphp/amp">amphp&#x2F;amp</a> 3.0.0 – PHP 애플리케이션용 non-blocking 동시성 프레임워크가 major 업데이트 했습니다. 이제 Generators 대신 Fiber를 사용하는 코루틴을 기반으로 하며 <a href="https://github.com/revoltphp/event-loop">revoltphp&#x2F;event-loop</a>를 사용합니다.</p><p>수많은 Amphp 생태계 패키지도 업데이트되었습니다. 다음은 몇 가지 예입니다: <a href="https://github.com/amphp/pipeline">amphp&#x2F;pipeline</a> 및 <a href="https://github.com/amphp/process">amphp&#x2F;process</a>.</p><h2 id="PHP-DI-7-0"><a href="#PHP-DI-7-0" class="headerlink" title="PHP-DI 7.0"></a>PHP-DI 7.0</h2><p><a href="https://github.com/PHP-DI/PHP-DI/releases/tag/7.0.0">PHP-DI 7.0</a> – 이 종속성 주입 컨테이너 패키지에 대한 이 업데이트는 PHP 8.0+ 지원, <code>#[Inject] attribute</code>로 대체된 <code>@Inject</code> PHPDoc 주석, PSR-11 2.0 호환성 및 기타 개선 사항과 함께 제공됩니다.</p><h2 id="php-ffi-x2F-var-dumper"><a href="#php-ffi-x2F-var-dumper" class="headerlink" title="php-ffi&#x2F;var-dumper"></a>php-ffi&#x2F;var-dumper</h2><p><a href="https://github.com/php-ffi/var-dumper">php-ffi&#x2F;var-dumper</a> – 함수 dd()및 dump()로 FFI type을 dump할 수 있게 해주는 <a href="https://github.com/symfony/var-dumper">symfony&#x2F;var-dumper</a>의 래퍼.</p><h2 id="olvlvl-x2F-composer-attribute-collector"><a href="#olvlvl-x2F-composer-attribute-collector" class="headerlink" title="olvlvl&#x2F;composer-attribute-collector"></a>olvlvl&#x2F;composer-attribute-collector</h2><p><a href="https://github.com/olvlvl/composer-attribute-collector/">olvlvl&#x2F;composer-attribute-collector</a> – PHP 8 속성 대상을 검색하는 편리하고 비용이 거의 들지 않는 방법입니다.</p><h2 id="PHPCSStandards-x2F-PHPCSExtra"><a href="#PHPCSStandards-x2F-PHPCSExtra" class="headerlink" title="PHPCSStandards&#x2F;PHPCSExtra"></a>PHPCSStandards&#x2F;PHPCSExtra</h2><p><a href="https://github.com/PHPCSStandards/PHPCSExtra#sniffs">PHPCSStandards&#x2F;PHPCSExtra</a> – PHP_CodeSniffer와 함께 사용하기 위한 추가 규칙 모음입니다.</p><h2 id="cerbero90-x2F-enum"><a href="#cerbero90-x2F-enum" class="headerlink" title="cerbero90&#x2F;enum"></a>cerbero90&#x2F;enum</h2><p><a href="https://github.com/cerbero90/enum">cerbero90&#x2F;enum</a> – enum 기능을 강화하는 PHP 패키지입니다. 기본적으로 열거형에 추가하여 수많은 유용한 기능을 제공할 수 있는 특성입니다.</p><h2 id="NoiseByNorthwest-x2F-php-spx"><a href="#NoiseByNorthwest-x2F-php-spx" class="headerlink" title="NoiseByNorthwest&#x2F;php-spx"></a>NoiseByNorthwest&#x2F;php-spx</h2><p><a href="https://github.com/NoiseByNorthwest/php-spx">NoiseByNorthwest&#x2F;php-spx</a> – 웹 UI가 내장된 간단하고 직관적인 PHP 프로파일링 확장 프로그램입니다.</p><h2 id="PXP"><a href="#PXP" class="headerlink" title="PXP"></a>PXP</h2><p><a href="https://pxplang.org/">PXP</a> – 확장된 구문 및 런타임 기능을 갖춘 PHP의 상위 집합(superset) 언어입니다.</p><p><a href="https://twitter.com/ryangjchandler">Ryan Chandler</a>는 <a href="https://github.com/php-rust-tools/parser">Rust로 PHP 파서를 개발</a>하면서 시작했습니다. 이 프로젝트는 상위 집합(superset) 언어에 대한 전체 아이디어로 성장했습니다.</p><p>이전에 PHP용 상위 집합(<a href="https://github.com/marcioAlmada/yay">marcioAlmada&#x2F;yay</a> 또는 <a href="https://github.com/nunomaduro/plus-1">nunomaduro&#x2F;plus-1</a>)을 구축하려는 몇 가지 시도가 있었지만 이번 시도는 매우 유망해 보입니다.</p><p>외관상으로는 Rust에서 개발된 또 다른 유사한 시도가 있습니다:<br><a href="https://github.com/ara-lang">Ara 프로그래밍 언어</a> – PHP로 직접 컴파일되는, 정적으로 타입이 지정되는(Statically Typed) 프로그래밍 언어입니다.</p><h1 id="Symfony"><a href="#Symfony" class="headerlink" title="Symfony"></a>Symfony</h1><h2 id="POC-of-Clean-Architecture-with-Symfony-by-Stefano-Alletti"><a href="#POC-of-Clean-Architecture-with-Symfony-by-Stefano-Alletti" class="headerlink" title="POC of Clean Architecture with Symfony by Stefano Alletti."></a>POC of Clean Architecture with Symfony by Stefano Alletti.</h2><p>Stefano Alletti의 <a href="https://medium.com/@stefanoalletti_40357/poc-of-clean-architecture-with-symfony-66933548b305">Symfony를 사용한 Clean Architecture의 POC</a>.</p><h2 id="How-To-Build-Activity-Log-Using-Doctrine-Events-by-Jaroslaw-Szutkowski"><a href="#How-To-Build-Activity-Log-Using-Doctrine-Events-by-Jaroslaw-Szutkowski" class="headerlink" title="How To Build Activity Log Using Doctrine Events by Jarosław Szutkowski."></a>How To Build Activity Log Using Doctrine Events by Jarosław Szutkowski.</h2><p>Jarosław Szutkowski의 <a href="https://dev.to/jszutkowski/tracking-changes-in-doctrine-entities-8lh">Doctrine Event를 사용하여 활동 기록을 작성하는 방법</a>.</p><h2 id="Replacing-manual-API-endpoints-with-API-Platform-3-in-a-Symfony-application-by-Loic-Vernet"><a href="#Replacing-manual-API-endpoints-with-API-Platform-3-in-a-Symfony-application-by-Loic-Vernet" class="headerlink" title="Replacing manual API endpoints with API Platform 3 in a Symfony application by Loïc Vernet."></a>Replacing manual API endpoints with API Platform 3 in a Symfony application by Loïc Vernet.</h2><p>Loïc Vernet의 <a href="https://www.strangebuzz.com/en/blog/replacing-manual-api-endpoints-with-api-platform-3-in-a-symfony-application">Symfony 애플리케이션에서 수동 API 엔드포인트를 API 플랫폼 3으로 대체합니다</a>.</p><h1 id="Laravel"><a href="#Laravel" class="headerlink" title="Laravel"></a>Laravel</h1><h2 id="How-to-improve-initial-page-load-time-by-deferring-rendering-Livewire-components-by-Freek-Van-der-Herten"><a href="#How-to-improve-initial-page-load-time-by-deferring-rendering-Livewire-components-by-Freek-Van-der-Herten" class="headerlink" title="How to improve initial page load time by deferring rendering Livewire components by Freek Van der Herten."></a>How to improve initial page load time by deferring rendering Livewire components by Freek Van der Herten.</h2><p>Freek Van der Herten의 <a href="https://freek.dev/2405-how-to-improve-initial-page-load-time-by-deferring-rendering-livewire-components">Livewire 구성 요소 렌더링을 연기하여 초기 페이지 로드 시간을 개선하는 방법</a>.</p><h2 id="Standard-API-Responses-With-Laravel-Responsables-by-Wendell-Adriel"><a href="#Standard-API-Responses-With-Laravel-Responsables-by-Wendell-Adriel" class="headerlink" title="Standard API Responses With Laravel Responsables by Wendell Adriel."></a>Standard API Responses With Laravel Responsables by Wendell Adriel.</h2><p>Wendell Adriel의 <a href="https://ashallendesign.co.uk/blog/standard-api-responses-with-laravel-responsables">Laravel Responsables를 사용한 표준 API 응답</a>.</p><h2 id="Laravel-11-release-date-and-new-features-by-Benjamin-Crozat"><a href="#Laravel-11-release-date-and-new-features-by-Benjamin-Crozat" class="headerlink" title="Laravel 11: release date and new features by Benjamin Crozat."></a>Laravel 11: release date and new features by Benjamin Crozat.</h2><p>Benjamin Crozat의 <a href="https://benjamincrozat.com/laravel-11">Laravel 11: 릴리스 날짜와 새로운 기능</a>.</p><h2 id="Configuring-Laravel-Pint-by-Steve-King-McDougall"><a href="#Configuring-Laravel-Pint-by-Steve-King-McDougall" class="headerlink" title="Configuring Laravel Pint by Steve (King) McDougall."></a>Configuring Laravel Pint by Steve (King) McDougall.</h2><p>Steve (King) McDougall의 <a href="https://laravel-news.com/configuring-laravel-pint">Laravel Pint 구성</a>.</p><blockquote><p>Laravel Pint is an opinionated PHP code style fixer for minimalists</p></blockquote><h2 id="Automatic-Docblock-Generation-on-Facades-by-Paul-Redmond"><a href="#Automatic-Docblock-Generation-on-Facades-by-Paul-Redmond" class="headerlink" title="Automatic Docblock Generation on Facades by Paul Redmond."></a>Automatic Docblock Generation on Facades by Paul Redmond.</h2><p>Paul Redmond의 <a href="https://laravel-news.com/automatic-docblock-generation-on-facades">Facade에서 자동 Docblock 생성</a>.</p><h2 id="JhumanJ-x2F-OpnForm-–-Simple-and-open-source-form-builder"><a href="#JhumanJ-x2F-OpnForm-–-Simple-and-open-source-form-builder" class="headerlink" title="JhumanJ&#x2F;OpnForm – Simple and open-source form builder."></a>JhumanJ&#x2F;OpnForm – Simple and open-source form builder.</h2><p><a href="https://github.com/JhumanJ/OpnForm">JhumanJ&#x2F;OpnForm</a> – 간단한 오픈 소스 form 빌더.</p><h2 id="Laravel-Testing-Video-Course-by-Povilas-Korop-Laravel-Daily"><a href="#Laravel-Testing-Video-Course-by-Povilas-Korop-Laravel-Daily" class="headerlink" title="Laravel Testing Video Course by Povilas Korop (Laravel Daily)."></a>Laravel Testing Video Course by Povilas Korop (Laravel Daily).</h2><p>Povilas Korop(Laravel Daily)의 <a href="https://www.youtube.com/watch?v=BuDger5Ytbc&list=PLdXLsjL7A9k0esh2qNCtUMsGPLUWdLjHp&index=1">Laravel 테스트 비디오 코스</a>.</p><h1 id="기타"><a href="#기타" class="headerlink" title="기타"></a>기타</h1><h2 id="What-is-the-minimum-number-of-characters-needed-to-run-every-possible-program-in-Php"><a href="#What-is-the-minimum-number-of-characters-needed-to-run-every-possible-program-in-Php" class="headerlink" title="What is the minimum number of characters needed to run every possible program in Php?"></a>What is the minimum number of characters needed to run every possible program in Php?</h2><p>Benoit Viguier(@b_viguier)의 <a href="https://twitter.com/b_viguier/status/1610742031415902217">트윗</a></p><blockquote><p>재미있네요: (.,^’) 딱 6자 만으로 유효한 #PHP 코드 를 작성하는 새로운 트릭을 찾았습니다<br>🤯<br>예, 전혀 쓸모가 없습니다… 그래서 “재미있습니다”  😉</p><p><a href="https://b-viguier.github.io/PhpFk/">https://b-viguier.github.io/PhpFk/</a></p></blockquote><p><a href="https://b-viguier.github.io/PhpFk/">Php에서 가능한 모든 프로그램을 실행하는 데 필요한 최소 문자 수는 얼마입니까?</a></p><p>이 글에서 Benoit Viguier는 다음 6개의 문자만으로 PHP 스크립트를 실제로 생성하는 방법을 설명합니다 : <code>(.,^&#39;)</code>.</p><p>그는 그 마법을 자동화하는 도구를 만들었습니다 <a href="https://github.com/b-viguier/PhpFk">b-viguier&#x2F;PhpFk</a>.</p><p>PhpFk로 만든 “hello world”는 다음과 같습니다.</p><p><img src="https://blog.jetbrains.com/wp-content/uploads/2023/01/phpfk_hello_world.png" alt="Hello World with only 6 characters 코드"><br>최종 결과는 <a href="https://b-viguier.github.io/PhpFk/hello_world_6.html">Hello World with only 6 characters</a>.</p><p><a href="https://github.com/splitline/PHPFuck">PhpFuck</a>에서 영감을 얻어 PHP 8+에서 동작하는 6개의 문자로만 이뤄진 코드를 만들었습니다. PhpFuck에서는 <code>&#39;</code> 문자도 필요 없었지만, warning이 발생하므로 추가할 수 밖에 없었다고 하네요.</p><h2 id="PHP-in-2023-by-Brent"><a href="#PHP-in-2023-by-Brent" class="headerlink" title="PHP in 2023 by Brent."></a>PHP in 2023 by Brent.</h2><p>Brent의 <a href="https://stitcher.io/blog/php-in-2023">2023년 PHP</a>.</p><h2 id="My-PHP-enum-style-guide-by-Brent"><a href="#My-PHP-enum-style-guide-by-Brent" class="headerlink" title="My PHP enum style guide by Brent ."></a>My PHP enum style guide by Brent .</h2><p>Brent의 <a href="https://stitcher.io/blog/php-enum-style-guide">나의 PHP enum 스타일 가이드</a>.</p><h2 id="PHP-version-stats-January-2023-by-Brent-Roose"><a href="#PHP-version-stats-January-2023-by-Brent-Roose" class="headerlink" title="PHP version stats: January, 2023 by Brent Roose."></a>PHP version stats: January, 2023 by Brent Roose.</h2><p>Brent의 <a href="https://stitcher.io/blog/php-version-stats-january-2023">PHP 버전 통계: 2023년 1월</a></p><p><a href="https://packagist.org/php-statistics">클라이언트가 packagist.org로 보내는</a> 데이터(예: composer update 명령을 실행할 때)를 기반으로 사용되는 PHP 버전에 대한 정기적인 overview.</p><p>PHP 8.*은 클라이언트의 59.7%가 사용하고 있으며 PHP 7.*은 39.1%를 차지합니다. 작년에 각각 45.1%와 53.4%였던 것과 비교하면 PHP 8은 훌륭하게 성장하고 있습니다.</p><h2 id="2-6-Million-Domains-and-45-000-Exposed-Phpinfo-by-sdcat"><a href="#2-6-Million-Domains-and-45-000-Exposed-Phpinfo-by-sdcat" class="headerlink" title="2.6 Million Domains and ~45,000 Exposed Phpinfo() by sdcat."></a>2.6 Million Domains and ~45,000 Exposed Phpinfo() by sdcat.</h2><p>sdcat의 <a href="https://hackernoon.com/26-million-domains-and-45000-exposed-phpinfo-later-the-story-of-unprotected-phpinfo">260만 개의 도메인과 45,000개 이상 노출되어 있는 Phpinfo()</a>.<br>작성자는 <code>info.php</code>나 <code>phpinfo.php</code>와 같은 스크립트에 대해 2.6개의 도메인을 스캔했고 그 중 45,000개를 찾았습니다.</p><p>이 기사에서 <code>phpinfo()</code>를 노출하는 것이 위험한 이유를 알 수 있습니다.</p><h2 id="From-open-redirect-to-RCE-in-one-week-by-Anton-Hrytskevich"><a href="#From-open-redirect-to-RCE-in-one-week-by-Anton-Hrytskevich" class="headerlink" title="From open redirect to RCE in one week by Anton Hrytskevich."></a>From open redirect to RCE in one week by Anton Hrytskevich.</h2><p>Anton Hrytskevich가 <a href="https://medium.com/@byq/from-open-redirect-to-rce-in-one-week-66a7f73fd082">일주일 만에 공개 리디렉션에서 RCE로</a>.</p><h2 id="Keep-Cognitive-Complexity-Low-with-PHPStan-by-Tomas-Votruba"><a href="#Keep-Cognitive-Complexity-Low-with-PHPStan-by-Tomas-Votruba" class="headerlink" title="Keep Cognitive Complexity Low with PHPStan by Tomas Votruba."></a>Keep Cognitive Complexity Low with PHPStan by Tomas Votruba.</h2><p>Tomas Votruba의 <a href="https://tomasvotruba.com/blog/keep-cognitive-complexity-low-with-phpstan/">PHPStan으로 인지 복잡성을 낮게 유지하십시오</a>.</p><h2 id="How-to-release-PHP-8-1-and-7-2-package-in-the-Same-Repository-by-Tomas-Votruba"><a href="#How-to-release-PHP-8-1-and-7-2-package-in-the-Same-Repository-by-Tomas-Votruba" class="headerlink" title="How to release PHP 8.1 and 7.2 package in the Same Repository by Tomas Votruba."></a>How to release PHP 8.1 and 7.2 package in the Same Repository by Tomas Votruba.</h2><p>Tomas Votruba의 <a href="https://tomasvotruba.com/blog/how-to-release-php-81-and-72-package-in-the-same-repository/">동일한 저장소에서 PHP 8.1 및 7.2 패키지를 릴리스하는 방법</a>.</p><h2 id="PHP-Performance-in-2022-A-Year-in-Review-by-Benjamin-Eberlei"><a href="#PHP-Performance-in-2022-A-Year-in-Review-by-Benjamin-Eberlei" class="headerlink" title="PHP Performance in 2022: A Year in Review by Benjamin Eberlei"></a>PHP Performance in 2022: A Year in Review by Benjamin Eberlei</h2><p>Benjamin Eberlei의 <a href="https://tideways.com/profiler/blog/php-performance-in-2022-a-year-in-review">2022년의 PHP 성능 : 연례 보고서</a> – Benjamin은 PHP 8.2에서 잘 알려지지 않은 몇 가지 성능 개선 사항을 공유합니다.<br>예를 들어, PHP 8.2에서 목록 배열은 Dmitry Stogov 덕분에 훨씬 더 메모리 효율적입니다.</p><p>100k 정수의 배열 목록을 생성 하는 <a href="https://3v4l.org/EImpo">테스트 스크립트</a>는 메모리 사용량이 4,3MB에서 2,3MB로 감소했음을 보여줍니다.</p><h2 id="php-pds-x2F-composer-script-name"><a href="#php-pds-x2F-composer-script-name" class="headerlink" title="php-pds&#x2F;composer-script-name"></a>php-pds&#x2F;composer-script-name</h2><p><a href="https://github.com/php-pds/composer-script-names">php-pds&#x2F;composer-script-name</a> – 공개 리뷰에 사용할 수 있는 composer 스크립트 이름 지정에 대한 새로운 표준입니다.</p><p>Paul M. Jones는 <a href="https://github.com/php-pds/composer-script-names_research">철저한 조사</a>를 수행 했으며 PHP 생태계에서 사용할 몇 가지 스크립트 이름을 제안했습니다 . <code>test</code>, <code>test-coverage</code>, <code>test-*</code>, <code>cs-fix</code>, <code>analyze</code>, <code>check</code>.</p><h2 id="Compose-a-Developer-Environment-easily-for-PHP-with-Nix-by-Soner-Sayakci"><a href="#Compose-a-Developer-Environment-easily-for-PHP-with-Nix-by-Soner-Sayakci" class="headerlink" title="Compose a Developer Environment easily for PHP with Nix by Soner Sayakci."></a>Compose a Developer Environment easily for PHP with Nix by Soner Sayakci.</h2><p>Soner Sayakci의 <a href="https://shyim.me/blog/devenv-compose-developer-environment-for-php-with-nix/">Nix로 PHP용 개발자 환경을 쉽게 구성하십시오</a>.</p><h1 id="Video"><a href="#Video" class="headerlink" title="Video"></a>Video</h1><ul><li>📺 Matt Stauffer의 <a href="https://youtu.be/-g4No01304Q">PHP에서 Array Reduce 인터뷰 질문 풀어보기</a>.</li><li>📺 Derick Rethans의 [Xdebug 3: 디버깅 시 파일 건너뛰기](<a href="https://www.youtube.com/watch?v=FMysmRePbb8">https://www.youtube.com/watch?v=FMysmRePbb8</a>.</li><li>📺 <a href="https://www.youtube.com/watch?v=TNOGhUgY6Sc">Xdebug 3.2: PhpStorm을 사용한 반환 값 디버깅</a> – Derrick Rethans가 <a href="https://www.jetbrains.com/phpstorm/whatsnew/?_gl=1*1a3vtw*_ga*MTY2MzE5NjkwNC4xNjQ4Nzc4MjAz*_ga_9J976DJZ68*MTY3NDIxNjMwMi42Ni4xLjE2NzQyMjY5NzAuMC4wLjA.&_ga=2.211203996.885433833.1674216302-1663196904.1648778203#version-2022-3-debugging">PhpStorm 2022.3</a>에서 사용할 수 있는 새로운 기능을 선보 입니다.</li><li>📺 Brent의 <a href="https://www.youtube.com/watch?v=z0Tzb6SVwr4">PHP 8.2 로 업그레이드</a>.</li><li>Ashley Allen의 <a href="https://ashallendesign.co.uk/blog/top-youtube-channels-for-laravel-and-php-developers">Laravel 및 PHP용 상위 30개 YouTube 채널</a>.</li></ul>]]></content>
    
    
      
      
        
        
    <summary type="html">&lt;p&gt;&lt;img src=&quot;https://blog.jetbrains.com/wp-content/uploads/2023/01/php-annotated-blog-featured-image-1280x600-1.png&quot; alt=&quot;PHP Annotated</summary>
        
      
    
    
    
    
    <category term="PHP" scheme="https://haah.kr/tags/PHP/"/>
    
    <category term="php-annotated" scheme="https://haah.kr/tags/php-annotated/"/>
    
    <category term="php-annotated-monthly" scheme="https://haah.kr/tags/php-annotated-monthly/"/>
    
  </entry>
  
  <entry>
    <title>PHP Annotated – December 2022</title>
    <link href="https://haah.kr/2022/12/23/php-annotated-december-2022/"/>
    <id>https://haah.kr/2022/12/23/php-annotated-december-2022/</id>
    <published>2022-12-23T01:22:35.000Z</published>
    <updated>2026-05-31T19:29:57.259Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://blog.jetbrains.com/wp-content/uploads/2022/12/php-annotated-blog-featured-image-1280x600-1.png" alt="PHP Annotated 이미지"></p><p><a href="https://blog.jetbrains.com/author/rpronskiy">Roman Pronskiy</a>가 쓰고 JetBrains에서 제공하는 PHP Annotated <a href="https://blog.jetbrains.com/phpstorm/2022/12/php-annotated-december-2022/">2022년 12월</a>의 번역&#x2F;해석본입니다.</p><p>이 중에서 몇 가지 제 취향껏 골라 그 안의 내용도 좀 뒤져보고 개발새발 번역해서 소개합니다.</p><hr><p>안녕하세요!</p><p>PHP Annotated 12월 기사에 오신 것을 환영합니다. 선별된 뉴스, 기사, 도구 및 비디오를 포함하여 지난 한 달 동안 PHP 세계에서 일어난 가장 흥미로운 일들을 따라잡을 것입니다.</p><h1 id="News"><a href="#News" class="headerlink" title="News"></a>News</h1><h2 id="🎉-PHP-8-2-0-released"><a href="#🎉-PHP-8-2-0-released" class="headerlink" title="🎉 PHP 8.2.0 released!"></a>🎉 PHP 8.2.0 released!</h2><p><a href="https://www.php.net/archive/2022.php#2022-12-08-1">PHP 8.2.0 출시!</a></p><p>PHP 8.2는 PHP 언어의 주요(major) 업데이트입니다. 여기에는 readonly classes, DNF 유형, 독립 실행형 유형으로써의 null &#x2F; false &#x2F; true, 새로운 랜덤마이저 API(random extension) 및 trait에서의 상수를 포함한 새로운 기능이 포함되어 있습니다.</p><p>이 릴리스에는 몇 가지 지원 중단(deprecation) 사항이 포함되어 있으며, 지원 중단된 동적 속성(dynamic property)이 아마도 가장 중요할 것입니다. 평소와 같이 성능 향상도 있습니다.</p><p>PHP 8.2의 새로운 기능에 대한 자세한 목록은 <a href="https://www.php.net/releases/8.2/">릴리스 페이지</a>를 확인하세요.<br>또한 <a href="https://php.watch/articles/PHP-8.2">PHP.Watch에서 PHP 8.2 Highlights</a>와 동료 Brent 의 <a href="https://www.youtube.com/watch?v=KBcZIY_v9VQ">PHP 8.2 overview 비디오</a>를 확인하십시오.</p><p>PHP 8.2 설치&#x2F;업그레이드</p><ul><li>Windows: 컴파일된 바이너리는 <a href="https://windows.php.net/download/">windows.php.net</a>에서 받을 수 있습니다.</li><li>Ubuntu&#x2F;Debian: PHP 8.2는 ondrej&#x2F;php PPA에서 가능합니다. 자세한 <a href="https://php.watch/articles/install-php82-ubuntu-debian">설치&#x2F;업그레이드 가이드는 PHP.Watch에서 볼 수 있습니다</a>.</li><li>Fedora&#x2F;RHEL&#x2F;CentOS&#x2F;Alma&#x2F;Rocky: <a href="https://blog.remirepo.net/">Remi 저장소</a>에서 소프트웨어 컬렉션 php82로 사용 가능.</li><li>Mac OS: <a href="https://github.com/shivammathur/homebrew-php/packages">Shivammathur&#x2F;homebrew-php tap</a>으로 Homebrew를 통해 PHP 8.2를 설치할 수 있습니다.</li><li>Docker: PHP 8.2 이미지는 <a href="https://hub.docker.com/_/php/tags?page=1&name=8.2">8.2* tag로</a> <a href="https://hub.docker.com/_/php">Docker Hub</a>에서 사용할 수 있습니다.</li></ul><h2 id="⚠️-PHP-7-has-reached-end-of-life"><a href="#⚠️-PHP-7-has-reached-end-of-life" class="headerlink" title="⚠️ PHP 7 has reached end of life"></a>⚠️ PHP 7 has reached end of life</h2><p><a href="https://php.watch/news/2021/11/php7-eol">PHP 7의 수명이 다했습니다.</a></p><p><a href="https://www.php.net/archive/2022.php#2022-11-03-1">PHP 7.4.33</a>은 PHP 7의 마지막 릴리스였습니다. PHP 7은 더 이상 공식 보안 업데이트를 받지 않습니다.</p><p>그러나 RedHat 또는 Ubuntu와 같은 주요 배포판은 LTS 전제의 일부로 PHP 7.4용 보안 업데이트를 제공합니다.</p><h2 id="PHP-8-0-26-and-PHP-8-1-13-have-been-released"><a href="#PHP-8-0-26-and-PHP-8-1-13-have-been-released" class="headerlink" title="PHP 8.0.26 and PHP 8.1.13 have been released"></a>PHP 8.0.26 and PHP 8.1.13 have been released</h2><p><a href="https://www.php.net/archive/2022.php#2022-11-26-1">PHP 8.0.26</a> 및 <a href="https://www.php.net/archive/2022.php#2022-11-24-1">PHP 8.1.13</a>이 릴리스되었습니다</p><p>🐛 이들은 버그 수정 릴리스 입니다.</p><p>PHP 8.0 branch는 활성 지원(active support)을 종료했으며 보안 수정 업데이트만 받게 됩니다.</p><h2 id="🎂-PHP-Foundation-turns-1-year"><a href="#🎂-PHP-Foundation-turns-1-year" class="headerlink" title="🎂 PHP Foundation turns 1 year"></a>🎂 PHP Foundation turns 1 year</h2><p>PHP Foundation이 1년을 맞이합니다.</p><p>PHP Foundation은 <a href="https://blog.jetbrains.com/phpstorm/2021/11/the-php-foundation/">1 년 전에 설립</a>되었습니다.</p><p>지난 1년 동안 PHP 재단은 <a href="https://thephp.foundation/structure/">6명의 핵심 개발자</a>의 작업을 지원 했으며 PHP 언어에 상당한 기여를 했습니다.</p><p><a href="https://thephp.foundation/blog/2022/11/22/transparency-and-impact-report-2022/">2022년 영향 및 투명성 보고서</a>를 확인 하여 달성한 내용을 알아보고 2023년의 높은 수준의 목표를 확인하십시오.</p><p><a href="https://opencollective.com/phpfoundation">OpenCollective</a>를 통해 PHP 재단을 지원하는 것을 고려하십시오.</p><h2 id="PhpStorm-2022-3-is-out"><a href="#PhpStorm-2022-3-is-out" class="headerlink" title="PhpStorm 2022.3 is out"></a>PhpStorm 2022.3 is out</h2><p><a href="https://blog.jetbrains.com/phpstorm/2022/12/phpstorm-2022-3-whats-new/">PhpStorm 2022.3 출시</a></p><p>이 주요 업데이트는 새로운 UI 미리 보기, 완전한 PHP 8.2 지원, 데이터베이스 도구의 Redis 지원, PHP용 Code Vision, quick-fix 미리 보기, Xdebug 구성 유효성 검사, ParaTest 지원, PHPDoc용 리더 모드, 그리고 다른 많은 기능들.</p><h2 id="Symfony-6-2-is-out"><a href="#Symfony-6-2-is-out" class="headerlink" title="Symfony 6.2 is out"></a>Symfony 6.2 is out</h2><p><a href="https://symfony.com/blog/symfony-6-2-0-released">Symfony 6.2가 출시되었습니다.</a></p><p>더 나은 이모지 지원, 액세스 토큰 인증자, 내장된 Cache+Security+Template+Doctrine Attribute, 개선된 열거형(enum) 지원 등이 있습니다.</p><p>이 새로운 릴리스의 하이라이트에 대해 알아보려면 <a href="https://symfony.com/blog/symfony-6-2-curated-new-features">선별된 새 기능 목록(Curated New Features)</a>을 확인하십시오.</p><h2 id="📺-PHP-Annotated-on-YouTube"><a href="#📺-PHP-Annotated-on-YouTube" class="headerlink" title="📺 PHP Annotated on YouTube"></a>📺 PHP Annotated on YouTube</h2><p><a href="https://www.youtube.com/@phpannotated">https://www.youtube.com/@phpannotated</a></p><p>PHP Annotated가 PHP Annotated 뉴스레터 외에도 이제 YouTube에 전용 PHP Annotated 채널이 있습니다.</p><p>이 채널은 PHP와 커뮤니티에 관한 것이며 Brent Roose의 첫 번째 비디오를 확인할 수 있습니다.</p><h2 id="✅-PSR-20-Clock-accepted"><a href="#✅-PSR-20-Clock-accepted" class="headerlink" title="✅ PSR-20: Clock accepted"></a>✅ PSR-20: Clock accepted</h2><p><a href="https://www.php-fig.org/psr/psr-20/">PSR-20: Clock</a>이 accepted가 됐습니다.</p><p>PHP-FIG 그룹은 날짜 및 시간에 대해 권장되는 ClockInterface를 사용하여 PSR-20을 수락하고 태그를 지정했습니다.</p><h2 id="🎉-Psalm-5-is-out"><a href="#🎉-Psalm-5-is-out" class="headerlink" title="🎉 Psalm 5 is out"></a>🎉 Psalm 5 is out</h2><p><a href="https://psalm.dev/articles/psalm-5">Psalm 5</a>가 출시되었습니다. </p><p>이 릴리스에는 다음과 같은 몇 가지 새로운 기능이 있습니다: list{int, string, float}, properties-of, variable templates, int-range&lt;x, y&gt;.</p><h2 id="Xdebug-3-2-0-is-out"><a href="#Xdebug-3-2-0-is-out" class="headerlink" title="Xdebug 3.2.0 is out"></a>Xdebug 3.2.0 is out</h2><p><a href="https://xdebug.org/announcements/2022-12-08">Xdebug 3.2.0가 출시되었습니다.</a></p><p>이 릴리스는 PHP 8.2에 대한 지원을 추가하고 PHP 7.2-7.4에 대한 지원을 중단합니다. <a href="https://www.youtube.com/watch?v=TNOGhUgY6Sc">함수 반환 값 을 검사하는 새로운 기능</a>이 있으며 더 나은 경고 메시지가 제공됩니다.</p><h2 id="PHPStan-1-9-0-has-been-released"><a href="#PHPStan-1-9-0-has-been-released" class="headerlink" title="PHPStan 1.9.0 has been released"></a>PHPStan 1.9.0 has been released</h2><p><a href="https://phpstan.org/blog/phpstan-1-9-0-with-phpdoc-asserts-list-type">PHPStan 1.9.0이 출시되었습니다.</a></p><p>이 업데이트는 PHPDoc 어설션, 목록 유형, reference에 의해 할당된 매개변수에 대한 @param-out 태그 및 기타 개선 사항을 제공합니다.</p><h2 id="Drupal-10-is-available"><a href="#Drupal-10-is-available" class="headerlink" title="Drupal 10 is available"></a>Drupal 10 is available</h2><p><a href="https://www.drupal.org/blog/drupal-10-0-0">Drupal 10을 사용할 수 있습니다.</a> </p><p>Symfony 6.2 및 PHP 8.1 이상 필요하며 모든 시스템에서 많은 개선 사항을 추가합니다.</p><h1 id="PHP-Core"><a href="#PHP-Core" class="headerlink" title="PHP Core"></a>PHP Core</h1><p>Core 뉴스의 대부분은 PHP Foundation의 <a href="https://thephp.foundation/blog/tag/roundup/">PHP Core Roundup 시리즈</a>에서 자세히 다루므로 간단히 언급하겠습니다.</p><h2 id="📣-PHP-RFC-Dynamic-class-constant-fetch-PHP-8-3"><a href="#📣-PHP-RFC-Dynamic-class-constant-fetch-PHP-8-3" class="headerlink" title="📣 PHP RFC: Dynamic class constant fetch #PHP 8.3"></a>📣 PHP RFC: Dynamic class constant fetch #PHP 8.3</h2><p><a href="https://wiki.php.net/rfc/dynamic_class_constant_fetch">PHP RFC: 동적 클래스 상수 가져오기</a> #PHP 8.3</p><p>Ilija Tovilo는 클래스 상수를 찾기 위한 구문 도입을 제안했습니다.</p><figure class="highlight php"><table><tr><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Foo</span> </span>&#123;    </span><br><span class="line">    <span class="keyword">const</span> <span class="variable constant_">BAR</span> = <span class="string">&#x27;bar&#x27;</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="variable">$bar</span> = <span class="string">&#x27;BAR&#x27;</span>;</span><br><span class="line"> </span><br><span class="line"><span class="comment">// This is currently a syntax error</span></span><br><span class="line"><span class="keyword">echo</span> <span class="title class_">Foo</span>::&#123;<span class="variable">$bar</span>&#125;; </span><br><span class="line"> </span><br><span class="line"><span class="comment">// Instead, the `constant` function must be used</span></span><br><span class="line"><span class="keyword">echo</span> <span class="title function_ invoke__">constant</span>(<span class="title class_">Foo</span>::<span class="variable language_">class</span> . <span class="string">&#x27;::&#x27;</span> . <span class="variable">$bar</span>);</span><br></pre></td></tr></table></figure><h2 id="📣-RFC-Arbitrary-static-variable-initializers-PHP-8-3"><a href="#📣-RFC-Arbitrary-static-variable-initializers-PHP-8-3" class="headerlink" title="📣 RFC: Arbitrary static variable initializers #PHP 8.3"></a>📣 RFC: Arbitrary static variable initializers #PHP 8.3</h2><p><a href="https://wiki.php.net/rfc/arbitrary_static_variable_initializers">RFC: 임의의 정적 변수 이니셜라이저</a> #PHP 8.3</p><p>Ilija Tovilo는 정적 변수 이니셜라이저에 임의의 표현식을 포함할 수 있는 구문 확장을 제안했습니다.</p><figure class="highlight php"><table><tr><td class="code"><pre><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">bar</span>(<span class="params"></span>) </span>&#123;    </span><br><span class="line">    <span class="keyword">echo</span> <span class="string">&quot;bar() called\n&quot;</span>;</span><br><span class="line">    <span class="keyword">return</span> <span class="number">1</span>;</span><br><span class="line">&#125;</span><br><span class="line"> </span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">foo</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line">    <span class="built_in">static</span> <span class="variable">$i</span> = <span class="title function_ invoke__">bar</span>();</span><br><span class="line">    <span class="keyword">echo</span> <span class="variable">$i</span>++, <span class="string">&quot;\n&quot;</span>;</span><br><span class="line">&#125;</span><br><span class="line"> </span><br><span class="line"><span class="title function_ invoke__">foo</span>();</span><br></pre></td></tr></table></figure><h2 id="📣-RFC-Readonly-amendments-PHP-8-3"><a href="#📣-RFC-Readonly-amendments-PHP-8-3" class="headerlink" title="📣 RFC: Readonly amendments #PHP 8.3"></a>📣 RFC: Readonly amendments #PHP 8.3</h2><p><a href="https://wiki.php.net/rfc/readonly_amendments">RFC: 읽기 전용 수정안</a> #PHP 8.3</p><p>Nicolas Grekas 및 Máté Kocsis는 읽기 전용 속성 및 클래스를 개선하여 ‘읽기 전용이 아닌 클래스’가 ‘읽기 전용 클래스’를 확장할 수 있도록 하고 복제 중에 읽기 전용 속성이 다시 초기화되도록 할 것을 제안했습니다.</p><figure class="highlight php"><table><tr><td class="code"><pre><span class="line"><span class="keyword">readonly</span> <span class="class"><span class="keyword">class</span> <span class="title">Foo</span> </span>&#123;</span><br><span class="line">    <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">__construct</span>(<span class="params"></span></span></span><br><span class="line"><span class="params"><span class="function">        <span class="keyword">public</span> DateTime <span class="variable">$bar</span></span></span></span><br><span class="line"><span class="params"><span class="function">    </span>) </span>&#123;&#125;</span><br><span class="line"> </span><br><span class="line">    <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">__clone</span>(<span class="params"></span>)</span></span><br><span class="line"><span class="function">    </span>&#123;</span><br><span class="line">        <span class="variable language_">$this</span>-&gt;bar = <span class="keyword">clone</span> <span class="variable language_">$this</span>-&gt;bar;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"> </span><br><span class="line"><span class="variable">$foo</span> = <span class="keyword">new</span> <span class="title class_">Foo</span>(<span class="keyword">new</span> <span class="title class_">DateTime</span>());</span><br><span class="line"><span class="variable">$foo2</span> = <span class="keyword">clone</span> <span class="variable">$foo</span>;</span><br></pre></td></tr></table></figure><h2 id="📊-RFC-More-Appropriate-Date-x2F-Time-Exceptions-PHP-8-3"><a href="#📊-RFC-More-Appropriate-Date-x2F-Time-Exceptions-PHP-8-3" class="headerlink" title="📊 RFC: More Appropriate Date&#x2F;Time Exceptions #PHP 8.3"></a>📊 RFC: More Appropriate Date&#x2F;Time Exceptions #PHP 8.3</h2><p><a href="https://wiki.php.net/rfc/datetime-exceptions">RFC: 보다 적절한 날짜&#x2F;시간 예외</a> #PHP 8.3</p><p>Derick Rethans는 날짜&#x2F;시간 확장 관련 예외 및 오류를 도입할 것을 제안했습니다.</p><h2 id="📣-RFC-List-unique-and-Assoc-unique-PHP-8-3"><a href="#📣-RFC-List-unique-and-Assoc-unique-PHP-8-3" class="headerlink" title="📣 RFC: List\unique() and Assoc\unique() #PHP 8.3"></a>📣 RFC: List\unique() and Assoc\unique() #PHP 8.3</h2><p><a href="https://wiki.php.net/rfc/list_assoc_unique">RFC: List\unique() 와 Assoc\unique()</a> #PHP 8.3</p><p>Ilija Tovilo는 <code>array_unique()</code>에서 지원하지 않는 경우에 대해 두 가지 새로운 기능을 추가할 것을 제안했습니다.</p><figure class="highlight php"><table><tr><td class="code"><pre><span class="line">List\<span class="title function_ invoke__">unique</span>([<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">1</span>, <span class="string">&#x27;2&#x27;</span>, <span class="number">3.0</span>, <span class="keyword">new</span> <span class="title class_">Foo</span>, [<span class="string">&#x27;bar&#x27;</span>]]);</span><br><span class="line"><span class="comment">// &gt; [1, 2, 3, &#x27;2&#x27;, 3.0, Foo, [&#x27;bar&#x27;]]</span></span><br><span class="line"></span><br><span class="line">Assoc\<span class="title function_ invoke__">unique</span>([<span class="string">&#x27;foo&#x27;</span> =&gt; <span class="string">&#x27;foo&#x27;</span>, <span class="string">&#x27;bar&#x27;</span> =&gt; <span class="string">&#x27;bar&#x27;</span>, <span class="string">&#x27;baz&#x27;</span> =&gt; <span class="string">&#x27;foo&#x27;</span>]);</span><br><span class="line"><span class="comment">// &gt; [&#x27;foo&#x27; =&gt; &#x27;foo&#x27;, &#x27;bar&#x27; =&gt; &#x27;bar&#x27;]</span></span><br></pre></td></tr></table></figure><h2 id="📣-RFC-Unicode-Text-Processing-PHP-8-3"><a href="#📣-RFC-Unicode-Text-Processing-PHP-8-3" class="headerlink" title="📣 RFC: Unicode Text Processing #PHP 8.3"></a>📣 RFC: Unicode Text Processing #PHP 8.3</h2><p><a href="https://wiki.php.net/rfc/unicode_text_processing">RFC: 유니코드 텍스트 처리</a> #PHP 8.3</p><p>Derick Rethans는 유니코드 텍스트 처리의 모든 복잡성을 알 필요 없이 훨씬 개발자 친화적으로 유니코드 텍스트를 사용하고 처리할 수<br>있는 새로운 <code>Text</code> 클래스를 도입할 것을 제안합니다.</p><figure class="highlight php"><table><tr><td class="code"><pre><span class="line"><span class="variable">$content</span> = <span class="keyword">new</span> <span class="title class_">Text</span>(<span class="string">&#x27;नमस्ते दुनिया&#x27;</span>);</span><br><span class="line"><span class="keyword">if</span> (<span class="variable">$content</span>-&gt;<span class="title function_ invoke__">toLower</span>()-&gt;<span class="title function_ invoke__">startsWith</span>(<span class="string">&#x27;नमस्ते&#x27;</span>)) &#123;</span><br><span class="line">  <span class="comment">// ...</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h1 id="Tools"><a href="#Tools" class="headerlink" title="Tools"></a>Tools</h1><h2 id="phptinker"><a href="#phptinker" class="headerlink" title="@phptinker"></a>@phptinker</h2><p>Marcel Pociot는 <a href="https://github.com/phptinker">@phptinker</a>를 언급하면 GitHub issues에서 PHP 코드 블록을 평가(evaluate)하는 깔끔한 GitHub 봇을 만들었습니다.</p><p><img src="https://blog.jetbrains.com/wp-content/uploads/2022/12/phptinker.png" alt="phptinker 예시"></p><h2 id="ramsey-x2F-uuid"><a href="#ramsey-x2F-uuid" class="headerlink" title="ramsey&#x2F;uuid"></a>ramsey&#x2F;uuid</h2><p><a href="https://github.com/ramsey/uuid">ramsey&#x2F;uuid</a> – 어디에서나(universally) 고유한 식별자를 생성하기 위한 패키지의 새 버전은 UUID v8 및 사용자 지정 UUID를 지원합니다.</p><h2 id="loophp-x2F-collection"><a href="#loophp-x2F-collection" class="headerlink" title="loophp&#x2F;collection"></a>loophp&#x2F;collection</h2><p><a href="https://github.com/loophp/collection">loophp&#x2F;collection</a> – 메모리 친화적인 모듈식 컬렉션 클래스가 새로운 major 버전인 7.0.0을 출시했습니다.</p><h2 id="php-rust-tools-x2F-parser"><a href="#php-rust-tools-x2F-parser" class="headerlink" title="php-rust-tools&#x2F;parser"></a>php-rust-tools&#x2F;parser</h2><p><a href="https://github.com/php-rust-tools/parser">php-rust-tools&#x2F;parser</a> – <a href="https://twitter.com/ryangjchandler">Ryan Chandler</a>와 <a href="https://twitter.com/azjezz">Saif Eddin</a>이 Rust로 작성하며 아직 작업 중인 PHP 파서입니다.</p><p>어쩌면 당신은 언제든 순수하고 안전한 Rust를 사용하여 PHP 확장을 작성할 수 있게 해주는 도구인 <a href="https://docs.rs/phper/latest/phper/">PHPer</a>에도 관심이 있을 것 입니다.</p><h2 id="ScriptFUSION-x2F-Porter"><a href="#ScriptFUSION-x2F-Porter" class="headerlink" title="ScriptFUSION&#x2F;Porter"></a>ScriptFUSION&#x2F;Porter</h2><p><a href="https://github.com/ScriptFUSION/Porter">ScriptFUSION&#x2F;Porter</a> – 규모에 맞게 데이터를 소비하고 테스트 가능한 SDK를 배포(publishing)하기 위한 내구성 있는, 비동기식으로 데이터 가져오는 도구(importer).</p><h2 id="PHP-client-for-OpenAI"><a href="#PHP-client-for-OpenAI" class="headerlink" title="PHP client for OpenAI"></a>PHP client for OpenAI</h2><p>ChatGPT가 모든 것을 대체하고 있으므로 OpenAI용 PHP 클라이언트를 확인하고 싶을 수 있습니다.</p><ul><li><a href="https://github.com/openai-php/client">openai-php&#x2F;client</a> – OpenAI API와 상호 작용할 수 있는 강력한 PHP API 클라이언트입니다.<br><a href="https://github.com/orhanerday/open-ai">orhanerday&#x2F;open-ai</a> – OpenAI GPT-3 API에 액세스하기 위한 PHP SDK입니다.</li></ul><h2 id="qossmic-x2F-deptrac-1-0"><a href="#qossmic-x2F-deptrac-1-0" class="headerlink" title="qossmic&#x2F;deptrac 1.0"></a>qossmic&#x2F;deptrac 1.0</h2><p><a href="https://github.com/qossmic/deptrac">qossmic&#x2F;deptrac</a> 1.0 – 애플리케이션 계층 간의 종속성을 결정하기 위한 프로젝트 아키텍처 분석 도구입니다.</p><h2 id="revoltphp-x2F-event-loop-1-0-0"><a href="#revoltphp-x2F-event-loop-1-0-0" class="headerlink" title="revoltphp&#x2F;event-loop 1.0.0"></a>revoltphp&#x2F;event-loop 1.0.0</h2><p><a href="https://github.com/revoltphp/event-loop/discussions/66">revoltphp&#x2F;event-loop 1.0.0</a> – 이 이벤트 루프는 ReactPHP와 Amphp 관리자 간의 공동 노력입니다. 이제 production에서 사용할 준비가 되었으며 다양한 응용 프로그램 및 시나리오에서 테스트되었으며 fiber를 완벽하게 지원합니다.</p><h2 id="a-docker-registry-which-magically-adds-a-docker-layer-for-each-extension-requested-with-image"><a href="#a-docker-registry-which-magically-adds-a-docker-layer-for-each-extension-requested-with-image" class="headerlink" title="a docker registry, which magically adds a docker layer for each extension requested with image"></a>a docker registry, which magically adds a docker layer for each extension requested with image</h2><p>Shyim(@Shyim97)의 <a href="https://twitter.com/Shyim97/status/1598133126337024000">트윗</a></p><blockquote><p>몇 년 동안 #docker를 사용한 #PHP 확장에 짜증이 났습니다. install-php-extensions가 도움이 되지만 여전히 확장을 컴파일해야 합니다.<br>그래서 이미지로 요청된 각 확장에 대한 도커 레이어를 마술처럼 추가하는 도커 레지스트리를 구축합니다. 이것은 실험적입니다!</p></blockquote><p><img src="https://pbs.twimg.com/media/Fi2zie_WQAAfGjK?format=jpg&name=large" alt="php.shyim.de 사용 예시"></p><h2 id="rob893-x2F-emoji-cache"><a href="#rob893-x2F-emoji-cache" class="headerlink" title="rob893&#x2F;emoji-cache"></a>rob893&#x2F;emoji-cache</h2><p><a href="https://github.com/rob893/emoji-cache">rob893&#x2F;emoji-cache</a> – LRU 캐시 구현이지만 모든 식별자는 이모티콘입니다.</p><p><img src="https://blog.jetbrains.com/wp-content/uploads/2022/12/cache.png" alt="emoji-cache 사용 예시"></p><h1 id="Symfony"><a href="#Symfony" class="headerlink" title="Symfony"></a>Symfony</h1><h2 id="API-rate-liming-per-route-in-Symfony-6-1-by-Christian-Nielebock"><a href="#API-rate-liming-per-route-in-Symfony-6-1-by-Christian-Nielebock" class="headerlink" title="API rate liming per route in Symfony 6.1 by Christian Nielebock."></a>API rate liming per route in Symfony 6.1 by Christian Nielebock.</h2><p>Christian Nielebock의 <a href="https://devblog.ravetracer.de/blog/api-rate-liming-per-route-in-symfony-6-1">Symfony 6.1에서 route당 API 속도 제한</a>.</p><h2 id="Asserting-the-output-of-Symfony-console-commands-by-Andreas-Moller"><a href="#Asserting-the-output-of-Symfony-console-commands-by-Andreas-Moller" class="headerlink" title="Asserting the output of Symfony console commands by Andreas Möller."></a>Asserting the output of Symfony console commands by Andreas Möller.</h2><p>Andreas Möller의 <a href="https://localheinz.com/articles/2022/08/29/asserting-the-output-of-symfony-console-commands/">Symfony 콘솔 명령 출력 어설션</a>.</p><h2 id="Discover-Symfony-UX-components-and-enhance-your-front-end-by-Jakub-Tobiasz"><a href="#Discover-Symfony-UX-components-and-enhance-your-front-end-by-Jakub-Tobiasz" class="headerlink" title="Discover Symfony UX components and enhance your front-end by Jakub Tobiasz."></a>Discover Symfony UX components and enhance your front-end by Jakub Tobiasz.</h2><p>Jakub Tobiasz의 <a href="https://blog.alphpaca.io/discover-symfony-ux-components-and-enhance-your-front-end-ffff3a7c0177">Symfony UX 구성 요소를 살펴보고 프런트엔드를 개선하십시오</a>.</p><h2 id="Centralized-exception-handling-with-Symfony-and-custom-PHP-attributes-by-Dejan-Angelov"><a href="#Centralized-exception-handling-with-Symfony-and-custom-PHP-attributes-by-Dejan-Angelov" class="headerlink" title="Centralized exception handling with Symfony and custom PHP attributes by Dejan Angelov."></a>Centralized exception handling with Symfony and custom PHP attributes by Dejan Angelov.</h2><p>Dejan Angelov의 <a href="https://angelovdejan.me/2022/11/24/centralized-exception-handling-with-symfony-and-custom-php-attributes.html">Symfony 및 맞춤형 PHP 속성을 사용한 중앙 집중식 예외 처리</a>.</p><h1 id="Laravel"><a href="#Laravel" class="headerlink" title="Laravel"></a>Laravel</h1><h2 id="Laravel-best-practices-the-definitive-guide-for-2022-by-Benjamin-Crozat"><a href="#Laravel-best-practices-the-definitive-guide-for-2022-by-Benjamin-Crozat" class="headerlink" title="Laravel best practices: the definitive guide for 2022 by Benjamin Crozat."></a>Laravel best practices: the definitive guide for 2022 by Benjamin Crozat.</h2><p>Benjamin Crozat의 <a href="https://benjamincrozat.com/laravel-best-practices">Laravel best practices: 2022년 최종 가이드</a>.</p><p>Table of contents</p><ul><li>Keep Laravel up to date</li><li>Keep packages up to date</li><li>Keep your project tested</li><li>Stick to the default directory structure</li><li>Use custom form requests</li><li>Use single action controllers</li><li>Use policies</li><li>Prevent N+1 issues with eager loading</li><li>Use Eloquent’s strict mode</li><li>Use the new way of declaring accessors and mutators</li><li>Use anonymous migrations (Laravel 8 and above)</li><li>Use the down() method correctly</li><li>Use dispatchAfterResponse() for long-running tasks</li><li>Use queues for even longer running tasks</li><li>Lazily refresh your database</li><li>Make use of factories</li><li>Test against the production stack whenever it’s possible</li><li>Use database transactions</li><li>Don’t waste API calls, use mocks</li><li>Prevent stray HTTP requests</li><li>Don’t track your .env file</li><li>Don’t track your compiled CSS and JavaScript</li></ul><h2 id="Are-Your-Queue-Workers-…-Working-by-Jamison-Valenta"><a href="#Are-Your-Queue-Workers-…-Working-by-Jamison-Valenta" class="headerlink" title="Are Your Queue Workers … Working? by Jamison Valenta."></a>Are Your Queue Workers … Working? by Jamison Valenta.</h2><p><a href="https://tighten.com/blog/are-your-queue-workers-working/">당신의 queue worker는… 일하고 있습니까?</a></p><p>대기열이 실행 중인지 확인하기 위해 Envoyer의 heartbeats 사용.</p><h2 id="Using-Generators-for-Pagination-by-James-Bannister"><a href="#Using-Generators-for-Pagination-by-James-Bannister" class="headerlink" title="Using Generators for Pagination by James Bannister."></a>Using Generators for Pagination by James Bannister.</h2><p>James Bannister의 <a href="https://bannister.me/blog/using-generators-for-pagination">Pagination을 위한 Generator 사용</a>.</p><h2 id="Unique-jobs-and-reserving-resources-on-the-queue-by-Tim-MacDonald"><a href="#Unique-jobs-and-reserving-resources-on-the-queue-by-Tim-MacDonald" class="headerlink" title="Unique jobs and reserving resources on the queue by Tim MacDonald."></a>Unique jobs and reserving resources on the queue by Tim MacDonald.</h2><p>Tim MacDonald의 <a href="https://timacdonald.me/unique-jobs-and-reserving-resources-on-the-queue/">대기열에 있는 고유한 작업 및 예약 리소스</a>.</p><p><code>ShouldBeUnique</code>와 <code>WithoutOverlapping</code>을 활용해 큐에서의 원자적 잠금을 구현합니다.</p><h2 id="A-Look-at-What’s-Coming-to-Laravel-10-by-Paul-Redmond"><a href="#A-Look-at-What’s-Coming-to-Laravel-10-by-Paul-Redmond" class="headerlink" title="A Look at What’s Coming to Laravel 10 by Paul Redmond."></a>A Look at What’s Coming to Laravel 10 by Paul Redmond.</h2><p>Paul Redmond가 쓴 <a href="https://laravel-news.com/laravel-10">Laravel 10의 새로운 기능 살펴보기</a>.</p><h2 id="Save-1-million-queries-with-Laravel-Eager-Loading-by-Valerio-Barbera"><a href="#Save-1-million-queries-with-Laravel-Eager-Loading-by-Valerio-Barbera" class="headerlink" title="Save 1 million queries with Laravel Eager Loading by Valerio Barbera."></a>Save 1 million queries with Laravel Eager Loading by Valerio Barbera.</h2><p>Valerio Barbera의 <a href="https://inspector.dev/save-1-2-million-queries-per-day-with-laravel-eager-loading/">Laravel Eager Loading으로 하루에 백만 쿼리를 줄인 방법</a>.</p><h2 id="Rector-rule-set-for-Laravel-–-Even-if-you-don’t-use-Rector-check-out-this-link-anyway-It-has-some-interesting-refactoring-examples-diffs-for-Laravel-projects"><a href="#Rector-rule-set-for-Laravel-–-Even-if-you-don’t-use-Rector-check-out-this-link-anyway-It-has-some-interesting-refactoring-examples-diffs-for-Laravel-projects" class="headerlink" title="Rector rule set for Laravel – Even if you don’t use Rector, check out this link anyway! It has some interesting refactoring examples (diffs) for Laravel projects."></a>Rector rule set for Laravel – Even if you don’t use Rector, check out this link anyway! It has some interesting refactoring examples (diffs) for Laravel projects.</h2><p><a href="https://github.com/driftingly/rector-laravel/blob/main/docs/rector_rules_overview.md?utm_content=65392938">Laravel에 대한 Rector 규칙 세트</a> – <a href="https://github.com/rectorphp/rector">Rector</a>를 사용하지 않더라도 어쨌든 이 링크를 확인하십시오! Laravel 프로젝트에 대한 몇 가지 흥미로운 리팩토링 예제(diff)가 있습니다.</p><h1 id="이외의-프레임워크"><a href="#이외의-프레임워크" class="headerlink" title="이외의 프레임워크"></a>이외의 프레임워크</h1><ul><li><a href="https://opencollective.com/yiisoft/updates/yii-news-2022-issue-2">Yii news 2022, issue 2 by Alexander Makarov.</a></li><li><a href="https://opencollective.com/yiisoft/updates/yii3-overview-1-intro">Yii3 Overview 1. Intro.</a></li><li><a href="https://github.com/spiral/framework/releases/tag/3.3.0">Spiral 3.3.0 has been released – With a built-in OpenTelemetry support.</a></li></ul><h1 id="기타"><a href="#기타" class="headerlink" title="기타"></a>기타</h1><h2 id="24-Days-in-December"><a href="#24-Days-in-December" class="headerlink" title="24 Days in December"></a>24 Days in December</h2><p><a href="https://24daysindecember.net/">12월의 24일</a></p><p>매년 12월의 첫 24일 동안 PHP 커뮤니티 회원들이 생각을 공유합니다. 다음은 언급할 가치가 있는 몇 가지입니다.</p><ul><li>Edward Barnard의 <a href="https://24daysindecember.net/2022/12/06/evolving-php/">진화하는 PHP</a>.<ul><li>“현재 PHP 개발 속도로는 userland가 따라갈 수 없습니다. 무언가를 주어야 합니다.”<ul><li>PHP의 개발 속도가 너무 빠르고 하위 호환을 깨는 상황을 우려하고 있습니다. “PHP 7까지는 10년 분량의 레거시 코드 베이스를 유지하고 패치하여 계속 실행할 수 있습니다”</li></ul></li></ul></li><li>Ben Scheffer의 <a href="https://24daysindecember.net/2022/12/02/being-a-developer-is-not-the-same-as-knowing-how-to-code/">개발자가 된다는 것은 코딩하는 방법을 아는 것과는 다릅니다.</a></li><li>Sergey Panteleev의 <a href="https://24daysindecember.net/2022/12/07/the-php-8-2-release-managers/">PHP 8.2 릴리스 관리자</a>.<ul><li>PHP 8.2 릴리스 관리자가 누구이며 무엇을 하는지</li></ul></li><li>Nigel James의 <a href="https://24daysindecember.net/2022/12/08/an-ode-to-php/">PHP에 대한 송가</a>.</li></ul><h2 id="Generics-via-Attributes-in-PHP-by-Roman-Pronskiy"><a href="#Generics-via-Attributes-in-PHP-by-Roman-Pronskiy" class="headerlink" title="Generics via Attributes in PHP by Roman Pronskiy."></a>Generics via Attributes in PHP by Roman Pronskiy.</h2><p>Roman Pronskiy의 <a href="https://pronskiy.com/blog/generics-via-attributes-in-php/">PHP에서 Attribute를 통한 제네릭</a>.</p><p>PHP에서 제네릭을 검토했던 과정과 논의 내용을 소개하고 아래와 같은 방식으로 Attribute를 활용한 제네릭을 사용하는 것은 어떤지 질문합니다.</p><figure class="highlight php"><table><tr><td class="code"><pre><span class="line"><span class="comment">#[&lt;T&gt;]</span></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Stack</span></span></span><br><span class="line"><span class="class"></span>&#123;</span><br><span class="line">    <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">push</span>(<span class="params">#[&lt;T&gt;] <span class="keyword">mixed</span> <span class="variable">$item</span></span>): <span class="title">void</span></span></span><br><span class="line"><span class="function">    </span>&#123;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">pop</span>(<span class="params"></span>): #[&lt;<span class="title">T</span>&gt;] <span class="title">mixed</span></span></span><br><span class="line"><span class="function">    </span>&#123;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="From-annotations-to-attributes-by-Gregoire-Paris"><a href="#From-annotations-to-attributes-by-Gregoire-Paris" class="headerlink" title="From annotations to attributes by Grégoire Paris."></a>From annotations to attributes by Grégoire Paris.</h2><p>Grégoire Paris의 <a href="https://www.doctrine-project.org/2022/11/04/annotations-to-attributes.html">annotation에서 attributes까지</a>.</p><p>Doctrine project에서 ORM의 테스트를 annotation 방식에서 attribute 방식으로 변경한 과정을 설명합니다.<br>Rector를 통해 쉽게 변환됐고(2개의 오류만 발견), 변경점은 <a href="https://github.com/doctrine/orm/commit/bbdbfb807c325121f38a4f325c3d00a6d338cee5">Run Rector라는 커밋</a>으로 확인해보실 수 있습니다.</p><h2 id="How-to-Measure-Your-Type-Coverage-by-Tomas-Votruba"><a href="#How-to-Measure-Your-Type-Coverage-by-Tomas-Votruba" class="headerlink" title="How to Measure Your Type Coverage by Tomas Votruba."></a>How to Measure Your Type Coverage by Tomas Votruba.</h2><p>Tomas Votruba 의 <a href="https://tomasvotruba.com/blog/how-to-measure-your-type-coverage/">Type Coverage를 측정하는 방법</a>.</p><h2 id="A-story-of-Lazy-Loading-File-System-Operations-for-better-dev-system-performance-by-Benjamin-Eberlei"><a href="#A-story-of-Lazy-Loading-File-System-Operations-for-better-dev-system-performance-by-Benjamin-Eberlei" class="headerlink" title="A story of Lazy Loading File System Operations for better dev system performance by Benjamin Eberlei."></a>A story of Lazy Loading File System Operations for better dev system performance by Benjamin Eberlei.</h2><p>Benjamin Eberlei의 <a href="https://tideways.com/profiler/blog/a-story-of-lazy-loading-file-system-operations-for-better-dev-system-performance">더 나은 개발 시스템 성능을 위한 레이지 로딩 파일 시스템 작업에 대한 이야기</a>.</p><h1 id="Video"><a href="#Video" class="headerlink" title="Video"></a>Video</h1><h2 id="📺-Writing-declarative-PHP-by-Andrew-Schmelyun"><a href="#📺-Writing-declarative-PHP-by-Andrew-Schmelyun" class="headerlink" title="📺 Writing declarative PHP by Andrew Schmelyun."></a>📺 Writing declarative PHP by Andrew Schmelyun.</h2><p>Andrew Schmelyun의 <a href="https://youtu.be/-K8u_3-KCvU">선언적 PHP 작성</a>.</p><h2 id="📺-What’s-New-in-PHP-8-2-by-MergePHP"><a href="#📺-What’s-New-in-PHP-8-2-by-MergePHP" class="headerlink" title="📺 What’s New in PHP 8.2 by MergePHP."></a>📺 What’s New in PHP 8.2 by MergePHP.</h2><p>MergePHP가 제공 하는 <a href="https://www.youtube.com/live/ceEy8i-zGQI">PHP 8.2의 새로운 기능</a>.</p><h2 id="📺-Guido-van-Rossum-creator-of-Python-and-Lex-Fridman-discuss-the-sign-in-PHP-variable-names"><a href="#📺-Guido-van-Rossum-creator-of-Python-and-Lex-Fridman-discuss-the-sign-in-PHP-variable-names" class="headerlink" title="📺 Guido van Rossum (creator of Python) and Lex Fridman discuss the $ sign in PHP variable names"></a>📺 Guido van Rossum (creator of Python) and Lex Fridman discuss the $ sign in PHP variable names</h2><p>Guido van Rossum(Python 창시자)과 Lex Fridman이 PHP 변수 이름의 $ 기호에 대해 논의합니다: <a href="https://www.youtube.com/watch?v=ovkW3AxzOWc">Lex Fridman on PHP 프로그래밍</a>.</p><h1 id="Conferences"><a href="#Conferences" class="headerlink" title="Conferences"></a>Conferences</h1><ul><li><a href="https://laracon.eu/">Laracon EU</a> – Lisbon (Portugal), January 26–27, 2023.</li><li><a href="https://www.phpconference.co.uk/">PHP UK Conference</a> – London (UK), February 14–16, 2023.</li><li><a href="https://tek.phparch.com/">Php[tek]</a> – Chicago (US), May 16–18, 2023.</li><li><a href="https://laracon.us/">Laracon US</a> – Nashville, TN, July 19–20, 2023.</li></ul><hr><p>해피 홀리데이, PHPers! 🎄🐘</p>]]></content>
    
    
      
      
        
        
    <summary type="html">&lt;p&gt;&lt;img src=&quot;https://blog.jetbrains.com/wp-content/uploads/2022/12/php-annotated-blog-featured-image-1280x600-1.png&quot; alt=&quot;PHP Annotated</summary>
        
      
    
    
    
    
    <category term="PHP" scheme="https://haah.kr/tags/PHP/"/>
    
    <category term="php-annotated" scheme="https://haah.kr/tags/php-annotated/"/>
    
    <category term="php-annotated-monthly" scheme="https://haah.kr/tags/php-annotated-monthly/"/>
    
  </entry>
  
  <entry>
    <title>식은땀이 흐르는 Redis 서버 교체기 2편</title>
    <link href="https://haah.kr/2022/12/02/handling-redis-connections-2/"/>
    <id>https://haah.kr/2022/12/02/handling-redis-connections-2/</id>
    <published>2022-12-02T13:00:00.000Z</published>
    <updated>2026-05-31T19:29:57.257Z</updated>
    
    <content type="html"><![CDATA[<p>목차</p><ul><li>낡은 캐시 서버를 교체하라</li><li>섣부른 서버 교체, 죄송합니다</li><li>ElastiCache의 지표들을 이해해봅니다</li><li><strong>애플리케이션 서버에서 문제를 찾아봅시다</strong></li><li><strong>살려야 한다</strong></li><li><strong>살려는 드렸는데…</strong></li><li><strong>마무리</strong></li><li><strong>부록 : 도입하는 과정에서 알게 된 잡다한 지식</strong></li></ul><p><a href="/2022/12/02/handling-redis-connections-1/">“식은땀이 흐르는 Redis 서버 교체기 1편”</a>에서 이어지는 글입니다.</p><p>이전 글에서는 섣부르게 Redis 서버를 교체하면서 장애를 맞았던 경험을 공유하고, 놓치고 있던 지표를 정확히 이해하기 위해 찾아본 문서를 소개했습니다.</p><p>각종 지표를 통해 신규 커넥션의 수 혹은 많은 커넥션 자체가 Redis 서버의 CPU 사용량을 늘리고, 이것이 장애로까지 이어졌을 거라고 분석했습니다.<br>이번 글에서는 Redis 서버에 부하를 줄이기 위한 여러 가지 시도와 앞으로 더 시도해볼 만한 방법을 공유합니다.</p><h1 id="애플리케이션-서버에서-문제를-찾아봅시다"><a href="#애플리케이션-서버에서-문제를-찾아봅시다" class="headerlink" title="애플리케이션 서버에서 문제를 찾아봅시다"></a>애플리케이션 서버에서 문제를 찾아봅시다</h1><h2 id="persistent-connection"><a href="#persistent-connection" class="headerlink" title="persistent connection"></a>persistent connection</h2><p>1차 시도 때 기존 사용하던 서버가 교체된 후 애플리케이션에서의 요청이 사라졌음에도, 현재 연결(CurrConnections) 지표는 줄어들지 않고 그대로 유지되는 것이 마음에 걸렸습니다.</p><p><img src="/images/handling-redis-connections/old-redis-metric-of-first-try.png" alt="첫 번째 시도에서의 Redis 지표 이미지"></p><ul><li>애플리케이션 서버로부터 연결이 들어오지 않아 수신&#x2F;송신 네트워크가 줄어들고 캐시 된 아이템(현재 항목)은 하나씩 만료돼가는 모습</li><li>좌 하단의 현재 연결 지표는 거의 줄어들지 않았습니다</li></ul><p>찾아보니 비슷한 경험  <a href="https://stackoverflow.com/questions/28573529/the-current-connections-count-keeps-increasing-in-my-elasticache-redis-node">stackoverflow</a>에도 올라와 있었습니다.</p><p>여기서 언급된 <a href="https://redis.io/docs/reference/clients/">Redis 문서</a>에서 <code>Client Timeouts</code> 부분을 보시면 Redis에서는 원래 연결을 끊지 않는 것으로 보입니다.</p><blockquote><p>By default recent versions of Redis don’t close the connection with the client if the client is idle for many seconds: the connection will remain open forever.</p></blockquote><p>그동안 커넥션 수가 늘어남에 따라 문제가 발생하지 않았을까 강한 의심을 하고 있었기 때문에 커넥션을 줄일 방법을 좀 더 찾아보기로 했습니다.</p><p>위 Redis 문서에 나온 것처럼 timeout 설정도 그 방안 중 하나인데, Amazon ElastiCache for Redis는 CLI로 수정이 되지 않고 <a href="https://docs.aws.amazon.com/ko_kr/AmazonElastiCache/latest/red-ug/ParameterGroups.Management.html">파라미터 그룹을 생성해서 적용</a>해야 합니다.</p><p>동료 중 한 분은 <a href="https://github.com/predis/predis/wiki/Connection-Parameters">persistent 옵션</a>을 사용해보는 건 어떨지 제안을 주셨는데</p><ul><li>참고 : <a href="https://stackoverflow.com/questions/3614948/is-there-any-php-redis-client-support-persistent-connection">https://stackoverflow.com/questions/3614948/is-there-any-php-redis-client-support-persistent-connection</a></li></ul><p>파라미터로 쉽게 적용 가능하고, 여러 서버군 중에 일부만 환경변수로 쉽게 제어도 할 수 있었으므로 timeout 설정보다 먼저 시도해보기로 했습니다. </p><p>Redis 설정에 <code>&#39;persistent&#39; =&gt; 1,</code> 한 줄만 추가하면 됩니다.</p><figure class="highlight php"><table><tr><td class="code"><pre><span class="line"><span class="string">&#x27;redis&#x27;</span> =&gt; [</span><br><span class="line">    <span class="string">&#x27;client&#x27;</span> =&gt; <span class="string">&#x27;predis&#x27;</span>,</span><br><span class="line">    <span class="string">&#x27;default&#x27;</span> =&gt; [</span><br><span class="line">        <span class="string">&#x27;scheme&#x27;</span> =&gt; <span class="title function_ invoke__">env</span>(<span class="string">&#x27;REDIS_SCHEME&#x27;</span>, <span class="string">&#x27;tcp&#x27;</span>),</span><br><span class="line">        ...</span><br><span class="line">        <span class="string">&#x27;persistent&#x27;</span> =&gt; <span class="title function_ invoke__">env</span>(<span class="string">&#x27;REDIS_PERSISTENT&#x27;</span>, <span class="number">0</span>),</span><br><span class="line">    ],</span><br><span class="line">],</span><br></pre></td></tr></table></figure><p>한번의 request 안에서의 연결은 재사용되는지 궁금했습니다.</p><figure class="highlight php"><table><tr><td class="code"><pre><span class="line"><span class="comment">// 코드는 중요하지 않음. 한번의 put과 여러번의 get을 호출하는 상황</span></span><br><span class="line"><span class="keyword">for</span> (<span class="variable">$i</span> = <span class="number">0</span>; <span class="variable">$i</span> &lt; <span class="number">4</span>; <span class="variable">$i</span>++) &#123;</span><br><span class="line">    <span class="variable">$time</span> = <span class="title function_ invoke__">microtime</span>(<span class="literal">true</span>);</span><br><span class="line">    <span class="title class_">Cache</span>::<span class="title function_ invoke__">put</span>(<span class="string">&#x27;test.&#x27;</span> . <span class="variable">$time</span>, <span class="variable">$time</span>, <span class="number">1</span>);</span><br><span class="line">    <span class="title class_">Cache</span>::<span class="title function_ invoke__">get</span>(<span class="string">&#x27;test.&#x27;</span> . <span class="variable">$time</span>);</span><br><span class="line">    <span class="title class_">Cache</span>::<span class="title function_ invoke__">get</span>(<span class="string">&#x27;test.&#x27;</span> . <span class="variable">$time</span>);</span><br><span class="line">    <span class="title class_">Cache</span>::<span class="title function_ invoke__">get</span>(<span class="string">&#x27;test.&#x27;</span> . <span class="variable">$time</span>);</span><br><span class="line">    <span class="title class_">Cache</span>::<span class="title function_ invoke__">get</span>(<span class="string">&#x27;test.&#x27;</span> . <span class="variable">$time</span>);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>연속으로 5회 request 시도해봤을 때는 신규 connection이 하나만 생성되는 걸 확인했고, 아래와 같이 동시에 여러 번 쏴본 테스트에서도 개선 효과가 뚜렷했습니다.</p><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">ab -n 50 -c 10 https://test_url</span><br></pre></td></tr></table></figure><ul><li>PERSISTENT&#x3D;1 -&gt; 신규 커넥션 15</li><li>PERSISTENT&#x3D;0 -&gt; 신규 커넥션 50</li></ul><p>5일에 걸쳐 영향 범위가 적은 서버부터 차례로 적용해보았습니다. 아래는 마지막 트래픽이 많은 서버군에 적용된 후의 모습인데, Current&#x2F;New connection 지표는 예상대로 바뀌었습니다.</p><p><img src="/images/handling-redis-connections/after-applying-persistent-option.png" alt="persistent 옵션 적용 후 Redis 지표 이미지"></p><ul><li>신규 커넥션이 줄었기 때문에 CPUUtilization이 낮아진 건 예상했지만 EngineCPUutilization 수치도 상당 부분 내려간 것이 의외였습니다.</li><li>여기에는 보이지 않지만, 애플리케이션 서버 자체의 CPU 지표에는 큰 변화가 없었습니다. 다만 애플리케이션 서버 쪽 ELB Latency는 소폭(약 10ms) 낮아진 것도 확인할 수 있었습니다.</li></ul><h2 id="애플리케이션-서버-스펙을-올리기"><a href="#애플리케이션-서버-스펙을-올리기" class="headerlink" title="애플리케이션 서버 스펙을 올리기"></a>애플리케이션 서버 스펙을 올리기</h2><p>커넥션을 물고 있는 애플리케이션이 조금 더 빠르게 처리되고 끝날 수 있게 애플리케이션 서버의 스펙을 두 배로 올리는 실험도 해보았습니다.<br>Pod의 CPU request를 두 배로 늘려주니 Pod 수는 절반 이하로 줄었고, Current connections가 약 10%가량 줄어들었습니다.<br>New connection에서는 체감할 만한 변화는 없었습니다.</p><h2 id="애플리케이션에서-문제-찾기"><a href="#애플리케이션에서-문제-찾기" class="headerlink" title="애플리케이션에서 문제 찾기"></a>애플리케이션에서 문제 찾기</h2><p>코드에서는 잘못된 사용 패턴이 없는지도 점검했습니다.<br>7년 이상 된 서비스라, 과거엔 성능에 거의 영향을 주지 않던 코드가 시스템에 큰 충격을 주는 경우를 종종 만나게 됩니다.</p><h3 id="has-get-x2F-has-del-패턴-없애기"><a href="#has-get-x2F-has-del-패턴-없애기" class="headerlink" title="has-get &#x2F; has-del 패턴 없애기"></a>has-get &#x2F; has-del 패턴 없애기</h3><p>New Relic에서 확인했을 때 Redis를 활용하는 사용량 기준 상위권에 속하는 코드에서 불필요하게 한 번 더 쿼리하는 패턴을 발견합니다.<br>‘캐시가 존재하면 가져온다’, ‘캐시가 존재하면 지운다’와 같은 패턴입니다.</p><figure class="highlight php"><table><tr><td class="code"><pre><span class="line"><span class="keyword">if</span> (<span class="variable language_">$this</span>-&gt;cache-&gt;<span class="title function_ invoke__">has</span>(<span class="variable">$cacheKey</span>)) &#123;</span><br><span class="line">    <span class="variable">$cached</span> = <span class="variable language_">$this</span>-&gt;cache-&gt;<span class="title function_ invoke__">get</span>(<span class="variable">$cacheKey</span>);</span><br><span class="line">    <span class="comment">//do something</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>Laravel의 cache repository의 구현체를 보니<br>vendor&#x2F;laravel&#x2F;framework&#x2F;src&#x2F;Illuminate&#x2F;Cache&#x2F;Repository.php:68</p><figure class="highlight php"><table><tr><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">has</span>(<span class="params"><span class="variable">$key</span></span>)</span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="keyword">return</span> ! <span class="title function_ invoke__">is_null</span>(<span class="variable">$this</span>-&gt;<span class="title function_ invoke__">get</span>(<span class="variable">$key</span>));</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>get을 시도한 후 null 체크만 하면 되는 것이었습니다.</p><figure class="highlight php"><table><tr><td class="code"><pre><span class="line"><span class="keyword">if</span> (<span class="variable">$cached</span> = <span class="variable language_">$this</span>-&gt;cache-&gt;<span class="title function_ invoke__">get</span>(<span class="variable">$cacheKey</span>)) &#123;    </span><br><span class="line">    <span class="comment">//do something</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="client에서-polling-줄이기"><a href="#client에서-polling-줄이기" class="headerlink" title="client에서 polling 줄이기"></a>client에서 polling 줄이기</h3><p>서비스를 시작한 후로 많은 세월이 흘러, 클라이언트에서 polling 하는 API가 하나둘 씩 늘어나게 되었습니다.<br>매 polling마다 Redis를 활용한 체크 로직이 많았는데, polling 하는 데이터의 성격상 한번에 쿼리해도 되거나 push로 대체할 수 있는 것들이 보였습니다. 해당 API를 담당하시는 분들이 이 부분도 빠르게 개선해주셨습니다.</p><h2 id="phpredis"><a href="#phpredis" class="headerlink" title="phpredis"></a>phpredis</h2><p>C로 작성된 PHP extension인 PhpRedis는 pure PHP인 Predis 보다 성능 면에서 월등한 것으로 나타납니다.<br>벤치마크 참고 : <a href="https://akalongman.medium.com/phpredis-vs-predis-comparison-on-real-production-data-a819b48cbadb">https://akalongman.medium.com/phpredis-vs-predis-comparison-on-real-production-data-a819b48cbadb</a></p><p>Laravel 6.x 버전부터는 문서에서 phpredis를 predis보다 먼저 소개합니다.<br><a href="https://laravel.com/docs/6.x/redis">https://laravel.com/docs/6.x/redis</a></p><blockquote><p>we encourage you to install and use the PhpRedis PHP extension via PECL</p></blockquote><p>phpredis로 전환하기 위해선 아래 블로그를 참고하시면 됩니다.<br><a href="https://www.lesstif.com/dbms/php-phpredis-redis-23757275.html">https://www.lesstif.com/dbms/php-phpredis-redis-23757275.html</a></p><p>그런데 phpredis가 설치된 이미지를 빌드해서 서버를 띄워봤지만, 연결이 되지 않았습니다.<br>일단 특수한 상황으로 보이긴 했는데요.</p><p><a href="https://bugs.php.net/bug.php?id=79501">https://bugs.php.net/bug.php?id=79501</a><br>2022년에 올라온 PHP 버그 리포트에서도 비슷한 문제를 발견했는데, PHP 7.4 버전에서 TLS 1.3을 사용할 때 유독 문제가 발생한다는 것이었습니다.</p><p><a href="https://github.com/phpredis/phpredis/issues/1881">https://github.com/phpredis/phpredis/issues/1881</a><br>phpredis에 관한 이야기지만 PHP와 Linux 둘 중 하나에 버그가 있는 게 아니냐는 논의이고,<br>마지막에 보면 커넥션을 수없이 열고 닫는 과정에서 발생하는 것 같고 레디스 사용을 줄이면서 오류도 줄였다는 내용도 보입니다.</p><p>PHP 8.0 버전에서는 문제없는지 정도만 빠르게 확인해봤습니다.<br>PHP 8.0 + 라라벨 기본 애플리케이션으로 서비스를 올리고 테스트해 보니 잘 연결이 되는 걸 확인했습니다.</p><p>어쩌면 PHP 7.4 + TLS + 아이디&#x2F;비번으로 연결하는 경우만 그럴 수도 있어서 더 찾아보면 방법이 있을 수도 있는데, 그 노력을 아껴서 다른 곳에 쓰기로 했습니다. 곧 PHP 8버전대로 올릴 때 자연스레 PhpRedis로 이전할 수 있을 것 같았습니다.<br>(버전업이란 게 항상 그렇듯 아직 진행은 안 되고 있는데 말이죠..)</p><h1 id="살려야-한다"><a href="#살려야-한다" class="headerlink" title="살려야 한다"></a>살려야 한다</h1><p>이미 간이 콩알만 해진 관계로 한 번에 여러 가지를 시도하지 않고, 단계별로 진행해 볼 계획을 세웠습니다.</p><ol><li>6.2 버전의 신규 Redis 서버를 RBAC 인증도 가능하고 현재처럼 특별히 인증 없이 default user로 접근할 수도 있게 설정</li><li>default 유저를 사용해 서비스에 투입<ul><li>이때 cache.m5.4xlarge(16vCPU)로 좀 더 과감하게 스케일업</li></ul></li><li>이후 RBAC 적용하고</li><li>이후 default 인증 제거</li></ol><p>배포 전 미리 두 가지 인증 방식으로 연결이 잘 되는지 확인해봤습니다.<br>TLS 연결 설정은 나중에 변경하기 어려운 상황이어서 default 유저에 TLS 연결로 우선 적용해보기로 했습니다.</p><h2 id="상용-환경-투입"><a href="#상용-환경-투입" class="headerlink" title="상용 환경 투입"></a>상용 환경 투입</h2><p><img src="/images/handling-redis-connections/redis-metric-of-third-try-1.png" alt="세 번째 도전 시 Redis 지표 이미지 1"></p><p><img src="/images/handling-redis-connections/redis-metric-of-third-try-2.png" alt="세 번째 도전 시 Redis 지표 이미지 2"></p><ul><li>TLS 연결 + Redis 인스턴스 타입 교체 + default 인증<ul><li>cache.m5.xlarge(4vCPU) -&gt; cache.m5.4xlarge(16vCPU)</li></ul></li><li>예상대로 EngineCPUutilization 지표(파란색)가 높아졌고, 16코어의 큰 인스턴스를 쓰기 때문에 CPUUtilization 지표는 참고만 하고 예민하게 보지 않기로 했습니다.</li></ul><p>RBAC은 조심스럽게 적용했는데, 여러 서버군을 사용량과 적고 영향 범위를 기준으로 5가지로 나누고, 서비스에 영향이 적은 서버들부터 5일에 걸쳐 적용했습니다. 아래는 마지막으로 적용한 이후의 그래프인데, AUTH 커맨드의 추가 실행이 필요하므로 예상대로 EngineCPUutilization가 올라갔지만, 서버는 안정적으로 유지되고 있습니다.</p><p><img src="/images/handling-redis-connections/redis-metric-after-rbac.png" alt="RBAC 적용 후 Redis 지표 이미지 1"></p><p>그리고 일주일 후, default 인증을 제거하면서 최종 마무리가 됐습니다.</p><h1 id="살려는-드렸는데…"><a href="#살려는-드렸는데…" class="headerlink" title="살려는 드렸는데…"></a>살려는 드렸는데…</h1><p>마지막에 꽤 큰 인스턴스 타입으로 바꾸었기 때문에, 이제 비용을 줄이기 위해선 더 낮은 사양으로 낮춰보거나 현재 사양이 적정하다는 것을 확인해야 하는데, 추가 개선안으로 적용해볼 것이 아직 많이 남아 고민 중에 있습니다.</p><h2 id="read-connection"><a href="#read-connection" class="headerlink" title="read connection"></a>read connection</h2><p>replica를 더 두고 reader endpoint를 사용해서 읽기 연결을 분산하는 방법입니다. 현재의 replica는 장애 대비로만 존재하기 때문에 읽기 전용 연결을 하려면 replica를 추가해야 할 것입니다.</p><p>그런데 Reader endpoint를 바라보는 커넥션을 별도로 두고, 읽기만 발생하는 곳에서 명시적으로 읽기 커넥션을 지정해야 하는데, 사용성이 좋지 않고 검토하고 수정할 범위가 넓어서 당시엔 배제하였습니다.</p><h2 id="캐시-서버를-분리"><a href="#캐시-서버를-분리" class="headerlink" title="캐시 서버를 분리"></a>캐시 서버를 분리</h2><p>전체 애플리케이션이 레디스 클러스터 하나에 붙어 운영하다 보니 그만큼 레디스 서버 스펙도 높아질 수밖에 없는 구조입니다.<br>하위 서비스별로 각자 사용할 캐시를 분리하면 위험을 분산하고 성능을 높일 수 있습니다. 혹은 세션 등 공통으로 사용할 만한 부분부터 분리해나가는 것도 고려해볼 만합니다.</p><h2 id="경계-확인하기"><a href="#경계-확인하기" class="headerlink" title="경계 확인하기"></a>경계 확인하기</h2><p>현재의 Redis 스펙으로 얼마나 버틸 수 있는지 확인해봐야 합니다.<br>현재는 EngineCPUutilization 지표가 피크 기준 30% 선을 유지하지만, 몇 % 정도 더 오르면 다시 교체하거나 최적화를 고민해야 할지 정해놔야 합니다.</p><h2 id="Istio"><a href="#Istio" class="headerlink" title="Istio"></a>Istio</h2><p>제가 커넥션 문제로 고민하고 있을 때, 10년 전 같이 일했던 선배 개발자들과 이야기를 나눴었습니다. Redis는 아니었지만 캐시를 많이 사용하던 서비스였고, 그때도 커넥션 관리에 문제가 많아서 커넥션 풀을 제공하는 중간 서버를 하나 두었었다는 이야기를 들었습니다.</p><p>직접 만드는 것도 방법이겠지만, Envoy Proxy라는 솔루션을 활용할 수도 있습니다. Istio가 제공하는 수많은 기능 중에서도 proxy나 서킷 브레이커가 특히 유용할 것으로 보이는데, 애플리케이션을 수정하지 않고도 쉽게 붙일 수 있다는 점에서 긍정적으로 도입을 검토해볼 만합니다.</p><p>reddit에서의 답변<br><a href="https://www.reddit.com/r/PHP/comments/sikoux/are_persistent_connections_to_mysqlredis_good/">https://www.reddit.com/r/PHP/comments/sikoux/are_persistent_connections_to_mysqlredis_good/</a></p><ul><li>envoy proxy를 sidecar로 붙여서 활용하는 방법 : “앱은 추상 유닉스 소켓을 사용하여 envoy에 연결하고 envoy 자체는 연결을 지속적으로 다시 만들 필요가 없도록 일정 시간 동안 연결을 유지합니다.”</li></ul><p>Envoy를 사용하여 PHP Redis 클라이언트 성능을 개선하는 방법<br><a href="https://angelbear.github.io/blogs/2021/07/envoyfilter-improve-php-redis-client/">https://angelbear.github.io/blogs/2021/07/envoyfilter-improve-php-redis-client/</a></p><ul><li>주의할 점으로<ul><li>중간자가 존재하므로 개별 읽기&#x2F;쓰기 성능은 낮아짐 -&gt; 전체 성능은 올라감</li><li>너무 많은 ESTABLISHED 연결 -&gt; 너무 많으면 새로운 연결에 문제가 생길 수 있음</li><li>timeout 설정으로 커넥션이 너무 오래 지속되지 않도록 처리 필요</li></ul></li></ul><h2 id="cachewerk-x2F-relay"><a href="#cachewerk-x2F-relay" class="headerlink" title="cachewerk&#x2F;relay"></a>cachewerk&#x2F;relay</h2><p><a href="https://github.com/cachewerk/relay">https://github.com/cachewerk/relay</a></p><p>아직 안정화는 안 됐지만, 검색 결과를 in-memory cache에 저장해서 캐시 요청을 줄이는데 활용할 수 있음.</p><h2 id="더-읽어보기"><a href="#더-읽어보기" class="headerlink" title="더 읽어보기"></a>더 읽어보기</h2><p><a href="https://aws.amazon.com/ko/blogs/database/best-practices-redis-clients-and-amazon-elasticache-for-redis/">Best practices: Redis clients and Amazon ElastiCache for Redis</a></p><ul><li>복제본에서 읽기 &#x2F; 쓰기 분산</li><li>Lettuce, Python에서의 연결 pool 구성</li><li>클러스터 모드일 때 해볼 만한 팁<br>등이 포함되어 있습니다</li></ul><h1 id="마무리"><a href="#마무리" class="headerlink" title="마무리"></a>마무리</h1><p>오래전 글이지만, 이 작업 이후 다시 읽고 새롭게 다가왔던 문장을 소개하며 마칩니다.</p><p>Richard Cook의 <a href="https://news.hada.io/topic?id=3476">How Complex System Fail 사례</a></p><blockquote><ol start="10"><li>모든 실무자의 행동은 도박이다.<br>장애 이후에 실패는 종종 피할 수 없는 것처럼 보이며, 실무자의 행동은 실수로 보인다. 그러나 모든 실무자의 행동은 실제로 도박, 즉 불확실한 결과에 직면하여 발생하는 행동이다. 불활실성의 정도는 변할 수 있다. 실무자의 행동이 도박이라는 사실은 장애 이후에 알게된다. 일반적으로 사후 분석에서는 이러한 도박을 빈약한 도박으로 간주한다. 그러나 성공적인 결과 또한 도박의 결과이기도 하다.</li></ol></blockquote><p>1차, 2차 그리고 안정적으로 유지하게 된 최종 적용 과정에서도 많은 도박 요소가 있었습니다.<br>그것이 도박이었다는 것을 뼈저리게 느끼게 해 준 시간이었고, 오랜 시간 쌓인 기술 부채를 도박으로 탕감하려는 시도를 했구나 싶었습니다.</p><p>마지막 시도 과정에서는 심지어 이런 일도 있었습니다.<br>Pod의 CPU request를 두 배로 늘려주는 과정에서 CPU 기준의 AutoScaling이 동작했는데, 그때가 8시 반쯤 트래픽이 적을 때여서 minimum pod 수만 남기고 모두 삭제되었습니다.<br>9시 정각, 모 업체에서 오픈런 이벤트로 많은 요청을 보내기 시작했습니다. 웹서버의 절대적 수가 부족한 상황에서 갑자기 커다란 트래픽을 맞아 휘청했죠. ‘좋은 하드웨어로 갈아주는데 설마 무슨 문제가 있겠어?’라고 안일하게 생각했다가 다시 한방 크게 먹었습니다.<br>하지만 이 날 무사히 넘어갔어도 언젠가 누군가 (누구의 탓인지 모른 채) 같은 문제는 겪었을 것입니다.</p><p>위에 소개드린 “How Complex System Fail”을 요약한 GeekNews의 글만 읽어보고는 잘 알지도 못하면서 너무 쉽게 선택한 스스로를 반성했습니다. 그건 그것대로 반성할 만 하지만,</p><p>원문을 읽어보니 도박이라서 안 좋다는 걸 강조하는 것보다는, 복잡한 시스템에서의 선택은 불확실성을 내포하는 도박과 같다는 의미로 읽혔습니다.<br>장애의 원인과 해결책을 너무 쉽게 판단하는 것 역시 경계해야 할 일이라고.<br>(사실 원문이나 링크된 강의 동영상에서의 문장이 너무 어려워서 잘 이해했는지 모르겠어요)</p><p>내가 맡은 서비스가 복잡한 시스템은 맞는 건가 의문도 들지만, 많은 노하우를 쌓을 수 있었던 경험이었습니다.</p><p>위 Richard Cook의 글의 마지막 항목을 읽어볼까요?</p><blockquote><ol start="18"><li>실패없는 작업에는 실패 경험이 필요하다.<br>… 중략 … 오류와 긴밀한 접촉이 필요합니다. 운영자가 시스템의 한계를 식별할 수 있는 시스템에서 보다 강력한 시스템 성능이 발생할 수 있습니다.</li></ol></blockquote><p>마지막 시도에서 cache.m5.xlarge에서 cache.m5.4xlarge로 과감하게 올렸지만, cache.m5.2xlarge로는 버틸 수 없었을까 미련이 남기도 합니다. AUTH 커맨드가 추가되고 TLS 연결을 위한 추가로 필요한 성능이 넉넉잡아 각각 2배로 필요하다고 가정하면, 최초 cache.m5.large에서 4배로 성능을 높인 cache.m5.2xlarge로도 운용 가능하지 않을까 생각도 듭니다.<br>현재는 피크에 30%까지만 올라가고 있어서 여유는 있습니다. 당장 무리하게 내릴 생각은 없는데, 문제가 생기기 시작하는 경계를 확인하지 못해서 그만큼의 불안함을 비용으로 지불하고 있구나 생각이 들었습니다.</p><h1 id="부록-도입하는-과정에서-알게-된-잡다한-지식"><a href="#부록-도입하는-과정에서-알게-된-잡다한-지식" class="headerlink" title="부록 : 도입하는 과정에서 알게 된 잡다한 지식"></a>부록 : 도입하는 과정에서 알게 된 잡다한 지식</h1><h2 id="SLOWLOG"><a href="#SLOWLOG" class="headerlink" title="SLOWLOG"></a>SLOWLOG</h2><p>Redis에는 <a href="https://redis.io/commands/slowlog">SLOWLOG</a> 커맨드가 있습니다.<br>오랜 시간 수행되는 쿼리는 없는지 확인 해볼 수 있습니다. 이번 커넥션 오류와 관련해서도 체크해보았지만, 특별히 느린 커맨드가 보이진 않았습니다.</p><p>SLOWLOG 확인 예시:</p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">레디스호스트:6379&gt; SLOWLOG LEN</span><br><span class="line">(<span class="built_in">integer</span>) 128</span><br><span class="line">레디스호스트:6379&gt; SLOWLOG GET 2</span><br><span class="line">1) 1) (<span class="built_in">integer</span>) 1134</span><br><span class="line">   2) (<span class="built_in">integer</span>) 1669848600</span><br><span class="line">   3) (<span class="built_in">integer</span>) 10910</span><br><span class="line">   4) 1) <span class="string">&quot;GET&quot;</span></span><br><span class="line">      2) <span class="string">&quot;loadClientByClientId::ebf29050-1184-4d3e-a057-fe7a13b86be5&quot;</span></span><br><span class="line">   5) <span class="string">&quot;10.160.33.73:42436&quot;</span></span><br><span class="line">   6) <span class="string">&quot;&quot;</span></span><br><span class="line">2) 1) (<span class="built_in">integer</span>) 1133</span><br><span class="line">   2) (<span class="built_in">integer</span>) 1669842000</span><br><span class="line">   3) (<span class="built_in">integer</span>) 16057</span><br><span class="line">   4) 1) <span class="string">&quot;INFO&quot;</span></span><br><span class="line">      2) <span class="string">&quot;server&quot;</span></span><br><span class="line">   5) <span class="string">&quot;10.160.33.73:40684&quot;</span></span><br><span class="line">   6) <span class="string">&quot;&quot;</span></span><br></pre></td></tr></table></figure><h2 id="Laravel-JWT-Token-Blacklist"><a href="#Laravel-JWT-Token-Blacklist" class="headerlink" title="Laravel JWT Token Blacklist"></a>Laravel JWT Token Blacklist</h2><p>서비스에 일시 들어갔다 나온 서버에 무작정 접근해서 문제가 될 만한 데이터가 있는지도 확인해봤습니다.</p><p><img src="/images/handling-redis-connections/laravel-caches.png" alt="laravel로 시작하는 다수의 캐시 목록"></p><p>위 캡쳐와 같이 laravel:로 시작하고 valid_until 정도의 값만 갖고 있는 데이터가 다수 있는 걸 확인했습니다. JWT-auth에서 사용되는 것 같다는 동료의 조언에 따라 뭔가 짚이는 게 있어 실험을 해봤습니다.</p><p><img src="/images/handling-redis-connections/cache-list-after-logout-test.png" alt="로그아웃 테스트 이후의 캐시 목록"></p><p>이 캡쳐는 로컬 레디스에서 데이터를 깨끗하게 지운 후, 클라이언트에서 로그인&#x2F;로그아웃을 세 번 정도 한 결과인데요.<br>로그아웃을 할 때마다 해당 토큰을 blacklist에 <code>영원히(ttl:-1)</code> 저장합니다.</p><p><code>laravel:629ef98ae36a3133817307:standard_ref</code> 이런 식의 키인데, 값은 만료된 키를 저장하고 있죠.</p><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">[</span><br><span class="line">&quot;laravel:00a8bf31198fd179db62cf828b57299c427eafed:31VvhJ7qURid7ymg&quot;, &quot;laravel:00a8bf31198fd179db62cf828b57299c427eafed:FfIgHkNo02Y0Aayv&quot;, &quot;laravel:00a8bf31198fd179db62cf828b57299c427eafed:NNJGoZqX9ldAdFBU&quot;</span><br><span class="line">]</span><br></pre></td></tr></table></figure><p>현재는 이런 데이터가 영원히 늘어나기만 하는 구조입니다.</p><ul><li>관련 코드는 \Tymon\JWTAuth\Manager::invalidate() 참조</li></ul><p>비활성화된 토큰으로 인증을 통과하지 못하게 막는 건 중요합니다. 그러나 발행된 모든 토큰을 영원히 저장하는 것도 효율적이지 않으므로 한번 모두 삭제하기로 했습니다. 캐시라면 언제든 초기화될 수 있는 데이터라고 생각하고 운용하는 것이 좋다고 생각하기도 하고요. 누군가 마침 만료된 토큰을 구해서 접근할 경우 보안에 구멍이 생기기도 하겠죠. 완벽한 방법은 아니지만, 저희 애플리케이션에서는 강제 만료 시간을 설정할 수 있게 해 놓고, 이보다 이전에 발행된 토큰은 사용할 수 없게 보완하였습니다.</p><h2 id="Redis-6-0-default-user-버그"><a href="#Redis-6-0-default-user-버그" class="headerlink" title="Redis 6.0 default user 버그"></a>Redis 6.0 default user 버그</h2><p>옆 팀에선 Redis 6.0 버전 때문에 개발 환경에서 장애가 발생한 적이 있었습니다.</p><p>default user를 사용하지 못하게 권한을 조정하는 작업 중이었는데, Redis 6.0 버전에선 default user에 권한이 없을 때 HELLO 커맨드가 실패하는 버그가 있었습니다.</p><ul><li><a href="https://github.com/redis/redis/issues/8558">https://github.com/redis/redis/issues/8558</a> 참고</li></ul><p>이는 6.2.2 버전부터 <a href="https://github.com/redis/redis/pull/8817">해결</a> 됐습니다.</p><p>&lt; 끝 &gt;</p>]]></content>
    
    
      
      
        
        
    <summary type="html">&lt;p&gt;목차&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;낡은 캐시 서버를 교체하라&lt;/li&gt;
&lt;li&gt;섣부른 서버 교체, 죄송합니다&lt;/li&gt;
&lt;li&gt;ElastiCache의 지표들을 이해해봅니다&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;애플리케이션 서버에서 문제를</summary>
        
      
    
    
    
    
    <category term="Laravel" scheme="https://haah.kr/tags/Laravel/"/>
    
    <category term="PHP" scheme="https://haah.kr/tags/PHP/"/>
    
    <category term="Redis" scheme="https://haah.kr/tags/Redis/"/>
    
  </entry>
  
  <entry>
    <title>식은땀이 흐르는 Redis 서버 교체기 1편</title>
    <link href="https://haah.kr/2022/12/02/handling-redis-connections-1/"/>
    <id>https://haah.kr/2022/12/02/handling-redis-connections-1/</id>
    <published>2022-12-02T11:00:00.000Z</published>
    <updated>2026-05-31T19:29:57.257Z</updated>
    
    <content type="html"><![CDATA[<p><em>올여름 Redis 서버 교체 과정에서 여러 번의 장애를 겪은 후 뼈에 새기는 반성문입니다.</em></p><p>목차</p><ul><li><strong>낡은 캐시 서버를 교체하라</strong></li><li><strong>섣부른 서버 교체, 죄송합니다</strong></li><li><strong>ElastiCache의 지표들을 이해해봅니다</strong></li><li>애플리케이션 서버에서 문제를 찾아봅시다</li><li>살려야 한다</li><li>살려는 드렸는데…</li><li>마무리</li><li>부록 : 도입하는 과정에서 알게 된 잡다한 지식</li></ul><h1 id="낡은-캐시-서버를-교체하라"><a href="#낡은-캐시-서버를-교체하라" class="headerlink" title="낡은 캐시 서버를 교체하라"></a>낡은 캐시 서버를 교체하라</h1><p>오랜 시간 큰 문제 없이 사용하던 Redis 서버가 있었습니다.</p><p>TLS 연결도 없이 default user를 사용했는데, Laravel 애플리케이션의 database.php 파일 설정은 이렇게 간단했죠.</p><figure class="highlight php"><table><tr><td class="code"><pre><span class="line">...</span><br><span class="line">    <span class="string">&#x27;redis&#x27;</span> =&gt; [</span><br><span class="line">        <span class="string">&#x27;client&#x27;</span> =&gt; <span class="string">&#x27;predis&#x27;</span>,</span><br><span class="line">        <span class="string">&#x27;default&#x27;</span> =&gt; [</span><br><span class="line">            <span class="string">&#x27;host&#x27;</span> =&gt; <span class="title function_ invoke__">env</span>(<span class="string">&#x27;REDIS_HOST&#x27;</span>, <span class="string">&#x27;127.0.0.1&#x27;</span>),</span><br><span class="line">            <span class="string">&#x27;port&#x27;</span> =&gt; <span class="title function_ invoke__">env</span>(<span class="string">&#x27;REDIS_PORT&#x27;</span>, <span class="number">6379</span>),</span><br><span class="line">            <span class="string">&#x27;database&#x27;</span> =&gt; <span class="number">0</span>,</span><br><span class="line">        ],</span><br><span class="line">    ],</span><br><span class="line">...</span><br></pre></td></tr></table></figure><p>보안취약점 개선 작업을 준비하던 과정에서 EOL 소식도 들었습니다(<a href="https://docs.aws.amazon.com/ko_kr/AmazonElastiCache/latest/red-ug/deprecated-engine-versions.html">Redis 버전의 수명 종료 일정</a> 참고).</p><p><img src="/images/handling-redis-connections/redis-eol-warning.png" alt="redis eol warning 이미지"></p><p>개선하는 김에 버전도 Redis 6.2 이상으로 올리고<br>default user를 사용하는 대신 최신 버전에서 지원하는 역할 기반 액세스 제어(RBAC)를 사용한 사용자 인증,<br>여기에 TLS 연결까지 적용하기로 했어요.</p><h1 id="섣부른-서버-교체-죄송합니다"><a href="#섣부른-서버-교체-죄송합니다" class="headerlink" title="섣부른 서버 교체, 죄송합니다"></a>섣부른 서버 교체, 죄송합니다</h1><p>이제 조금 더 복잡해진 설정.</p><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">&#x27;redis&#x27; =&gt; [</span><br><span class="line">    &#x27;client&#x27; =&gt; &#x27;predis&#x27;,</span><br><span class="line">    &#x27;default&#x27; =&gt; [</span><br><span class="line">        &#x27;scheme&#x27; =&gt; env(&#x27;REDIS_SCHEME&#x27;, &#x27;tcp&#x27;),</span><br><span class="line">        &#x27;ssl&#x27; =&gt; [&#x27;verify_peer&#x27; =&gt; env(&#x27;REDIS_VERIFY_PEER&#x27;, true)],</span><br><span class="line">        &#x27;host&#x27; =&gt; env(&#x27;REDIS_HOST&#x27;, &#x27;127.0.0.1&#x27;),</span><br><span class="line">        &#x27;username&#x27; =&gt; env(&#x27;REDIS_USERNAME&#x27;, null),</span><br><span class="line">        &#x27;password&#x27; =&gt; env(&#x27;REDIS_PASSWORD&#x27;, null),</span><br><span class="line">        &#x27;port&#x27; =&gt; env(&#x27;REDIS_PORT&#x27;, 6379),</span><br><span class="line">        &#x27;database&#x27; =&gt; env(&#x27;REDIS_DATABASE&#x27;, 0),</span><br><span class="line">    ],</span><br><span class="line">],</span><br></pre></td></tr></table></figure><p>테스트 환경과 트래픽이 낮은 다른 서비스에 미리 도입해서 잘 동작하는 것은 확인했습니다.</p><p>연결 테스트:</p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line"><span class="comment"># openssl 설치</span></span><br><span class="line">apt-get update;apt-get install -y openssl;</span><br><span class="line"> </span><br><span class="line"><span class="comment"># 서버 연결</span></span><br><span class="line">openssl s_client --connect 신규레디스호스트명:6379</span><br><span class="line"> </span><br><span class="line"><span class="comment"># 인증</span></span><br><span class="line">AUTH &lt;username&gt; &lt;password&gt;</span><br></pre></td></tr></table></figure><p>애플리케이션 테스트 by tinker</p><figure class="highlight php"><table><tr><td class="code"><pre><span class="line">Psy Shell v0.<span class="number">9.12</span> (PHP <span class="number">7.4</span>.<span class="number">33</span> — cli) by Justin Hileman</span><br><span class="line">&gt;&gt;&gt; <span class="title function_ invoke__">config</span>(<span class="string">&#x27;database.redis&#x27;</span>);</span><br><span class="line">=&gt; [</span><br><span class="line">      ...</span><br><span class="line">   ]</span><br><span class="line">&gt;&gt;&gt; <span class="title class_">Cache</span>::<span class="title function_ invoke__">put</span>(<span class="string">&#x27;test&#x27;</span>, <span class="string">&#x27;testval&#x27;</span>, <span class="number">1</span>); <span class="title class_">Cache</span>::<span class="title function_ invoke__">get</span>(<span class="string">&#x27;test&#x27;</span>);</span><br><span class="line">=&gt; <span class="string">&quot;testval&quot;</span></span><br></pre></td></tr></table></figure><h2 id="1차-시도"><a href="#1차-시도" class="headerlink" title="1차 시도"></a>1차 시도</h2><p>오전 8시경 트래픽이 비교적 많은 서비스에 넣어봤습니다.</p><p>저희 서비스는 식당이 주 고객이라서 매장 오픈 시간부터 트래픽이 몰리는데, 특히 11시부터 2시까지를 오전 피크로 보고 있습니다.<br>AWS에서 운영 중인 API 서버군의 ELB Latency 지표는 일반적으로 130ms ~ 150ms 사이를 유지하고 있습니다.</p><p>여기서 ELB Latency란, “로드 밸런서가 등록된 인스턴스에 요청을 보낸 시간부터 인스턴스가 응답 헤더를 보내기 시작할 때까지 경과된 총시간(초)”을 의미합니다. (<a href="https://docs.aws.amazon.com/ko_kr/elasticloadbalancing/latest/classic/elb-cloudwatch-metrics.html">elb-cloudwatch-metrics</a> 문서 참고)</p><p>그런데 오전 11시를 넘어서며 ELB Latency가 급격히 오르기 시작합니다.</p><p><img src="/images/handling-redis-connections/elb-latency-average-peak.png" alt="elb latency가 오르는 모습 이미지"></p><p>지표를 확인한 순간 바로 롤백을 진행했지만 5분에서 10분 정도의 장애가 발생했습니다.</p><p>바로 AWS Premium Support에 case를 열어 어떤 일이 있었는지 문의를 해봤고,<br>내부 툴로 확인한 결과라며 답변을 주셨는데, 요약하면 이렇습니다.</p><p>서비스 투입되고 일정 시간 동안의 지표를 비교해본 결과</p><ul><li>신 Redis로 교체 시<ul><li>CPUUtilization: 15% -&gt; 60% , EngineCPUutiliaztoin: 22% -&gt; 99% , Total Cmds: 기존 대비 거의 두 배로 증가</li><li>HitRate는 투입 후 2시간에 걸쳐 0%에서 51%까지 상승</li></ul></li><li>다시 구 Redis로 교체 시<ul><li>CPUUtilization: 15% ~ 17% , EngineCPUutiliaztoin: 16% -&gt; 18% , Total Cmds: 20% 증가</li></ul></li></ul><p>추가로 아래와 같이 제안도 주셨습니다.</p><ul><li>가장 데이터가 적은 시간대에 Redis 교체를 고려</li><li>기존 Redis의 데이터를 백업 후 Restore 하여 6.2 버젼의 Redis를 시작(캐쉬데이터의 TTL 이 너무 짧지 않으면)</li><li>기존(cache.m5.large)보다 큰사이즈(cache.m5.xlarge 또는 그 이상)로 시작하였다가, 추후 Online scaling down을 통하여 크기를 줄이는 방법</li></ul><p>아마도 RBAC을 적용하면 AUTH 명령을 추가로 실행하기 때문에 전체 커맨드 수가 많이 증가했을 것이고, 캐시가 비어 있는 새로운 서버를 띄우면서 HitRate가 지나치게 낮은 것이 문제가 됐을 거라고 판단했습니다.</p><h2 id="2차-시도"><a href="#2차-시도" class="headerlink" title="2차 시도"></a>2차 시도</h2><p>기존 cache.m5.large(2vCPU)에서 cache.m5.xlarge(4vCPU)로 인스턴스 타입을 올렸습니다.<br>교체 전 스냅샷을 생성하고(10분 이내), 스냅샷으로부터 신규 Redis 서버를 생성했습니다(30분 이내)</p><p>이번에는 엔진 지표도 함께 볼 수 있게 모니터링 대시보드를 설정했습니다. </p><p><img src="/images/handling-redis-connections/EngineCPUUtilization-of-first-try.png" alt="EngineCPUUtilization 추가된 1차 시도의 Redis 지표 이미지"></p><ul><li>1차 장애 당시 신규 투입된 서버의 CPUUtilization, EngineCPUUtilization 지표</li><li>당시에는 EngineCPUUtilization를 보고 있지 않아서 100%까지 치고 올라가는 상황을 인지하지 못했었습니다.</li><li>그림에서 레디스 서버가 두 대인 것을 확인할 수 있는데, 두 대가 클러스터로 묶여(<a href="https://docs.aws.amazon.com/ko_kr/AmazonElastiCache/latest/red-ug/Clusters.html">cluster mode</a> 아님 주의) 한대가 장애가 날 경우를 대비하고 있습니다. 애플리케이션은 primary node만 바라보고 있습니다.</li></ul><p>교체 시작!</p><p><img src="/images/handling-redis-connections/redis-metric-of-second-try.png" alt="두번째 시도에서의 Redis 지표 이미지"></p><ul><li>Redis는 어쩐지 안정적인 것 같았습니다.</li></ul><p>하지만 애플리케이션 서버 쪽 ELB Latency 지표는 200ms를 넘어가고 있었고, New Relic에서 확인한 연결 지연 시간(아래 그래프)이 심상치 않아 다시 롤백을 결정했습니다.</p><p><img src="/images/handling-redis-connections/new-relic-redis-query-time-of-second-try.png" alt="New Relic에서 바라 본 두번째 시도에서의 Redis query 시간 이미지"></p><p>두 번의 실패 이후, 많은 반성을 하면서 ‘나는 뭘 모르고 있는지’ 찬찬히 돌아보기로 했습니다.</p><h1 id="ElastiCache의-지표들을-이해해봅니다"><a href="#ElastiCache의-지표들을-이해해봅니다" class="headerlink" title="ElastiCache의 지표들을 이해해봅니다"></a>ElastiCache의 지표들을 이해해봅니다</h1><h2 id="EngineCPUUtilization"><a href="#EngineCPUUtilization" class="headerlink" title="EngineCPUUtilization"></a>EngineCPUUtilization</h2><p>기존 사용하던 Redis 서버와 새로 띄운 서버는 몇 가지 지표에서 차이가 나긴 했지만, 모두 AWS <a href="https://docs.aws.amazon.com/ko_kr/AmazonElastiCache/latest/red-ug/CacheMetrics.Redis.html">Redis 지표</a> 페이지에서 권고하는 수준 안에 있었습니다.</p><p>이 문제를 해결하기 위해 CPUUtilization와 EngineCPUUtilization는 물론이고, connection 관련 지표에 집중해서 모니터링하기로 했습니다.</p><p>첫 번째 장애 때의 그래프를 다시 가져와 봅니다. </p><p><img src="/images/handling-redis-connections/EngineCPUUtilization-of-first-try.png" alt="EngineCPUUtilization 추가된 1차 시도의 Redis 지표 이미지"></p><p>CPUUtilization은 EngineCPUUtilization보다 낮았습니다.</p><p>CPUUtilization은 Redis 엔진(EngineCPUUtilization으로 표현)의 동작에 백그라운드 프로세스의 비용도 포함하기 때문에 이 값이 EngineCPUUtilization보다 낮은 게 이상하다고 생각했습니다.</p><p>Amazon ElastiCache for Redis 사용 설명서 &gt; <a href="https://docs.aws.amazon.com/ko_kr/AmazonElastiCache/latest/red-ug/CacheMetrics.WhichShouldIMonitor.html">어떤 지표를 모니터링해야 합니까?</a> 문서를 보면, vCPU를 고려해서 알림 기준을 세워야 한다고 나와 있습니다.</p><blockquote><p>일반적으로, 사용 가능한 CPU의 90%로 임계값을 설정하는 것이 좋습니다. Redis는 단일 스레드이기 때문에 실제 임계값은 노드 총 용량의 일부로 계산해야 합니다. 2개의 코어가 있는 노드 유형을 사용하는 경우를 예로 들어보겠습니다. 이 경우 CPUUtilization의 임계값은 90&#x2F;2 또는 45%입니다.</p></blockquote><p>당시 인스턴스 타입이 cache.m5.large였기 때문에 vCPU는 2개입니다.<br>위 그래프에서 CPUUtilization이 15% -&gt; 60% 올라가는 것을 봤다면, 실제로는 30% ~ 100%구나라고 인지했어야 한다는 말입니다.</p><p>Amazon ElastiCache for Redis 사용 설명서 &gt; <a href="https://docs.aws.amazon.com/ko_kr/AmazonElastiCache/latest/red-ug/CacheMetrics.Redis.html">Redis 지표</a>에서의 설명에도 vCPU 2개까지의 소규모 호스트에선 CPUUtilization으로 보는 것이 더 낫다고 하는군요.</p><blockquote><p>Redis 엔진 스레드의 CPU 사용률을 제공합니다. Redis는 단일 스레드이므로 이 지표를 사용하여 Redis 프로세스 자체의 로드를 분석할 수 있습니다. EngineCPUUtilization 지표는 Redis 프로세스에 대한 보다 정확한 정보를 제공합니다. 이 지표를 CPUUtilization 지표와 함께 사용할 수 있습니다. CPUUtilization은 다른 운영 체제 및 관리 프로세스를 포함하여 전체적인 서버 인스턴스의 CPU 사용률을 표시합니다. 4개 이상의 vCPU를 포함하는 대규모 노드 유형에는 EngineCPUUtilization 지표를 사용하여 조정 임계값을 모니터링하고 설정하세요.</p></blockquote><blockquote><p>ElastiCache 호스트에서는 백그라운드 프로세스가 관리형 데이터베이스 환경을 제공하기 위해 호스트를 모니터링합니다. 이러한 백그라운드 프로세스는 CPU 워크로드의 상당 부분을 차지할 수 있습니다. vCPU가 2개 이상(2를 초과하는)인 대규모 호스트에서는 이 점이 중요하지 않습니다. 하지만 vCPU가 2개 이하인 소규모 호스트에 영향을 줄 수 있습니다. EngineCPUUtilization 지표만 모니터링하는 경우 호스트가 Redis의 높은 CPU 사용률과 백그라운드 모니터링 프로세스의 높은 CPU 사용률로 오버로드되는 상황을 인식하지 못합니다. 따라서 vCPU가 2개 이하인 호스트의 CPUUtilization 지표를 모니터링하는 것이 좋습니다.</p></blockquote><p>이 내용은 Amazon ElastiCache for Redis 사용 설명서 &gt; <a href="https://docs.aws.amazon.com/ko_kr/AmazonElastiCache/latest/red-ug/TroubleshootingConnections.html">문제 해결</a>(Troubleshooting) 문서에서도 언급됩니다.</p><blockquote><p>CPU 사용량: Redis는 다중 스레드 애플리케이션입니다. 그러나 각 명령의 실행은 단일(주) 스레드에서 발생합니다. 이러한 이유로 ElastiCache는 CPUUtilization 및 EngineCPUUtilization 지표를 제공합니다. EngineCPUUtilization은 Redis 프로세스 전용 CPU 사용률을 제공하고 CPUUtilization은 모든 vCPU에 대한 사용량을 제공합니다. 두 개 이상의 vCPU가 있는 노드는 대개 CPUUtilization 및 EngineCPUUtilization의 값이 서로 다르며, 일반적으로 두 번째 값이 더 큽니다.</p></blockquote><p>여기서 일반적으로 두번째 값이 더 크다고 했는데, 두번째 Redis 서버 교체 당시의 지표를 다시 가져와 볼까요?</p><p><img src="/images/handling-redis-connections/redis-metric-of-second-try.png" alt="두번째 시도에서의 Redis 지표 이미지"></p><p>이때는 EngineCPUUtilization 지표가 계속 낮았습니다. 이 현상에 대해 AWS 측에 문의를 해봤는데,</p><blockquote><p>CPUUtilization &#x3D; Redis 사용 CPU(EngineCPUUtilization) + others (Redis 외 프로세스) 사용 CPU로 이해하면 될 듯합니다.<br>즉, 해당 시점에는 Redis 서비스보다 others 서비스(예를 들면, 스냅샷으로 생성 이후 스토리지 최적화를 위한 작업 ?)에 CPU가 쓰이고 있었다고 봐야 할 거 같습니다.<br>문서에서 일반적으로 EngineCPUUtilization이 높다는 것은 해당 서버가 Redis 용이니까 일반적으로 그렇다는 의미로 보입니다. </p></blockquote><p>화면에서 보이는 CPUUtilization 지표의 피크는 35%이고 이때도 일시 연결 오류가 발생했습니다. 그렇다면 어느 시점에 위험하다고 판단해야 했을까요?</p><p>이 당시 서버는 cache.m5.xlarge(4vCPU)이기 때문에, CPUUtilization 지표의 임계값을 90&#x2F;4 즉, 20% 선으로 설정하고 20%가 넘으면 위험하다고 판단했어야 했을지도 모릅니다. AWS 측의 답변도,</p><blockquote><p>네 , CPUUtilization 을 기준으로 본다면 22.5 % 를 임계값으로 계산해 볼 수 있겠습니다. Redis 가 단일 Thread 로 처리되므로 단일 CPU Core 가 90% 이상 사용되지 않는 것을 임계값으로 보라는 의미로 이해됩니다.<br>단, 4vCPU 이상의 대규모 노드 유형에는 Redis 엔진 코어 대한 사용률을 보고하는 EngineCPUUtilization 지표를 사용할 수 있습니다. 현재 사용하시는 인스턴스 유형 상 EngineCPUUtilization 으로 CPU 부하상황을 판단하는 것이 맞을 것 같습니다.</p></blockquote><p>4vCPU의 대규모 노드라서 완전한 설명이 되는 건 아니지만, 아래와 같이 분석해볼 수 있겠습니다.</p><ul><li>당시 redis 자체의 부하는 높지 않았다(EngineCPUUtilization 23%)</li><li>redis 이외의 프로세스에서 높은 CPU를 사용하고 있었고(22.5%를 초과) 부하의 원인이 되었다.</li></ul><p>Amazon ElastiCache for Redis 사용 설명서 &gt; <a href="https://docs.aws.amazon.com/ko_kr/AmazonElastiCache/latest/red-ug/CacheMetrics.WhichShouldIMonitor.html">어떤 지표를 모니터링해야 합니까?</a>에서 언급된 Redis 모니터링에 관한 글도 Redis 지표를 이해하는 데 많은 도움이 됩니다.</p><p><a href="https://aws.amazon.com/ko/blogs/database/monitoring-best-practices-with-amazon-elasticache-for-redis-using-amazon-cloudwatch/">https://aws.amazon.com/ko/blogs/database/monitoring-best-practices-with-amazon-elasticache-for-redis-using-amazon-cloudwatch/</a></p><ul><li>여기서는 신규 커넥션이 늘어날수록 CPUUtilization 지표가 높아질 수 있다고 (가볍게) 언급이 되어있습니다.</li></ul><p>신규 커넥션의 수 혹은 많은 커넥션 자체가 Redis 서버의 CPU 사용량을 늘리고, 이것이 장애로까지 이어졌을 거라 가정하고 개선 계획을 짜보았습니다.</p><p>개선 과정은 다음 글로 이어집니다.</p><p><a href="/2022/12/02/handling-redis-connections-2/">“식은땀이 흐르는 Redis 서버 교체기 2편”으로 이동</a></p>]]></content>
    
    
      
      
        
        
    <summary type="html">&lt;p&gt;&lt;em&gt;올여름 Redis 서버 교체 과정에서 여러 번의 장애를 겪은 후 뼈에 새기는 반성문입니다.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;목차&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;낡은 캐시 서버를 교체하라&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;섣부른</summary>
        
      
    
    
    
    
    <category term="Laravel" scheme="https://haah.kr/tags/Laravel/"/>
    
    <category term="PHP" scheme="https://haah.kr/tags/PHP/"/>
    
    <category term="Redis" scheme="https://haah.kr/tags/Redis/"/>
    
  </entry>
  
  <entry>
    <title>PHP Annotated – October 2022</title>
    <link href="https://haah.kr/2022/11/06/php-annotated-october-2022/"/>
    <id>https://haah.kr/2022/11/06/php-annotated-october-2022/</id>
    <published>2022-11-06T03:07:01.000Z</published>
    <updated>2026-05-31T19:29:57.263Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://blog.jetbrains.com/wp-content/uploads/2022/11/php-annotated-blog-featured-image-1280x600-1.png" alt="PHP Annotated 이미지"></p><p><a href="https://blog.jetbrains.com/author/rpronskiy">Roman Pronskiy</a>가 쓰고 JetBrains에서 제공하는 PHP Annotated <a href="https://blog.jetbrains.com/phpstorm/2022/11/php-annotated-october-2022/">2022년 10월</a>의 번역&#x2F;해석본입니다.</p><p>이 중에서 몇 가지 제 취향껏 골라 그 안의 내용도 좀 뒤져보고 개발새발 번역해서 소개합니다.</p><hr><p>안녕하세요!</p><p>PHP Annotated 10월호에 오신 것을 환영합니다. 여기에서 선별된 뉴스, 기사, 도구 및 비디오를 포함하여 지난 한 달 동안 PHP 세계에서 일어난 가장 흥미진진한 일들을 따라잡을 것입니다.</p><h1 id="News"><a href="#News" class="headerlink" title="News"></a>News</h1><h2 id="PHP-8-2-0-RC-5-has-been-released"><a href="#PHP-8-2-0-RC-5-has-been-released" class="headerlink" title="PHP 8.2.0 RC 5 has been released"></a>PHP 8.2.0 RC 5 has been released</h2><p><a href="https://www.php.net/archive/2022.php#2022-10-27-1">PHP 8.2.0 RC 5</a>가 출시 되었습니다. <a href="https://wiki.php.net/todo/php82">일정</a>에 따라 또다른 릴리스 후보가 전달되었습니다. 여섯 번째 RC는 11월 10일에 예정되어 있으며 PHP 8.2의 최종 릴리스 이전의 마지막 RC가 될 것입니다.</p><p>PHP 8.2에 추가될 기능에 대한 자세한 목록은 <a href="https://php.watch/versions/8.2">PHP.Watch</a> 또는 <a href="https://stitcher.io/blog/new-in-php-82">stitcher.io</a>를 참조 하십시오.</p><p>또한 <a href="https://stitcher.io/blog/php-82-in-8-code-blocks">PHP 8.2 in 8 code blocks(8개의 코드 블럭으로 보는 PHP 8.2)</a>에서 확인하고 싶을 수도 있습니다.</p><ul><li><a href="https://stitcher.io/blog/readonly-classes-in-php-82">Readonly classes</a></li><li><a href="https://stitcher.io/blog/new-in-php-82#new-random-extension-rfc">New random extension</a></li><li><a href="https://stitcher.io/blog/new-in-php-82#null,--true,-and-false-as-standalone-types-rfc">null, true, and false as standalone types</a></li><li><a href="https://stitcher.io/blog/new-in-php-82#disjunctive-normal-form-types-rfc">Disjunctive Normal Form Types</a></li><li><a href="https://stitcher.io/blog/new-in-php-82#constants-in-traits-rfc">Constants in traits</a></li><li><a href="https://stitcher.io/blog/new-in-php-82#redact-parameters-in-back-traces-rfc">Redacted parameters</a></li><li><a href="https://stitcher.io/blog/deprecated-dynamic-properties-in-php-82">Deprecated dynamic properties</a></li><li><a href="https://stitcher.io/blog/new-in-php-82#fetch-properties-of-enums-in-const-expressions-rfc">Enum properties in const expressions</a></li></ul><p>Martin Joo(@mmartin_joo)의 <a href="https://twitter.com/mmartin_joo/status/1575456607261102082">트윗</a></p><blockquote><p>Me: “Hey Joe! What do you think about modern PHP?”<br>Joe:</p></blockquote><p><img src="https://pbs.twimg.com/media/Fd0jMvSX0AAY5C1?format=jpg&name=small" alt="What do you think about modern PHP 이미지"></p><h2 id="PHP-8-0-25-and-PHP-8-1-12-have-been-released"><a href="#PHP-8-0-25-and-PHP-8-1-12-have-been-released" class="headerlink" title="PHP 8.0.25 and PHP 8.1.12 have been released"></a>PHP 8.0.25 and PHP 8.1.12 have been released</h2><p><a href="https://www.php.net/archive/2022.php#2022-10-28-1">PHP 8.0.25</a> 및 <a href="https://www.php.net/archive/2022.php#2022-10-28-2">PHP 8.1.12</a>가 출시되었습니다. </p><p>❗현재 지원되는 브랜치의 보안 릴리스입니다. 모든 사용자는 업그레이드하는 것이 좋습니다.<br>업데이트는 Phar 확장 및 쿠키 무결성의 취약점을 수정합니다. PHP.Watch의 <a href="https://php.watch/news/2022/09/php-releases-8.1.11-8.0.24-7.4.32">이 블로그 게시물</a>에서 자세히 알아볼 수 있습니다.</p><h2 id="AWS-X-Ray-launches-support-for-tracing-PHP-applications-via-OpenTelemetry-in-public-preview"><a href="#AWS-X-Ray-launches-support-for-tracing-PHP-applications-via-OpenTelemetry-in-public-preview" class="headerlink" title="AWS X-Ray launches support for tracing PHP applications via OpenTelemetry in public preview."></a>AWS X-Ray launches support for tracing PHP applications via OpenTelemetry in public preview.</h2><p>AWS X-Ray는 public preview에서 <a href="https://aws.amazon.com/about-aws/whats-new/2022/09/aws-x-ray-support-tracing-php-applications-opentelemetry-public-preview/">OpenTelemetry를 통한 PHP 애플리케이션 추적 지원을 시작합니다</a>.</p><h2 id="The-RedMonk-Programming-Language-Rankings-June-2022"><a href="#The-RedMonk-Programming-Language-Rankings-June-2022" class="headerlink" title="The RedMonk Programming Language Rankings: June 2022"></a>The RedMonk Programming Language Rankings: June 2022</h2><p><a href="https://redmonk.com/sogrady/2022/10/20/language-rankings-6-22/">RedMonk 프로그래밍 언어 순위: 2022년 6월</a></p><p>mwop(@mwop)의 <a href="https://twitter.com/mwop/status/1584548421205200898">트윗</a></p><blockquote><p>RedMonk는 PHP가 항상 top 5, 보통은 top 4에 올라온다는 사실에 대해 이야기하지 않습니다. 그들은 상위 3위 안에 드는 언어에 대해서만 이야기하거나 다른 “인기 있는” 언어가 목록에서 오르거나 내릴 때만 이야기합니다.</p></blockquote><h1 id="PHP-Core"><a href="#PHP-Core" class="headerlink" title="PHP Core"></a>PHP Core</h1><p>핵심 뉴스의 대부분은 PHP Foundation의 <a href="https://thephp.foundation/blog/tag/roundup/">PHP Core Roundup 시리즈</a>에서 자세히 다루므로 간략하게만 언급하겠습니다.</p><h2 id="✅-RFC-json-validate-PHP-8-3"><a href="#✅-RFC-json-validate-PHP-8-3" class="headerlink" title="✅ RFC: json_validate #PHP 8.3"></a>✅ RFC: json_validate #PHP 8.3</h2><p><a href="https://wiki.php.net/rfc/json_validate">RFC: json_validate</a></p><p>Juan Carlos Morales json_validate()는 문자열에 유효한 JSON이 포함되어 있는지 확인하는 새로운 함수를 추가할 것을 제안했습니다. 문자열을 완전히 구문 분석할 필요가 없을 때 메모리를 절약하고 JSON인지 확인하기만 하면 됩니다.</p><figure class="highlight php"><table><tr><td class="code"><pre><span class="line"><span class="title function_ invoke__">var_dump</span>(<span class="title function_ invoke__">json_validate</span>(<span class="string">&#x27;&#123; &quot;test&quot;: &#123; &quot;foo&quot;: &quot;bar&quot; &#125; &#125;&#x27;</span>));  <span class="comment">// bool(true)</span></span><br><span class="line"><span class="title function_ invoke__">var_dump</span>(<span class="title function_ invoke__">json_validate</span>(<span class="string">&#x27;&#123; &quot;&quot;: &quot;&quot;: &quot;&quot; &#125; &#125;&#x27;</span>));              <span class="comment">// bool(false)</span></span><br></pre></td></tr></table></figure><h2 id="❌✅-RFC-Improve-unserialize-error-handling-PHP-8-3"><a href="#❌✅-RFC-Improve-unserialize-error-handling-PHP-8-3" class="headerlink" title="❌✅ RFC: Improve unserialize() error handling #PHP 8.3"></a>❌✅ RFC: Improve unserialize() error handling #PHP 8.3</h2><p><a href="https://wiki.php.net/rfc/improve_unserialize_error_handling">unserialize()의 오류 핸들링 개선</a></p><p>Tim Düsterhus는 직렬화 해제(역직렬화)가 실패할 때 새로운 UnserializationFailedException을 던질 것을 제안했습니다.<br>이 RFC는 <a href="">Twitter에서 엄청난 토론</a><a href="https://twitter.com/nicolasgrekas/status/1581023556707618818%EC%9D%84">https://twitter.com/nicolasgrekas/status/1581023556707618818을</a> 일으켰고 궁극적으로 새로운 예외 부분은 받아들여지지 않았습니다. 대신, 이제 발생한 오류의 심각도가 <code>E_NOTICE</code>에서 <code>E_WARNING</code>로 증가합니다.</p><h2 id="📣-RFC-Randomizer-Additions-PHP-8-3"><a href="#📣-RFC-Randomizer-Additions-PHP-8-3" class="headerlink" title="📣 RFC: Randomizer Additions #PHP 8.3"></a>📣 RFC: Randomizer Additions #PHP 8.3</h2><p><a href="https://wiki.php.net/rfc/randomizer_additions">\Random\Randomizer에 새로운 빌딩 블록 추가</a></p><p>Tim Düsterhus와 Joshua Rüsweg는 <code>\Random\Randomizer</code>에 새로운 “빌딩 블록” 방법을 추가할 것을 제안합니다. 이러한 방법은 장황하거나 사용자 영역에서 구현하기 매우 어려운, 일반적으로 유용한 작업을 구현합니다.</p><figure class="highlight php"><table><tr><td class="code"><pre><span class="line"><span class="keyword">namespace</span> <span class="title class_">Random</span>; </span><br><span class="line"><span class="keyword">final</span> <span class="class"><span class="keyword">class</span> <span class="title">Randomizer</span> </span>&#123;</span><br><span class="line">    <span class="comment">// […]</span></span><br><span class="line">    <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">getBytesFromAlphabet</span>(<span class="params"><span class="keyword">string</span> <span class="variable">$alphabet</span>, <span class="keyword">int</span> <span class="variable">$length</span></span>): <span class="title">string</span> </span>&#123;&#125;</span><br><span class="line">    <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">nextFloat</span>(<span class="params"></span>): <span class="title">float</span> </span>&#123;&#125;</span><br><span class="line">    <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">getFloat</span>(<span class="params"><span class="keyword">float</span> <span class="variable">$min</span>, <span class="keyword">float</span> <span class="variable">$max</span></span>): <span class="title">float</span> </span>&#123;&#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="📣-RFC-Destructuring-Coalesce-PHP-8-3"><a href="#📣-RFC-Destructuring-Coalesce-PHP-8-3" class="headerlink" title="📣 RFC: Destructuring Coalesce #PHP 8.3"></a>📣 RFC: Destructuring Coalesce #PHP 8.3</h2><p><a href="https://wiki.php.net/rfc/destructuring_coalesce">RFC: Destructuring Coalesce</a></p><p>Bob Weinand는 Destructuring 할당에서 기본값에 대한 연산자를 추가할 것을 제안합니다.</p><figure class="highlight php"><table><tr><td class="code"><pre><span class="line"><span class="variable">$input</span> = <span class="string">&#x27;key=value&#x27;</span>;</span><br><span class="line">[<span class="variable">$key</span>, <span class="variable">$val</span> ?? <span class="string">&#x27;default value&#x27;</span>] = <span class="title function_ invoke__">explode</span>(<span class="string">&#x27;=&#x27;</span>, <span class="variable">$input</span>, <span class="number">2</span>);</span><br></pre></td></tr></table></figure><p>그건 그렇고, 현재는 기본값을 다음과 같이 배열에 추가할 수 있습니다.</p><figure class="highlight php"><table><tr><td class="code"><pre><span class="line">[<span class="variable">$key</span>, <span class="variable">$val</span>] = <span class="title function_ invoke__">explode</span>(<span class="string">&#x27;=&#x27;</span>, <span class="variable">$input</span>, <span class="number">2</span>) + [<span class="literal">null</span>, <span class="literal">null</span>]</span><br></pre></td></tr></table></figure><p>팁 주셔서 감사합니다 , Sergii Shymko!</p><h2 id="PHP-CLI-SERVER-WORKERS"><a href="#PHP-CLI-SERVER-WORKERS" class="headerlink" title="PHP_CLI_SERVER_WORKERS"></a>PHP_CLI_SERVER_WORKERS</h2><p>Joe Watkins(@krakjoe)의 <a href="https://twitter.com/krakjoe/status/1585174196371738625">트윗</a></p><blockquote><p>이건 비밀로 했어야 했는데, 문서화 되어서…<br>#PHP CLI 서버는 7.4부터 PHP_CLI_SERVER_WORKERS를 설정하면 여러 요청을 동시에 처리할 수 있습니다 …<br>다양하게 문제가 되긴 했었지만 <em>개발용</em>의 최신 PHP 버전에서는 괜찮을 수 있습니다.</p></blockquote><h1 id="Tools"><a href="#Tools" class="headerlink" title="Tools"></a>Tools</h1><h2 id="dunglas-x2F-frankenphp"><a href="#dunglas-x2F-frankenphp" class="headerlink" title="dunglas&#x2F;frankenphp"></a>dunglas&#x2F;frankenphp</h2><p><a href="https://github.com/dunglas/frankenphp">dunglas&#x2F;frankenphp</a> – Go로 작성되고 Caddy 웹 서버에 포함된 최신 PHP 앱 서버입니다.</p><p>Kevin Dunglas는 이 서버와 <a href="https://github.com/roadrunner-server/roadrunner">RoadRunner</a>의 주요 차이점을 요약했습니다.</p><p>그의 reddit 답변은,</p><ul><li>Roadrunner와 FrankenPHP는 접근 방식이 다릅니다.</li><li>Roadrunner는 php-cli를 실행하고 GRPC를 통해 웹 서버에 연결합니다. FrankenPHP는 임시 SAPI를 사용하며 Apache의 mod_php와 더 비슷하고 Go 코드는 PHP 인터프리터를 라이브러리로 사용하며 모두 동일한 프로세스에 있습니다.</li><li>RoadRunner에는 작업자 모드만 있으며 호환되는 앱에서만 작동할 수 있습니다. FrankenPHP에는 모든 기존 응용 프로그램과 호환되는 “표준” 모드와 일부 코드 변경(예: RR)이 필요한 작업자 모드가 있습니다.</li><li>RoadRunner는 PSR-7 HTTP 메시지를 사용합니다. FrankenPHP는 일반 슈퍼글로벌과 스트림(일반 모드와 작업자 모드 모두)을 사용하며 처리된 각 요청 후에 재설정됩니다.</li><li>RoadRunner는 전투 테스트를 거쳤고 프로덕션 준비가 되었습니다. FrankenPHP는 실험적이며 아직 프로덕션에 사용할 준비가 되지 않았습니다.</li><li>FrankenPHP는 또한 Go 라이브러리로 사용되어 PHP를 Go 프로그램이나 서버에 통합할 수 있습니다(이론적으로는 FrankenPHP를 Go로 작성된 Traefik 또는 로컬 Symfony 웹 서버에 통합할 수 있어야 합니다).</li></ul><h2 id="krakjoe-x2F-parallel"><a href="#krakjoe-x2F-parallel" class="headerlink" title="krakjoe&#x2F;parallel"></a>krakjoe&#x2F;parallel</h2><p><a href="https://github.com/krakjoe/parallel">krakjoe&#x2F;parallel</a> – PHP 8+를 위한 간결한 병렬 동시성 API. 확장은 병렬 처리에 대한 Golang의 철학을 따릅니다. “메모리를 공유하여 통신하지 마십시오. 대신 통신을 통해 메모리를 공유하십시오.” – 채널, 이벤트 및 Future와 같은 필요한 모든 브릭을 제공합니다.</p><h2 id="cachewerk-x2F-relay"><a href="#cachewerk-x2F-relay" class="headerlink" title="cachewerk&#x2F;relay"></a>cachewerk&#x2F;relay</h2><p><a href="https://github.com/cachewerk/relay">cachewerk&#x2F;relay</a> – PhpRedis 및 Predis와 같은 Redis 클라이언트이지만 PHP 확장으로 작성되었기 때문에 훨씬 빠릅니다. 저자는 캐싱을 위한 Laravel, WordPress 및 Magento 연동 기능도 제공합니다.</p><p>GitHub 페이지에 들어가보면 벤치마크 결과도 빠르게 확인할 수 있게 제공합니다. 주의 사항은,</p><blockquote><p>참고: 우리는 New Relic의 열렬한 팬이지만 APM 에이전트를 활성화하면 Relay 속도가 크게 느려지고 벤치마크가 왜곡됩니다.</p></blockquote><p>PhpRedis 역시 PHP 확장(extension)인데,<br><a href="https://relay.so/docs/1.x/introduction">Relay의 Documentation</a>을 보면 APCu와 같은 shared in-memory cache라고 소개합니다. 모든 FPM worker 간 공유되는 PHP 메모리에 보관하기 때문에 더 빠르게 동작할 수 있습니다.</p><h2 id="Saeghe"><a href="#Saeghe" class="headerlink" title="Saeghe"></a>Saeghe</h2><p><a href="https://saeghe.com/">Saeghe</a> – 최신 PHP 패키지 관리자입니다.</p><p>PHP에는 이제 패키지 관리자가 하나 더 있습니다! GitHub 링크를 종속성으로 사용합니다. 또한 PSR-autoloading에 의존하지 않고 대신 빌드 단계에 의존합니다(패키지를 추가한 후 별도의 빌드 단계를 거친다는 뜻).</p><p>경쟁은 언제나 옳다!</p><h2 id="composer-unused-x2F-composer-unused"><a href="#composer-unused-x2F-composer-unused" class="headerlink" title="composer-unused&#x2F;composer-unused"></a>composer-unused&#x2F;composer-unused</h2><p><a href="https://github.com/composer-unused/composer-unused">composer-unused&#x2F;composer-unused</a> – 코드를 스캔하여 사용되지 않은 composer 종속성을 드러내는 패키지입니다.</p><h2 id="square-x2F-pjson"><a href="#square-x2F-pjson" class="headerlink" title="square&#x2F;pjson"></a>square&#x2F;pjson</h2><p><a href="https://github.com/square/pjson">square&#x2F;pjson</a> – 이 라이브러리는 JSON을 사용자 정의 클래스의 실제 객체로 역직렬화하는 데 도움이 됩니다. 클래스 속성에 PHP 8의 attribute를 사용하여 수행합니다.</p><h2 id="doctrine-x2F-collections-2-0-0"><a href="#doctrine-x2F-collections-2-0-0" class="headerlink" title="doctrine&#x2F;collections 2.0.0"></a>doctrine&#x2F;collections 2.0.0</h2><p><a href="https://github.com/doctrine/collections/releases/tag/2.0.0">doctrine&#x2F;collections 2.0.0</a> – 더 엄격한 유형과 기본 매개변수 및 반환 유형을 추가하는 주요 업데이트를 추가된 인기 있는 컬렉션 라이브러리입니다.</p><h2 id="heiglandreas-x2F-holidayChecker"><a href="#heiglandreas-x2F-holidayChecker" class="headerlink" title="heiglandreas&#x2F;holidayChecker"></a>heiglandreas&#x2F;holidayChecker</h2><p><a href="https://github.com/heiglandreas/holidayChecker">heiglandreas&#x2F;holidayChecker</a> – 이 패키지를 사용하면 주어진 날짜가 공휴일인지, 로케일을 인식하는지 확인할 수 있습니다.</p><h2 id="Laragon"><a href="#Laragon" class="headerlink" title="Laragon"></a>Laragon</h2><p><a href="https://laragon.org/">Laragon</a> – 또 다른 로컬 개발 환경 도구 – XAMPP 및 유사 솔루션에 대한 이식 가능하고 격리된 빠르고 강력한 대안입니다. <a href="https://php.watch/articles/laragon-windows-php">PHP.Watch의 이 게시물</a>에서 자세히 알아보세요.</p><h2 id="gacela-project-x2F-gacela"><a href="#gacela-project-x2F-gacela" class="headerlink" title="gacela-project&#x2F;gacela"></a>gacela-project&#x2F;gacela</h2><p><a href="https://github.com/gacela-project/gacela">gacela-project&#x2F;gacela</a> – 이 패키지는 통합된 방식으로 프로젝트를 여러 모듈로 분할하여 모듈식 PHP 애플리케이션을 빌드하는 데 도움이 됩니다. Spryker 에서 크게 영감을 받았습니다.</p><h1 id="Symfony"><a href="#Symfony" class="headerlink" title="Symfony"></a>Symfony</h1><h2 id="Symfony-translate-Assert-custom-messages-from-entities"><a href="#Symfony-translate-Assert-custom-messages-from-entities" class="headerlink" title="Symfony: translate Assert custom messages from entities"></a>Symfony: translate Assert custom messages from entities</h2><p>Thomas Dutrion의 <a href="https://tdutrion.dev/symfony-translate-assert-custom-messages-from-entities-552088d5add4">Symfony: 엔터티의 사용자 지정 Assert 메시지 번역</a>.</p><h2 id="❗️-Twig-security-release"><a href="#❗️-Twig-security-release" class="headerlink" title="❗️ Twig security release"></a>❗️ Twig security release</h2><p>Fabien Potencier의 <a href="https://symfony.com/blog/twig-security-release-possibility-to-load-a-template-outside-a-configured-directory-when-using-the-filesystem-loader">Twig 보안 릴리스: 파일 시스템 로더를 사용할 때 구성된 디렉토리 외부에서 템플릿을 로드할 가능성</a>.</p><h2 id="CQRS-Principle-with-Symfony-Messenger"><a href="#CQRS-Principle-with-Symfony-Messenger" class="headerlink" title="CQRS Principle with Symfony Messenger"></a>CQRS Principle with Symfony Messenger</h2><p>Mert Simsek의 <a href="https://medium.com/beyn-technology/cqrs-principle-with-symfony-messenger-6c0fb2c28917">Symfony Messenger를 사용한 CQRS 원리</a>.</p><h2 id="emr-dev-x2F-sf-bug-bundle"><a href="#emr-dev-x2F-sf-bug-bundle" class="headerlink" title="emr-dev&#x2F;sf-bug-bundle"></a>emr-dev&#x2F;sf-bug-bundle</h2><p><a href="https://github.com/emr-dev/sf-bug-bundle">emr-dev&#x2F;sf-bug-bundle</a> – Symfony 프로파일러 페이지를 공유하기 위한 패키지입니다. <a href="https://sfbug.io/">작동 방식은 다음과 같습니다</a>.</p><h2 id="Emojis-are-new-Symfony’s-best-friends"><a href="#Emojis-are-new-Symfony’s-best-friends" class="headerlink" title="Emojis are new Symfony’s best friends!"></a>Emojis are new Symfony’s best friends!</h2><p>Alexandre Daubois의 <a href="https://medium.com/the-sensiolabs-tech-blog/emojis-are-new-symfonys-best-friends-7c084760c056">이모지는 새로운 Symfony의 절친입니다!</a>.</p><h2 id="New-in-Symfony-6-2"><a href="#New-in-Symfony-6-2" class="headerlink" title="New in Symfony 6.2"></a>New in Symfony 6.2</h2><p>Javier Eguiluz의 <a href="https://symfony.com/blog/new-in-symfony-6-2-built-in-cache-security-template-and-doctrine-attributes">Symfony 6.2의 새로운 기능: 내장(built-in) 캐시, 보안, 템플릿 및 Doctrine Attribute</a>.</p><h1 id="Laravel"><a href="#Laravel" class="headerlink" title="Laravel"></a>Laravel</h1><h2 id="What’s-new-in-Laravel-10"><a href="#What’s-new-in-Laravel-10" class="headerlink" title="What’s new in Laravel 10?"></a>What’s new in Laravel 10?</h2><p>Benjamin Crozat의 <a href="https://benjamincrozat.com/what-is-new-laravel-10">Laravel 10의 새로운 기능은?</a> – Laravel 10은 2023년 2월 7일에 출시됩니다. 개발은 여전히 진행 중입니다.</p><h2 id="spatie-x2F-laravel-dynamic-servers"><a href="#spatie-x2F-laravel-dynamic-servers" class="headerlink" title="spatie&#x2F;laravel-dynamic-servers"></a>spatie&#x2F;laravel-dynamic-servers</h2><p><a href="https://github.com/spatie/laravel-dynamic-servers">spatie&#x2F;laravel-dynamic-servers</a> – 서버를 동적으로 생성하고 제거하기 위한 패키지입니다. <a href="https://laravel-news.com/laravel-dynamic-servers">사용 방법은 다음과 같습니다</a>.</p><h2 id="ryangjchandler-x2F-laravel-feature-flags"><a href="#ryangjchandler-x2F-laravel-feature-flags" class="headerlink" title="ryangjchandler&#x2F;laravel-feature-flags"></a>ryangjchandler&#x2F;laravel-feature-flags</h2><p><a href="https://github.com/ryangjchandler/laravel-feature-flags">ryangjchandler&#x2F;laravel-feature-flags</a> – Laravel을 위한 독자적인 기능 플래그 패키지입니다. <a href="https://ryangjchandler.co.uk/posts/adding-feature-flags-to-your-laravel-project">Laravel 프로젝트에 기능 플래그를 추가하는 방법을 배우세요</a>.</p><h2 id="creagia-x2F-laravel-sign-pad"><a href="#creagia-x2F-laravel-sign-pad" class="headerlink" title="creagia&#x2F;laravel-sign-pad"></a>creagia&#x2F;laravel-sign-pad</h2><p><a href="https://github.com/creagia/laravel-sign-pad">creagia&#x2F;laravel-sign-pad</a> – 문서에 서명하고 Eloquent 모델과 관련된 인증된 PDF를 선택적으로 생성하기 위한 패키지입니다. <a href="https://laravel-news.com/laravel-pad-signature">사용 방법은 다음과 같습니다</a>.</p><h2 id="hammerstonedev-x2F-sidecar"><a href="#hammerstonedev-x2F-sidecar" class="headerlink" title="hammerstonedev&#x2F;sidecar"></a>hammerstonedev&#x2F;sidecar</h2><p><a href="https://github.com/hammerstonedev/sidecar">hammerstonedev&#x2F;sidecar</a> – Laravel 애플리케이션에서 AWS Lambda 기능을 배포하고 실행하는 도구입니다.</p><p>Laravel Vapor는 훌륭한 도구이지만, 가볍게 한 두개의 기능만 배포하고 싶을 때 이 패키지를 이용할 수 있습니다. 심지어 Python, Ruby, Java 등 타 언어를 배포할 수도 있습니다.</p><p>사이드카가 하지 않는 일</p><ul><li>Sidecar는 API 게이트웨이, 데이터베이스, 캐시 등을 처리 하지 않습니다 . Sidecar가 관심을 갖는 유일한 것은 Lambda 함수를 패키징, 생성, 배포 및 실행하는 것입니다.</li><li>사이드카는 HTTP를 통해 기능을 실행하는 방법을 제공하지 않습니다. 제공된 메소드를 통해 라라벨 앱에서 실행해야 합니다.</li><li>다른 서비스가 필요한 경우 Vapor가 설정한 인스턴스를 사용하거나 직접 설정하는 것이 좋습니다.</li></ul><h2 id="Using-jobs-instead-of-commands-in-the-schedule-of-a-Laravel-app"><a href="#Using-jobs-instead-of-commands-in-the-schedule-of-a-Laravel-app" class="headerlink" title="Using jobs instead of commands in the schedule of a Laravel app"></a>Using jobs instead of commands in the schedule of a Laravel app</h2><p>Freek Van der Herten의 <a href="https://mailcoach.app/blog/5-using-jobs-instead-of-commands-in-the-schedule-of-a-laravel-app">Laravel 스케줄러에서 command 대신 job 사용</a>.</p><h2 id="Laravel’s-safety-mechanisms"><a href="#Laravel’s-safety-mechanisms" class="headerlink" title="Laravel’s safety mechanisms"></a>Laravel’s safety mechanisms</h2><p>Aaron Francis의 <a href="https://planetscale.com/blog/laravels-safety-mechanisms?utm_content=laravel-safety">Laravel의 안전 메커니즘</a>.</p><p>고통스러운 실수를 방지하는 데 도움이 될 수 있는 Laravel의 많은 안전 기능</p><ul><li>N+1 prevention</li><li>Partially hydrated model protection</li><li>Attribute typos and renamed columns</li><li>Mass assignment protection</li><li>Model strictness</li><li>Polymorphic mapping enforcement</li><li>Long-running event monitoring</li></ul><h2 id="📺-Laravel-Bootcamp-from-start-to-finish"><a href="#📺-Laravel-Bootcamp-from-start-to-finish" class="headerlink" title="📺 Laravel Bootcamp: from start to finish"></a>📺 Laravel Bootcamp: from start to finish</h2><p>Brent Roose의 <a href="https://youtu.be/1cPaw3QbOLA">Laravel Bootcamp: 처음부터 마지막까지</a></p><h2 id="📺-What’s-new-in-Laravel-9-32-0"><a href="#📺-What’s-new-in-Laravel-9-32-0" class="headerlink" title="📺 What’s new in Laravel 9.32.0"></a>📺 What’s new in Laravel 9.32.0</h2><p>Christoph Rumpel의 <a href="https://youtu.be/p4pmsZxIzJA">Laravel 9.32.0의 새로운 기능</a>.</p><h2 id="📺-Laravel’s-New-Strict-Mode-Everything-You-Need-to-Know"><a href="#📺-Laravel’s-New-Strict-Mode-Everything-You-Need-to-Know" class="headerlink" title="📺 Laravel’s New Strict Mode (Everything You Need to Know)"></a>📺 Laravel’s New Strict Mode (Everything You Need to Know)</h2><p>Jeffrey Way의 <a href="https://youtu.be/as7qSB4WNHA">Laravel의 새로운 Strict 모드(당신이 알아야 할 모든 것)</a>.</p><h1 id="기타"><a href="#기타" class="headerlink" title="기타"></a>기타</h1><h2 id="Why-I-Don’t-Enjoy-Writing-PHP-Anymore"><a href="#Why-I-Don’t-Enjoy-Writing-PHP-Anymore" class="headerlink" title="Why I Don’t Enjoy Writing PHP Anymore"></a>Why I Don’t Enjoy Writing PHP Anymore</h2><p>Michael Bodnarchuk의 <a href="https://medium.com/@davert/why-i-dont-enjoy-writing-php-anymore-aee8a85ca8aa">내가 더 이상 PHP 작성을 즐기지 않는 이유</a> - 클릭을 유도하는 제목에도 불구하고 이 게시물은 PHP 버전의 이전 버전과의 호환성 중단에 대한 건설적인 우려를 제기합니다.</p><p>Composer의 저자 중 한 명인 Jordi는 일부 업그레이드 문제를 해결하는 데 도움이 될 수 있는 팁을 게시했습니다:</p><p>asgrim.rs(@asgrim)의 <a href="https://twitter.com/asgrim/status/1577346869470150666">트윗</a></p><blockquote><p><a href="https://twitter.com/asgrim/status/1575017379343392768">이 논의</a> 후에 일부 사람들은 다음과 같이 보입니다.</p><ol><li>시맨틱 버전 관리가 무엇을 의미하는지 이해하지 못함</li><li>공개 API에 대한 BC 중단이 무엇을 의미하는지 이해하지 못합니다. 특히 semver에 관해.</li><li>PHP가 semver를 엄격히 따르지 않는다는 것을 깨닫지 못합니다.<br>이것들을 이해하면 수긍이 될 겁니다.</li></ol></blockquote><p>위에 대한 답변으로, Jordi Boggiano(@seldaek)의 <a href="https://twitter.com/asgrim/status/1577346869470150666">트윗</a></p><blockquote><p>또한 안전을 위해 <code>--ignore-platform-req=php+</code>를 사용하십시오<br>더하기 기호를 사용하면 pkg에서 8.1이 필요한 경우 php 8.2를 사용할 수 있지만, php 8.0을 사용할 수 없습니다.</p></blockquote><h2 id="All-the-Easter-Eggs-in-PHP"><a href="#All-the-Easter-Eggs-in-PHP" class="headerlink" title="All the Easter Eggs in PHP"></a>All the Easter Eggs in PHP</h2><p>Ayesh Karunaratne의 <a href="https://php.watch/articles/php-easter-eggs">PHP의 모든 이스터 에그</a>.</p><p>phpinfo() 출력에는 4월 1일에만 볼 수 있는 특별한 PHP 로고가 있습니다.<br><img src="https://i.php.watch/static/p/88/php-logo-april-1-easter-egg.png#screenshot" alt="Easter Eggs in PHP 이미지"></p><h2 id="Pragmatic-development-3-Telegram-bot"><a href="#Pragmatic-development-3-Telegram-bot" class="headerlink" title="Pragmatic development 3: Telegram bot"></a>Pragmatic development 3: Telegram bot</h2><p>Vladimir Martsul의 <a href="https://dev.to/vladimir_mvs/pragmatic-development-3-telegram-bot-ed1">실용적인 개발 3: Telegram 봇</a>.</p><h2 id="Loosely-coupled-Microservices-in-PHP"><a href="#Loosely-coupled-Microservices-in-PHP" class="headerlink" title="Loosely coupled Microservices in PHP"></a>Loosely coupled Microservices in PHP</h2><p>Dariusz Gafka의 <a href="https://blog.devgenius.io/loosely-coupled-microservices-in-php-130699e80344">PHP에서 느슨하게 결합된 마이크로 서비스</a>.</p><h2 id="Unpacked-named-and-positional-arguments-are-in-a-call…"><a href="#Unpacked-named-and-positional-arguments-are-in-a-call…" class="headerlink" title="Unpacked, named and positional arguments are in a call…"></a>Unpacked, named and positional arguments are in a call…</h2><p>Damien Seguy의 <a href="https://www.exakat.io/en/unpacked-named-and-positional-arguments-are-in-a-call/">함수 호출 시 압축된(unpacked) 인수, 명명된(named) 인수 및 고정된(positional) 인수</a>.</p><p>세 가지 인수 전달 방식을 함께 사용하는 경우를 실험합니다.</p><h2 id="Extrinsic-sorting-A-benchmark"><a href="#Extrinsic-sorting-A-benchmark" class="headerlink" title="Extrinsic sorting: A benchmark"></a>Extrinsic sorting: A benchmark</h2><p>Larry Garfield의 <a href="https://peakd.com/hive-168588/@crell/extrinsic-sorting-benchmark">외부 정렬: 벤치마크</a> – 우선 순위, 그룹, 토폴로지 및 기타 사소하지 않은 정렬을 설명합니다.</p><h2 id="Contract-Tests"><a href="#Contract-Tests" class="headerlink" title="Contract Tests"></a>Contract Tests</h2><p>Kai Sassnowski의 <a href="https://www.kai-sassnowski.com/post/contract-tests/">계약(Contract) 테스트</a> – 인터페이스의 모든 구현에서 일관된 동작을 보장하기 위한 테스트 작성 지침.</p><h2 id="PHP-preload-VS-running-as-a-daemon-RoadRunner"><a href="#PHP-preload-VS-running-as-a-daemon-RoadRunner" class="headerlink" title="PHP preload VS running as a daemon (RoadRunner)"></a>PHP preload VS running as a daemon (RoadRunner)</h2><p><a href="https://dev.to/pmurzakov/php-preload-vs-running-as-a-daemon-benchmarks-3bba">PHP preload VS 데몬으로 실행(RoadRunner)</a> – Pavel Murzakov의 벤치마크.</p><h2 id="Supporting-Legacy-PHP-project-painless-switching-to-cloud-storage"><a href="#Supporting-Legacy-PHP-project-painless-switching-to-cloud-storage" class="headerlink" title="Supporting Legacy PHP project: painless switching to cloud storage"></a>Supporting Legacy PHP project: painless switching to cloud storage</h2><p>Vlad Reshetilo의 <a href="https://medium.com/@vlreshet/supporting-legacy-php-project-painless-switching-to-cloud-storage-ef6a1404f590">레거시 PHP 프로젝트 지원: 클라우드 스토리지로의 간편한 전환</a> – PHP의 기본 스트림 API를 사용하기 위한 깔끔한 트릭입니다.</p><h2 id="How-to-build-your-next-PHP-project-with-a-touch-of-AI"><a href="#How-to-build-your-next-PHP-project-with-a-touch-of-AI" class="headerlink" title="How to build your next PHP project with a touch of AI"></a>How to build your next PHP project with a touch of AI</h2><p>Benjamin Crozat의 <a href="https://benjamincrozat.com/php-artificial-intelligence">AI로 다음 PHP 프로젝트를 빌드하는 방법</a>.</p><h2 id="Modern-PHP-features-explained-–-PHP-8-0-and-8-1"><a href="#Modern-PHP-features-explained-–-PHP-8-0-and-8-1" class="headerlink" title="Modern PHP features explained – PHP 8.0 and 8.1"></a>Modern PHP features explained – PHP 8.0 and 8.1</h2><p><a href="https://laravel-news.com/modern-php-features-explained?utm_campaign=Modern+PHP+features+explained+Laravel+937+OpenAI+PHP+Client+and+more+-+433&utm_source=email+marketing">최신 PHP 기능 설명 - PHP 8.0 및 8.1</a> – Steve McDougall</p><h2 id="Using-PHP-enums-as-method-calls"><a href="#Using-PHP-enums-as-method-calls" class="headerlink" title="Using PHP enums as method calls"></a>Using PHP enums as method calls</h2><p>Thorsten Suckow-Homberg의 <a href="https://medium.com/@thorstensuckow/using-php-enums-as-method-calls-2d6b95fa8347">메소드 호출로 PHP 열거형을 사용</a> – 메소드 호출을 기존 유형 값에 동적으로 매핑 – 열거형의 깔끔하고 예상치<br>못한 사용법입니다.</p><h1 id="Videos"><a href="#Videos" class="headerlink" title="Videos"></a>Videos</h1><ul><li>📺 <a href="https://youtu.be/vXjbgfqfUBk">나의 최고 PhpStorm 트릭 10개</a> by Christoph Rumpel.</li><li>📺 <a href="https://youtu.be/c2YJ6GmahJk">작은 리팩터가 큰 차이를 만듭니다</a> by Jeffrey Way.</li><li>📺 <a href="https://laracasts.com/series/php-for-beginners-2023-edition">초보자를 위한 PHP</a> by Jeffrey Way.</li><li>📺 <a href="https://youtu.be/j9gfU_Vg2ME">PHP 8.2에서 변경된 사항</a> by Scott Keck-Warren.</li></ul><h1 id="Conferences"><a href="#Conferences" class="headerlink" title="Conferences"></a>Conferences</h1><ul><li><a href="https://live.symfony.com/2022-paris-con/">SymfonyCon</a> – Disneyland Paris (France), November 17–18, 2022.</li><li><a href="https://www.phpconference.co.uk/">PHP UK Conference</a> – London (UK), February 14–16, 2023.</li><li><a href="https://twitter.com/LaraconEU/status/1575836655055142913">Laracon EU</a> – Lisbon (Portugal), January 2023.</li><li><a href="https://tek.phparch.com/">Php[tek]</a> – Chicago (US), May 16–18, 2023.</li></ul><p>다음 PHP 모임이 언제인지 궁금하시다면 Tomas Votruba가 그의 멋진 <a href="https://friendsofphp.org/">friendsofphp.org</a> 모임 수집 도구로 여러분을 안내해 드리겠습니다. <a href="https://www.php.net/cal.php">php.net - 이벤트: 2022년 11월</a> 캘린더도 있습니다 .</p>]]></content>
    
    
      
      
        
        
    <summary type="html">&lt;p&gt;&lt;img src=&quot;https://blog.jetbrains.com/wp-content/uploads/2022/11/php-annotated-blog-featured-image-1280x600-1.png&quot; alt=&quot;PHP Annotated</summary>
        
      
    
    
    
    
    <category term="PHP" scheme="https://haah.kr/tags/PHP/"/>
    
    <category term="php-annotated" scheme="https://haah.kr/tags/php-annotated/"/>
    
    <category term="php-annotated-monthly" scheme="https://haah.kr/tags/php-annotated-monthly/"/>
    
  </entry>
  
  <entry>
    <title>PHP Annotated – September 2022</title>
    <link href="https://haah.kr/2022/10/04/php-annotated-september-2022/"/>
    <id>https://haah.kr/2022/10/04/php-annotated-september-2022/</id>
    <published>2022-10-04T22:56:19.000Z</published>
    <updated>2026-05-31T19:29:57.263Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://blog.jetbrains.com/wp-content/uploads/2022/08/php-annotated-blog-featured-image-1280x600-1.png" alt="PHP Annotated 이미지"></p><p><a href="https://blog.jetbrains.com/author/rpronskiy">Roman Pronskiy</a>가 쓰고 JetBrains에서 제공하는 PHP Annotated <a href="https://blog.jetbrains.com/phpstorm/2022/10/php-annotated-september-2022/">2022년 9월</a>의 번역&#x2F;해석본입니다.</p><p>이 중에서 몇 가지 제 취향껏 골라 그 안의 내용도 좀 뒤져보고 개발새발 번역해서 소개합니다.</p><hr><p>안녕하세요!</p><p>PHP Annotated 9월호에 오신 것을 환영합니다. 여기에서 선별된 뉴스, 기사, 도구 및 비디오를 포함하여 지난 한 달 동안 PHP 세계에서 일어난 가장 흥미로운 일을 따라잡을 것입니다.</p><h1 id="News"><a href="#News" class="headerlink" title="News"></a>News</h1><h2 id="PHP-8-2-RC-3-has-been-released"><a href="#PHP-8-2-RC-3-has-been-released" class="headerlink" title="PHP 8.2 RC 3 has been released"></a>PHP 8.2 RC 3 has been released</h2><p><a href="https://www.php.net/archive/2022.php#2022-09-29-3">PHP 8.2 RC 3</a>이 출시되었습니다.<br><a href="https://wiki.php.net/todo/php82">일정</a>에 따라 또다른 RC가 출시되었습니다. 다음 RC 4는 10월 13일에 출시될 예정입니다.<br>PHP 8.2에 추가될 기능에 대한 자세한 목록은 <a href="https://php.watch/versions/8.2">PHP.Watch</a> 또는 <a href="https://stitcher.io/blog/new-in-php-82">stitcher.io</a>를 참조하십시오.</p><p>또한 플래시 뉴스레터인 <a href="https://stitcher.io/blog/road-to-php-82">The Road to PHP 8.2</a>를 확인하십시오 .</p><h2 id="PHP-7-4-32-PHP-8-0-24-and-PHP-8-1-11-have-been-released"><a href="#PHP-7-4-32-PHP-8-0-24-and-PHP-8-1-11-have-been-released" class="headerlink" title="PHP 7.4.32, PHP 8.0.24, and PHP 8.1.11 have been released"></a>PHP 7.4.32, PHP 8.0.24, and PHP 8.1.11 have been released</h2><p><a href="https://www.php.net/archive/2022.php#2022-09-29-1">PHP 7.4.32</a>, <a href="https://www.php.net/archive/2022.php#2022-09-30-1">PHP 8.0.24</a> 및 <a href="https://www.php.net/archive/2022.php#2022-09-29-2">PHP 8.1.11</a>이 출시되었습니다. </p><p>❗️현재 지원되는 브랜치의 보안 릴리스입니다. 모든 사용자는 업그레이드하는 것이 좋습니다.</p><h2 id="PhpStorm-2022-3-EAP-Is-Open"><a href="#PhpStorm-2022-3-EAP-Is-Open" class="headerlink" title="PhpStorm 2022.3 EAP Is Open!"></a>PhpStorm 2022.3 EAP Is Open!</h2><p><a href="https://blog.jetbrains.com/phpstorm/2022/09/phpstorm-2022-3-eap-is-open/">PhpStorm 2022.3 EAP가 공개되었습니다!</a></p><p>다음은 PhpStorm용 Early Access Program의 일부로 이미 시도해볼 수 있습니다.</p><ul><li>새 UI에 대한 베타 액세스</li><li>전체 PHP 8.2 지원</li><li>빠른 수정 미리보기</li><li>기타 등등</li></ul><h1 id="PHP-Core"><a href="#PHP-Core" class="headerlink" title="PHP Core"></a>PHP Core</h1><p>Core 뉴스의 대부분은 PHP Foundation의 <a href="https://thephp.foundation/blog/tag/roundup/">PHP Core Roundup 시리즈</a>에서 자세히 다룹니다 . <a href="https://thephp.foundation/blog/2022/09/30/php-core-roundup-6/">Roundup 시리즈의 여섯 번째 에피소드</a>에서 PHP Core 팀의 모든 최신 개발 사항을 찾을 수 있으므로 간략하게만 언급하겠습니다.</p><h2 id="📊-RFC-json-validate-PHP-8-3"><a href="#📊-RFC-json-validate-PHP-8-3" class="headerlink" title="📊 RFC: json_validate #PHP 8.3"></a>📊 RFC: json_validate #PHP 8.3</h2><p><a href="https://wiki.php.net/rfc/json_validate">RFC: json_validate</a></p><p>이 RFC에서 Juan Carlos Morales는 문자열에 유효한 JSON이 포함되어 있는지 확인하는 새 함수 json_validate()를 추가할 것을 제안합니다.</p><figure class="highlight php"><table><tr><td class="code"><pre><span class="line"><span class="title function_ invoke__">var_dump</span>(<span class="title function_ invoke__">json_validate</span>(<span class="string">&#x27;&#123; &quot;test&quot;: &#123; &quot;foo&quot;: &quot;bar&quot; &#125; &#125;&#x27;</span>)); <span class="comment">// true</span></span><br></pre></td></tr></table></figure><h2 id="📣-RFC-Improve-unserialize-error-handling-PHP-8-3"><a href="#📣-RFC-Improve-unserialize-error-handling-PHP-8-3" class="headerlink" title="📣 RFC: Improve unserialize() error handling #PHP 8.3"></a>📣 RFC: Improve unserialize() error handling #PHP 8.3</h2><p><a href="https://wiki.php.net/rfc/improve_unserialize_error_handling">RFC: unserialize() error handling 개선</a></p><p>Tim Düsterhus는 직렬화 해제가 실패할 때 throw되는 새로운 UnserializationFailedException 추가를 제안합니다.</p><figure class="highlight php"><table><tr><td class="code"><pre><span class="line"><span class="keyword">try</span> &#123;    <span class="variable">$result</span> = <span class="title function_ invoke__">unserialize</span>(<span class="variable">$serialized</span>);</span><br><span class="line">    <span class="title function_ invoke__">var_dump</span>(<span class="variable">$result</span>);</span><br><span class="line">&#125; <span class="keyword">catch</span> (\UnserializationFailureException <span class="variable">$e</span>) &#123;</span><br><span class="line">    <span class="comment">// unserialization failed</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="📣-RFC-StreamWrapper-Support-for-glob-PHP-8-3"><a href="#📣-RFC-StreamWrapper-Support-for-glob-PHP-8-3" class="headerlink" title="📣 RFC: StreamWrapper Support for glob() #PHP 8.3"></a>📣 RFC: StreamWrapper Support for glob() #PHP 8.3</h2><p><a href="https://wiki.php.net/rfc/glob_streamwrapper_support">RFC: glob()에 대한 StreamWrapper 지원</a></p><p>Timmy Almroth는 glob() 함수를 지원하는 StreamWrappers 구현을 제안합니다.</p><figure class="highlight php"><table><tr><td class="code"><pre><span class="line"><span class="title function_ invoke__">glob</span>(<span class="string">&#x27;vfs://*.ext&#x27;</span>)</span><br></pre></td></tr></table></figure><h2 id="☝️-RFC-Deprecations-for-PHP-8-3"><a href="#☝️-RFC-Deprecations-for-PHP-8-3" class="headerlink" title="☝️ RFC: Deprecations for PHP 8.3"></a>☝️ RFC: Deprecations for PHP 8.3</h2><p><a href="https://wiki.php.net/rfc/deprecations_php_8_3">RFC: Deprecations for PHP 8.3</a></p><p>PHP 8.3의 사용 중단(deprecation) 및 제거(removal)에 대해 고려해야 할 기능을 나열하는 포괄적인 RFC입니다.</p><ul><li>Passing negative $widths to mb_strimwidth()</li><li>The NumberFormatter::TYPE_CURRENCY constant</li><li>MT_RAND_PHP</li><li>Global Mersenne Twister</li></ul><h1 id="Tools"><a href="#Tools" class="headerlink" title="Tools"></a>Tools</h1><h2 id="play-phpsandbox-io"><a href="#play-phpsandbox-io" class="headerlink" title="play.phpsandbox.io"></a>play.phpsandbox.io</h2><p><a href="https://play.phpsandbox.io/">play.phpsandbox.io</a> – 아무것도 설치하지 않고 브라우저에서 바로 Composer 패키지를 사용해 보세요. 훌륭하네요!</p><h2 id="matthiasnoback-x2F-php-ast-inspector"><a href="#matthiasnoback-x2F-php-ast-inspector" class="headerlink" title="matthiasnoback&#x2F;php-ast-inspector"></a>matthiasnoback&#x2F;php-ast-inspector</h2><p><a href="https://github.com/matthiasnoback/php-ast-inspector/">matthiasnoback&#x2F;php-ast-inspector</a> – 추상 구문 트리를 위한 단계별 디버깅(step-debugger)을 지원하는 커맨드라인 도구입니다. <a href="https://matthiasnoback.nl/2022/09/a-step-debugger-for-the-php-ast/">사용하는 방법</a>.</p><h2 id="kladskull-x2F-xEroS"><a href="#kladskull-x2F-xEroS" class="headerlink" title="kladskull&#x2F;xEroS"></a>kladskull&#x2F;xEroS</h2><p><a href="https://github.com/kladskull/xEroS">kladskull&#x2F;xEroS</a> – 100% PHP로 작성된 비트코인과 유사한 블록체인. 교육용으로 좋습니다.</p><h2 id="sfx101-x2F-deck"><a href="#sfx101-x2F-deck" class="headerlink" title="sfx101&#x2F;deck"></a>sfx101&#x2F;deck</h2><p><a href="https://github.com/sfx101/deck">sfx101&#x2F;deck</a> – 클릭 한 번으로 Docker 기반 로컬 개발 환경을 가동할 수 있는 데스크탑 도구입니다.</p><h2 id="cspray-x2F-annotated-container"><a href="#cspray-x2F-annotated-container" class="headerlink" title="cspray&#x2F;annotated-container"></a>cspray&#x2F;annotated-container</h2><p>cspray&#x2F;annotated-container – PHP 8 Attribute를 사용해 자동 연결되고(autowired) 기능이 풍부한 PSR-11 호환 컨테이너를 만들기 위한 종속성 주입 프레임워크!</p><p>Spring Boot에서 영감을 받은 프로젝트라고 합니다.</p><figure class="highlight php"><table><tr><td class="code"><pre><span class="line"><span class="meta">&lt;?php</span> <span class="keyword">declare</span>(strict_types=<span class="number">1</span>);</span><br><span class="line"></span><br><span class="line"><span class="keyword">namespace</span> <span class="title class_">Acme</span>\<span class="title class_">AnnotatedContainerDemo</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">use</span> <span class="title">Cspray</span>\<span class="title">AnnotatedContainer</span>\<span class="title">Attribute</span>\<span class="title">Service</span>;</span><br><span class="line"></span><br><span class="line"><span class="meta">#[Service</span><span class="meta">]</span></span><br><span class="line"><span class="class"><span class="keyword">interface</span> <span class="title">BlobStorage</span> </span>&#123;</span><br><span class="line">    <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">store</span>(<span class="params"><span class="keyword">string</span> <span class="variable">$key</span>, <span class="keyword">string</span> <span class="variable">$contents</span></span>) : <span class="title">void</span></span>;</span><br><span class="line">    <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">retrieve</span>(<span class="params"><span class="keyword">string</span> <span class="variable">$key</span></span>) : ?<span class="title">string</span></span>;</span><br><span class="line"></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="meta">#[Service</span><span class="meta">]</span></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">FilesystemBlobStorage</span> <span class="keyword">implements</span> <span class="title">BlobStorage</span> </span>&#123;</span><br><span class="line">    <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">store</span>(<span class="params"><span class="keyword">string</span> <span class="variable">$key</span>, <span class="keyword">string</span> <span class="variable">$contents</span></span>) : <span class="title">void</span> </span>&#123;</span><br><span class="line">        <span class="title function_ invoke__">file_put_contents</span>(<span class="variable">$key</span>, <span class="variable">$contents</span>);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">retrieve</span>(<span class="params"><span class="keyword">string</span> <span class="variable">$key</span></span>) : ?<span class="title">string</span> </span>&#123;</span><br><span class="line">        <span class="keyword">return</span> @<span class="title function_ invoke__">file_get_contents</span>(<span class="variable">$key</span>) ?? <span class="literal">null</span>;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="meta">#[Service</span><span class="meta">]</span></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">BlobStorageConsumer</span> </span>&#123;</span><br><span class="line">    <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">__construct</span>(<span class="params"><span class="keyword">public</span> <span class="keyword">readonly</span> BlobStorage <span class="variable">$storage</span></span>) </span>&#123;&#125;</span><br><span class="line">    <span class="comment">// Some API methods that would interact with the BlobStorage instance</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="phparkitect-x2F-arkitect"><a href="#phparkitect-x2F-arkitect" class="headerlink" title="phparkitect&#x2F;arkitect"></a>phparkitect&#x2F;arkitect</h2><p><a href="https://github.com/phparkitect/arkitect">phparkitect&#x2F;arkitect</a> – 이 도구를 사용하면 PHP 코드베이스에 대한 아키텍처 제약 조건을 정의하여 CI에서 실행할 수 있습니다.</p><h2 id="openai-php-x2F-client"><a href="#openai-php-x2F-client" class="headerlink" title="openai-php&#x2F;client"></a>openai-php&#x2F;client</h2><p><a href="https://github.com/openai-php/client">openai-php&#x2F;client</a> – OpenAI API와 상호 작용할 수 있는 클라이언트입니다. </p><p>OpenAI의 GPT-3 API에 액세스하는 다른 방법이 필요한 경우 <a href="https://github.com/orhanerday/open-ai">orhanerday&#x2F;open-ai</a>도 있습니다.</p><h2 id="WordPress-x2F-wordpress-wasm"><a href="#WordPress-x2F-wordpress-wasm" class="headerlink" title="WordPress&#x2F;wordpress-wasm"></a>WordPress&#x2F;wordpress-wasm</h2><p><a href="https://github.com/WordPress/wordpress-wasm">WordPress&#x2F;wordpress-wasm</a> – WebAssembly 마법 덕분에 브라우저에서 WordPress를 실행합니다..</p><h2 id="nadrad-x2F-h-m-m"><a href="#nadrad-x2F-h-m-m" class="headerlink" title="nadrad&#x2F;h-m-m"></a>nadrad&#x2F;h-m-m</h2><p><a href="https://github.com/nadrad/h-m-m">nadrad&#x2F;h-m-m</a> – Hackers Mind Map – 마인드 맵 작업을 위한 간단하고 빠른 키보드 중심 터미널 기반 도구입니다.</p><p>흥미로운 점은 이것이 말 그대로 종속성이 없는 단일 PHP 파일이라는 것입니다!</p><p><img src="https://github.com/nadrad/h-m-m/blob/main/screenshot.png?raw=true" alt="h-m-m screenshot"></p><h1 id="Symfony"><a href="#Symfony" class="headerlink" title="Symfony"></a>Symfony</h1><h2 id="Revisiting-Lazy-Loading-Proxies-in-PHP-by-Nicolas-Grekas"><a href="#Revisiting-Lazy-Loading-Proxies-in-PHP-by-Nicolas-Grekas" class="headerlink" title="Revisiting Lazy-Loading Proxies in PHP by Nicolas Grekas."></a>Revisiting Lazy-Loading Proxies in PHP by Nicolas Grekas.</h2><p><a href="https://symfony.com/blog/revisiting-lazy-loading-proxies-in-php">PHP의 Lazy-Loading Proxies 재방문</a> by Nicolas Grekas.</p><p>Symfony 의 유지 관리 정책과 <a href="https://github.com/Ocramius/ProxyManager">ocramius&#x2F;proxy-manager</a>의 유지 관리 정책 사이의 비호환성 때문에 운영하는 포크(<a href="https://github.com/FriendsOfPHP/proxy-manager-lts/">friendsofphp&#x2F;proxy-manager-lts</a>)는 최대한 수정을 자제하고 있었지만, 최근 두가지 trait를 추가하게 된 배경을 설명합니다.</p><h2 id="Symfony-ParamConverter-the-best-friend-you-don’t-know-yet-by-Thomas-Bertrand"><a href="#Symfony-ParamConverter-the-best-friend-you-don’t-know-yet-by-Thomas-Bertrand" class="headerlink" title="Symfony ParamConverter: the best friend you don’t know yet by Thomas Bertrand."></a>Symfony ParamConverter: the best friend you don’t know yet by Thomas Bertrand.</h2><p><a href="https://medium.com/@ttbertrand/symfony-paramconverter-the-best-friend-you-dont-know-yet-c31ef2251683">Symfony ParamConverter: 아직 모르고 있지만 가장 친한 친구</a> by Thomas Bertrand.</p><h2 id="Designing-Symfony-Validator-the-TDD-way-by-Mike-Zukowsky"><a href="#Designing-Symfony-Validator-the-TDD-way-by-Mike-Zukowsky" class="headerlink" title="Designing Symfony Validator the TDD way by Mike Zukowsky."></a>Designing Symfony Validator the TDD way by Mike Zukowsky.</h2><p><a href="https://blog.devgenius.io/designing-a-symfony-validator-the-tdd-way-8cded85e88d1">TDD 방식으로 Symfony Validator를 디자인하기</a> by Mike Zukowsky.</p><h2 id="Solving-the-modern-applications-dilemma-with-Symfony-UX-by-Titouan-Galopin"><a href="#Solving-the-modern-applications-dilemma-with-Symfony-UX-by-Titouan-Galopin" class="headerlink" title="Solving the modern applications dilemma with Symfony UX by Titouan Galopin."></a>Solving the modern applications dilemma with Symfony UX by Titouan Galopin.</h2><p><a href="https://symfony.com/blog/solving-the-modern-applications-dilemma-with-symfony-ux">Symfony UX로 최신 애플리케이션 딜레마를 해결합니다</a> - by Titouan Galopin.</p><h2 id="Asserting-the-output-of-Symfony-console-commands-by-Andreas-Moller"><a href="#Asserting-the-output-of-Symfony-console-commands-by-Andreas-Moller" class="headerlink" title="Asserting the output of Symfony console commands by Andreas Möller."></a>Asserting the output of Symfony console commands by Andreas Möller.</h2><p><a href="https://localheinz.com/blog/2022/08/29/asserting-the-output-of-symfony-console-commands/">Symfony 콘솔 명령 출력 확인</a> by Andreas Möller.</p><h2 id="CQRS-with-Symfony-Messenger-by-Adrian-Garay"><a href="#CQRS-with-Symfony-Messenger-by-Adrian-Garay" class="headerlink" title="CQRS with Symfony Messenger by Adrian Garay."></a>CQRS with Symfony Messenger by Adrian Garay.</h2><p><a href="https://dev.to/adgaray/cqrs-with-symfony-messenger-2h3g">Symfony Messenger를 사용한 CQRS</a> by Adrian Garay.</p><h2 id="StenopePHP-x2F-Stenope"><a href="#StenopePHP-x2F-Stenope" class="headerlink" title="StenopePHP&#x2F;Stenope"></a>StenopePHP&#x2F;Stenope</h2><p><a href="https://github.com/StenopePHP/Stenope">StenopePHP&#x2F;Stenope</a> – Symfony용 정적 웹사이트 구축 도구. 본격적인 Symfony 앱을 만든 다음 원하는 위치에 정적 페이지로 배포할 수 있습니다.</p><h2 id="phpsword-x2F-sword-bundle"><a href="#phpsword-x2F-sword-bundle" class="headerlink" title="phpsword&#x2F;sword-bundle"></a>phpsword&#x2F;sword-bundle</h2><p><a href="https://github.com/phpsword/sword-bundle">phpsword&#x2F;sword-bundle</a> – Symfony를 사용한 최신 WordPress 개발. <a href="https://github.com/roots/bedrock/">roots&#x2F;bedrock</a>과 같은 추가 기능이 있는 WordPress 대신 Sword는 WordPress를 포함하는 Symfony 프레임워크입니다. <a href="https://getsword.com/guide/">Sword란 무엇입니까?</a>에서 자세히 알아보십시오.</p><h1 id="Laravel"><a href="#Laravel" class="headerlink" title="Laravel"></a>Laravel</h1><h2 id="👨‍🏫-Laracon-Online"><a href="#👨‍🏫-Laracon-Online" class="headerlink" title="👨‍🏫 Laracon Online"></a>👨‍🏫 Laracon Online</h2><p><a href="https://youtu.be/f4QShF42c6E">Laracon Online</a> - Laravel 커뮤니티의 모든 대화는 YouTube에서 볼 수 있습니다. 무엇보다도 Celeb Porzio는 <a href="https://www.youtube.com/watch?v=f4QShF42c6E&t=6014s">Livewire의 미래</a>를 발표했고 Taylor Otwell은 Laravel 팀의 새로운 학습 사이트인 <a href="https://laravel-news.com/laravel-bootcamp">Laravel Bootcamp</a>를 발표했습니다.</p><h2 id="📺-What’s-new-in-Laravel-9-31-0"><a href="#📺-What’s-new-in-Laravel-9-31-0" class="headerlink" title="📺 What’s new in Laravel 9.31.0"></a>📺 What’s new in Laravel 9.31.0</h2><p><a href="https://www.youtube.com/watch?v=Cag12UXFjtM">What’s new in Laravel</a> <a href="https://www.youtube.com/watch?v=xWPRcaHy3do">9.31.0</a> – Christoph Rumpel의 간결한 비디오 overview.</p><h2 id="Working-with-OS-process-in-PHP-by-Steve-King-McDougall"><a href="#Working-with-OS-process-in-PHP-by-Steve-King-McDougall" class="headerlink" title="Working with OS process in PHP by Steve (King) McDougall."></a>Working with OS process in PHP by Steve (King) McDougall.</h2><p><a href="https://laravel-news.com/working-with-os-process-in-php">PHP에서 OS 프로세스 작업</a> by Steve (King) McDougall.</p><h2 id="Drawbacks-behind-Laravel-Facades-by-Grzegorz-Korba"><a href="#Drawbacks-behind-Laravel-Facades-by-Grzegorz-Korba" class="headerlink" title="Drawbacks behind Laravel Facades by Grzegorz Korba."></a>Drawbacks behind Laravel Facades by Grzegorz Korba.</h2><p><a href="https://blog.codito.dev/2022/08/drawbacks-behind-laravel-facades/">Laravel Facade 이면의 단점</a> by Grzegorz Korba.</p><h2 id="A-Deep-Dive-Into-Laravel-Queues-by-Farhan-Hasin-Chowdhury"><a href="#A-Deep-Dive-Into-Laravel-Queues-by-Farhan-Hasin-Chowdhury" class="headerlink" title="A Deep Dive Into Laravel Queues by Farhan Hasin Chowdhury."></a>A Deep Dive Into Laravel Queues by Farhan Hasin Chowdhury.</h2><p><a href="https://www.honeybadger.io/blog/laravel-queues-deep-dive/">Laravel 대기열(Queue)에 대한 심층 분석</a> by Grzegorz Korba.</p><p>Laravel의 Job, Queue, Worker에 대한 완전한 가이드.</p><h2 id="Sammyjo20-x2F-laravel-haystack"><a href="#Sammyjo20-x2F-laravel-haystack" class="headerlink" title="Sammyjo20&#x2F;laravel-haystack"></a>Sammyjo20&#x2F;laravel-haystack</h2><p><a href="https://github.com/Sammyjo20/laravel-haystack">Sammyjo20&#x2F;laravel-haystack</a> – 매우 간단하지만 강력한 데이터베이스 기반 작업 체인입니다.</p><h2 id="dietercoopman-x2F-mailspfchecker"><a href="#dietercoopman-x2F-mailspfchecker" class="headerlink" title="dietercoopman&#x2F;mailspfchecker"></a>dietercoopman&#x2F;mailspfchecker</h2><p><a href="https://github.com/dietercoopman/mailspfchecker/">Dietercoopman&#x2F;mailspfchecker</a> – 주어진 이메일 주소를 대신하여 주어진 메일 서버를 통해 이메일을 보낼 수 있는지 확인하는 패키지 - <a href="https://laravel-news.com/mailspfchecker">사용법</a>.</p><h2 id="ksassnowski-x2F-venture-4-0-0"><a href="#ksassnowski-x2F-venture-4-0-0" class="headerlink" title="ksassnowski&#x2F;venture 4.0.0"></a>ksassnowski&#x2F;venture 4.0.0</h2><p><a href="https://github.com/ksassnowski/venture">ksassnowski&#x2F;venture</a> 4.0.0 – Laravel 앱에서 복잡한 비동기 워크플로를 만들고 관리하기 위한 패키지입니다.</p><h2 id="YorCreative-x2F-Laravel-Scrubber"><a href="#YorCreative-x2F-Laravel-Scrubber" class="headerlink" title="YorCreative&#x2F;Laravel-Scrubber"></a>YorCreative&#x2F;Laravel-Scrubber</h2><p><a href="https://github.com/YorCreative/Laravel-Scrubber">YorCreative&#x2F;Laravel-Scrubber</a> – 운영 보안 정책을 위반하는 민감한 정보가 개발자에 의해 실수로 또는 다른 방식으로 누출되는 것을 방지하는 패키지입니다. - <a href="https://laravel-news.com/laravel-scrubber">사용법</a>.</p><h2 id="hotmeteor-x2F-receiver"><a href="#hotmeteor-x2F-receiver" class="headerlink" title="hotmeteor&#x2F;receiver"></a>hotmeteor&#x2F;receiver</h2><p><a href="https://github.com/hotmeteor/receiver">hotmeteor&#x2F;receiver</a> – Laravel용 드롭인 웹훅 처리 라이브러리입니다.</p><h2 id="dedoc-x2F-scramble"><a href="#dedoc-x2F-scramble" class="headerlink" title="dedoc&#x2F;scramble"></a>dedoc&#x2F;scramble</h2><p><a href="https://github.com/dedoc/scramble">dedoc&#x2F;scramble</a> – Laravel용 자동 OpenAPI 문서 생성기. PHPDoc 주석이 필요하지 않습니다.</p><h2 id="findapr-io"><a href="#findapr-io" class="headerlink" title="findapr.io"></a>findapr.io</h2><p><a href="https://findapr.io/">findapr.io</a> – 기여할 오픈 소스 Laravel 및 PHP 프로젝트를 찾는 데 도움이 되는 사이트입니다.</p><h1 id="Other-Frameworks"><a href="#Other-Frameworks" class="headerlink" title="Other Frameworks"></a>Other Frameworks</h1><h2 id="spiral-x2F-framework-v3-0-0"><a href="#spiral-x2F-framework-v3-0-0" class="headerlink" title="spiral&#x2F;framework v3.0.0"></a>spiral&#x2F;framework v3.0.0</h2><p><a href="https://github.com/spiral/framework/releases/tag/3.0.0">spiral&#x2F;framework v3.0.0</a> - RoadRunner 제작자의 프레임워크 주요 업데이트.</p><p>PHP 8.1이 필요하며 새로운 필터 및 유효성 검사, 작업 직렬화, 오류 핸들러, 대기열 및 콘솔 인터셉터, 이벤트 디스패처(PSR-14), 주입 가능한 열거형, 더 유연한 라우터, 최적화된 부트로더 및 더 나은 성능을 제공합니다.</p><h2 id="Phalcon-PHP-Framework-reached-its-major-5-0-release"><a href="#Phalcon-PHP-Framework-reached-its-major-5-0-release" class="headerlink" title="Phalcon PHP Framework reached its major 5.0 release."></a>Phalcon PHP Framework reached its major 5.0 release.</h2><p><a href="https://github.com/phalcon/cphalcon">Phalcon PHP 프레임워크</a>가 major <a href="https://docs.phalcon.io/5.0/en/upgrade">5.0</a> 릴리스에 도달했습니다.<br>Phalcon은 PHP 확장으로 제공되기 때문에 독특한 프레임워크입니다. 그러나 <a href="https://blog.phalcon.io/post/phalcon-roadmap">로드맵</a>에 따르면 팀은 기존 모델로 전환하기로 결정했으며 다음 주요 릴리스는 PHP 패키지로 계획하고 있습니다.<br>5.0의 새로운 기능에 대한 자세한 목록은 <a href="https://docs.phalcon.io/5.0/en/upgrade">업그레이드</a> 페이지를 확인하십시오.</p><h2 id="api-platform-x2F-api-platform-3-0"><a href="#api-platform-x2F-api-platform-3-0" class="headerlink" title="api-platform&#x2F;api-platform 3.0"></a>api-platform&#x2F;api-platform 3.0</h2><p><a href="https://github.com/api-platform/api-platform/releases/tag/v3.0.0">api-platform&#x2F;api-platform 3.0</a> – Symfony를 기반으로 구축된 이 성숙한 프레임워크를 통해 REST 및 GraphQL API 등을 생성할 수 있습니다.</p><h2 id="Appwrite-1-0"><a href="#Appwrite-1-0" class="headerlink" title="Appwrite 1.0"></a>Appwrite 1.0</h2><p><a href="https://appwrite.io/1.0">Appwrite 1.0</a> – 최신 웹 또는 모바일 애플리케이션을 구축하는 데 필요한 API를 제공하는 오픈 소스 서비스로서의 백엔드 솔루션의 주요 안정적인 릴리스입니다.</p><p>작년에 Appwrite는 nginx+php-fpm에서 Swoole로 마이그레이션 하여 91%의 성능 향상을 경험했습니다.</p><p>James Brooks(@jbrooksuk) <a href="https://twitter.com/jbrooksuk/status/1572224525626122243">트윗</a></p><blockquote><p>어떤 프레임워크가 가장 좋은지 논하기에는 인생이 너무 짧습니다.<br>자신에게 좋은 것을 사용하고 계속 진행하십시오. 👍🏻</p></blockquote><h1 id="기타"><a href="#기타" class="headerlink" title="기타"></a>기타</h1><h2 id="Asymmetric-visions-by-Brent-Roose"><a href="#Asymmetric-visions-by-Brent-Roose" class="headerlink" title="Asymmetric visions by Brent Roose."></a>Asymmetric visions by Brent Roose.</h2><p>Brent Roose의 <a href="https://stitcher.io/blog/thoughts-on-asymmetric-visibility">비대칭 비전</a>.</p><p><a href="https://wiki.php.net/rfc/asymmetric-visibility">비대칭 가시성(Asymmetric Visibility) RFC</a>는 좋은 RFC이고 유연하고 <a href="https://stitcher.io/blog/php-81-readonly-properties">Readonly properties</a>을 완전히 대체합니다.<br>Brent가 우려하는 건 RFC 자체의 문제가 아니라 이 RFC가 readonly property를 완전히 대체하면서, readonly property가 사라질지 모르는 두려움이라고 합니다. 겨우 1년 전에 추가된 기능의 존속 여부가 불안해지는 것에 대한 우려이죠. 게다가 이미 작년에 <a href="https://wiki.php.net/rfc/property_accessors">Nikita의 유사한 아이디어</a>에 관해 많은 논의를 했었고, readonly property가 use case의 90%는 커버할 수 있고 이 정도면 충분다고 결론이 났다고 합니다. 비대칭 가시성은 2년 전 readonly property에 관해 많은 논의를 했을 때 결정했어야 할 문제라고 생각한다고 합니다.</p><p>이 글의 마지막에는 readonly가 해결하지 못하는 문제를 연구가 이루어지고 있다고 그 예시를 소개하기도 합니다.</p><h2 id="Increase-code-coverage-successively-by-Andreas-Heigl"><a href="#Increase-code-coverage-successively-by-Andreas-Heigl" class="headerlink" title="Increase code coverage successively by Andreas Heigl."></a>Increase code coverage successively by Andreas Heigl.</h2><p>Andreas Heigl의 <a href="https://andreas.heigl.org/2022/08/28/increase-code-coverage-successively/">코드 coverage 범위를 연속적으로 늘리십시오</a>.</p><p>phpcov를 이용해 새로 기여한 코드에 대한 테스트를 포함하도록 강제하는 방법을 소개합니다.</p><h2 id="Testing-Randomness-of-PHP-Random-Number-Functions-by-Ayesh-Karunaratne"><a href="#Testing-Randomness-of-PHP-Random-Number-Functions-by-Ayesh-Karunaratne" class="headerlink" title="Testing Randomness of PHP Random Number Functions by Ayesh Karunaratne."></a>Testing Randomness of PHP Random Number Functions by Ayesh Karunaratne.</h2><p>Ayesh Karunaratne의 <a href="https://php.watch/articles/testing-php-rand-functions">PHP 난수 함수의 무작위성 테스트</a>.</p><p>운영 체제나 프로그래밍 언어 런타임은 다양한 알고리즘을 사용하여 난수를 생성합니다. 동전 던지기처럼 실생활에서 볼 수 있는 진짜 난수 생성기에 비해 이런 의사(Pseudo) RNG(난수생성기, Random Number Generator)는 초기 “시드” 값에 의존하고 초기 시드 값과 알고리즘을 아는 것만으로도 난수의 전체 스트림을 예측하기에 충분합니다.</p><p>이 글에서 PHP 8.2 이후 제공되는 난수 생성기의 무작위성을 측정하기 위해 GD 확장을 사용해 임의의 X 및 Y 좌표에 단일 픽셀을 배치하여 이미지를 그립니다.<br>미리 결정된 시도 횟수에서 대부분 픽셀 분포가 균일한 이미지는 “진정한” RNG에 가까운 난수 생성기를 나타냅니다. 순수하게 시드 값을 기반으로 하는 값을 생성하는 RNG(예: Mersenne Twister)는 시드가 동일하게 유지되는 경우 동일한 출력을 생성해야 합니다.</p><p>다양한 RNG를 소개하고 실험하지만 마지막에는 <a href="https://php.watch/articles/testing-php-rand-functions#random_int">random_int&#x2F;random_bytes</a>를 추천하네요.</p><blockquote><p>모든 난수 생성 목적에 대해 random_int 및 random_bytes 함수를 사용하는 것은, 예외로 실패하기도 하고(안전하지 않은 알고리즘을 자동으로 기본값으로 설정하는 대신) PHP 7.0 이후의 모든 PHP 버전에서 지원되기 때문에 권장됩니다.</p></blockquote><h2 id="Granular-interfaces-by-Sebastian-De-Deyne"><a href="#Granular-interfaces-by-Sebastian-De-Deyne" class="headerlink" title="Granular interfaces by Sebastian De Deyne."></a>Granular interfaces by Sebastian De Deyne.</h2><p>Sebastian De Deyne의 <a href="https://sebastiandedeyne.com/granular-interfaces/">세분화된 인터페이스</a>.</p><p><a href="https://en.wikipedia.org/wiki/Interface_segregation_principle">SOLID의 I</a>에 관한 글.</p><h2 id="Adding-the-last-types-to-PHP-code-by-Damien-Seguy"><a href="#Adding-the-last-types-to-PHP-code-by-Damien-Seguy" class="headerlink" title="Adding the last types to PHP code by Damien Seguy."></a>Adding the last types to PHP code by Damien Seguy.</h2><p>Damien Seguy의 <a href="https://www.exakat.io/en/adding-the-last-types-to-php-code/">PHP 코드에 마지막 유형 추가하기</a>.</p><p>99.9% 타이핑을 향한 여정은 예상보다 길었고 몇 가지 가벼운 함정이 나타났습니다.</p><ul><li>보이지 않는 유형</li><li>이전보다 더 많은 캐스팅</li><li>기본값 처리</li><li>임시값 관리</li><li>resource와의 씨름</li><li>캐시 메커니즘으로 저글링</li></ul><h2 id="The-three-nothings-of-PHP-by-Damien-Seguy-explaining-the-difference-between-null-void-and-uninitialized"><a href="#The-three-nothings-of-PHP-by-Damien-Seguy-explaining-the-difference-between-null-void-and-uninitialized" class="headerlink" title="The three nothings of PHP by Damien Seguy explaining the difference between null, void, and uninitialized."></a>The three nothings of PHP by Damien Seguy explaining the difference between null, void, and uninitialized.</h2><p>Damien Seguy의 <a href="https://www.exakat.io/en/the-three-nothings-of-php/">PHP의 세 가지 빈 값(nothing)</a> : null, void, uninitialized의 차이점을 설명.</p><h2 id="Is-it-a-DTO-or-a-Value-Object-by-Matthias-Noback"><a href="#Is-it-a-DTO-or-a-Value-Object-by-Matthias-Noback" class="headerlink" title="Is it a DTO or a Value Object? by Matthias Noback."></a>Is it a DTO or a Value Object? by Matthias Noback.</h2><p><a href="https://matthiasnoback.nl/2022/09/is-it-a-dto-or-a-value-object/">그건 DTO입니까? Value Object입니까?</a> by Matthias Noback.</p><p>Matthias Noback의 기준</p><ul><li>DTO<ul><li>원시 데이터(문자열, 부울, 부동 소수점, null, 이러한 것들의 배열)를 보유하는 객체</li><li>비즈니스 관점에서 실제로 의미가 있다고 보장하지 않음</li><li>값의 정확성에 대한 보증을 제공하지 않음 : 문자열은 비어 있을 수 있고, 정수는 음수일 수 있습니다</li><li>DTO는 데이터가 애플리케이션에 들어가는 위치와 애플리케이션을 나가는 위치의 두 곳에서만 사용해야 합니다</li></ul></li><li>Value Object<ul><li>하나 이상의 값 또는 값 객체를 래핑 하는 객체</li><li>도메인 관점에서 의미가 있음을 보장</li><li>값의 정확성에 대한 증거를 제공 : 문자열은 더 이상 비어 있지 않으며 숫자가 올바른 범위에 있는지 확인됩니다</li><li>값 객체는 값이 우리의 기대와 일치하는지 확인하고 다시 확인하고 싶지 않은 모든 위치에 사용됩니다</li></ul></li></ul><p>참고 : <a href="https://martinfowler.com/bliki/ValueObject.html">ValueObject</a> by Martin Fowler</p><h2 id="Can-we-consider-DateTimeImmutable-a-primitive-type"><a href="#Can-we-consider-DateTimeImmutable-a-primitive-type" class="headerlink" title="Can we consider DateTimeImmutable a primitive type?"></a>Can we consider DateTimeImmutable a primitive type?</h2><p><a href="https://matthiasnoback.nl/2022/09/can-we-consider-datetimeimmutable-a-primitive-type/">DateTimeImmutable을 원시(primitive) type으로 고려할 수 있습니까?</a></p><p>Matthias Noback은 “그렇지 않다”고 결론지었습니다. Andreas Möller는 더 나아가 자신의 <a href="https://localheinz.com/blog/2022/09/20/enhancing-types/">Enhancing types</a> 블로그 게시물에서 그건 <code>단순한(simple) type</code>이라고 제안합니다.</p><p>바로 위 Matthias Noback의 글에서 DTO가 오직 원시(primitive) type의 값만 보유한다고 했는데, 그렇다면 DateTimeImmutable도 원시 type으로 분류할 수 있는지 고찰하는 글입니다. </p><p>이어 소개된 Andreas Möller의 글에서는 “정교한(sophisticated) 원시 type” 혹은 “단순한(simple) type”으로 부를 수 있을 것이라고 이야기 합니다. <a href="https://twitter.com/jitterted">Ted M. Young</a>은 이를 비제약 type이라고 표현하며 원시 type에 대한 집착을 버려라는 발표(<a href="https://speakerdeck.com/jitterted/stop-obsessing-about-primitives">Stop Obsessing About Primitives</a>])를 하기도 했습니다.<br>글 마지막에 소개된 것처럼 원시 type에 집착하지 않고, 더 적절한 type을 찾아갈 필요가 있습니다.</p><h2 id="Named-arguments-by-Sebastian-De-Deyne"><a href="#Named-arguments-by-Sebastian-De-Deyne" class="headerlink" title="Named arguments by Sebastian De Deyne."></a>Named arguments by Sebastian De Deyne.</h2><p>Sebastian De Deyne의 <a href="https://sebastiandedeyne.com/named-arguments/">명명된 인수(Named arguments)</a>.</p><h2 id="How-PHP-engine-builds-AST-by-Anton-Sukhachev"><a href="#How-PHP-engine-builds-AST-by-Anton-Sukhachev" class="headerlink" title="How PHP engine builds AST by Anton Sukhachev."></a>How PHP engine builds AST by Anton Sukhachev.</h2><p><a href="https://dev.to/mrsuh/how-php-engine-builds-ast-1nc4">PHP 엔진이 AST 를 구축하는 방법</a> by Anton Sukhachev.</p><h2 id="Pholyglot-PHP-to-PHP-C-polyglot-transpiler"><a href="#Pholyglot-PHP-to-PHP-C-polyglot-transpiler" class="headerlink" title="Pholyglot (PHP to PHP+C polyglot transpiler)"></a>Pholyglot (PHP to PHP+C polyglot transpiler)</h2><p><a href="https://olleharstedt.github.io/programming/2022/06/11/pholyglot-php-to-php-c-transpiler.html">Pholyglot (PHP에서 PHP+C로의 다중 언어 번역기)</a> – PHP의 하위 집합을 입력으로 사용하고 PHP와 C 모두에서 실행할 수 있는 다중 언어 코드를 출력하는 작은 취미 프로젝트 변환기입니다.</p><h2 id="Plotting-the-memory-of-a-PHP-process-with-Gnuplot-by-Gregoire-Paris"><a href="#Plotting-the-memory-of-a-PHP-process-with-Gnuplot-by-Gregoire-Paris" class="headerlink" title="Plotting the memory of a PHP process with Gnuplot by Grégoire Paris."></a>Plotting the memory of a PHP process with Gnuplot by Grégoire Paris.</h2><p><a href="https://dev.to/manomano-tech-team/plotting-the-memory-of-a-php-process-with-gnuplot-3k02">Gnuplot로 PHP 프로세스의 메모리를 플로팅하기</a> by Grégoire Paris.</p><p><a href="http://www.gnuplot.info/">Gnuplot</a>는 “a portable command-line driven graphing utility”라고 합니다.</p><h2 id="Say-hello-to-TLDR"><a href="#Say-hello-to-TLDR" class="headerlink" title="Say hello to TLDR"></a>Say hello to TLDR</h2><p>Marcel Pociot(@marcelpociot)의 <a href="https://twitter.com/marcelpociot/status/1572690548074348549">트윗</a></p><blockquote><p>특정 코드 조각이 무엇을 하는지 궁금해 한 적이 있습니까?</p></blockquote><p><a href="https://plugins.jetbrains.com/plugin/20050-tldr">TLDR</a> plugin을 확인해보세요.</p><p><img src="https://tldrdev.ai/_next/image?url=/_next/static/media/hero_dark.fcaf0e95.png&w=3840&q=75" alt="TLDR 이미지"></p><h1 id="Video"><a href="#Video" class="headerlink" title="Video"></a>Video</h1><h2 id="📺-PHP-For-Beginners"><a href="#📺-PHP-For-Beginners" class="headerlink" title="📺 PHP For Beginners"></a>📺 PHP For Beginners</h2><p><a href="https://laracasts.com/series/php-for-beginners-2023-edition">초심자를 위한 PHP</a> – 누군가가 “2022년에 PHP를 어떻게 배우나요?”라고 묻는다면 Jeffrey Way의 이 과정이 답입니다.</p><h2 id="📺-PHP-in-1-minute-by-Brent-Roose"><a href="#📺-PHP-in-1-minute-by-Brent-Roose" class="headerlink" title="📺 PHP in 1 minute by Brent Roose."></a>📺 PHP in 1 minute by Brent Roose.</h2><p><a href="https://www.youtube.com/watch?v=ppBhz7KMjWc">1분 동안 살펴보는 모던 PHP</a> by Brent Roose.</p><blockquote><p>PHP is not dead.</p></blockquote><h2 id="📺-PHP-is-breaking-my-code-by-Brent-Roose"><a href="#📺-PHP-is-breaking-my-code-by-Brent-Roose" class="headerlink" title="📺 PHP is breaking my code! by Brent Roose."></a>📺 PHP is breaking my code! by Brent Roose.</h2><p><a href="https://youtu.be/dzf0Du1W4DQ">PHP가 내 코드를 깨고 있습니다!</a> by Brent Roose.</p><blockquote><p>동적 속성은 PHP 8.2에서 더 이상 사용되지 않으며 커뮤니티는 이에 대해 분열되어 있습니다.</p></blockquote><h2 id="📺-Pest-From-Scratch-with-Luke-Downing"><a href="#📺-Pest-From-Scratch-with-Luke-Downing" class="headerlink" title="📺 Pest From Scratch with Luke Downing."></a>📺 Pest From Scratch with Luke Downing.</h2><p><a href="https://laracasts.com/series/pest-from-scratch">처음부터 따라하는 Pest</a> with Luke Downing.</p><h1 id="Conferences"><a href="#Conferences" class="headerlink" title="Conferences"></a>Conferences</h1><p>대면 이벤트가 한창입니다. 다음의 대규모 PHP 행사를 확인하세요.</p><ul><li><a href="https://event.afup.org/">ForumPHP</a> – 디즈니랜드 파리(프랑스), 10월 13-14일.</li><li><a href="https://phpconference.com/munich">국제 PHP 컨퍼런스</a> – 뮌헨(독일), 10월 24-28일.</li><li><a href="https://www.longhornphp.com/php-is-the-right-choice-in-2022-and-beyond">Longhorn PHP</a> – 텍사스 오스틴(미국), 11월 3 ~ 5일.</li><li><a href="https://live.symfony.com/2022-paris-con/">SymfonyCon</a> – 디즈니랜드 파리(프랑스), 11월 17-18일.</li><li><a href="https://www.phpconference.co.uk/">PHP UK 컨퍼런스</a> – 런던(영국), 2023년 2월 14 ~ 16일.</li></ul><p><a href="https://friendsofphp.org/">다음 PHP 밋업이 언제인지</a> 궁금 하시다면? – Tomas Votruba는 그의 사랑스러운 <a href="https://friendsofphp.org/">friendsofphp.org</a> 모임 수집기로 여러분을 안내합니다.</p>]]></content>
    
    
      
      
        
        
    <summary type="html">&lt;p&gt;&lt;img src=&quot;https://blog.jetbrains.com/wp-content/uploads/2022/08/php-annotated-blog-featured-image-1280x600-1.png&quot; alt=&quot;PHP Annotated</summary>
        
      
    
    
    
    
    <category term="PHP" scheme="https://haah.kr/tags/PHP/"/>
    
    <category term="php-annotated" scheme="https://haah.kr/tags/php-annotated/"/>
    
    <category term="php-annotated-monthly" scheme="https://haah.kr/tags/php-annotated-monthly/"/>
    
  </entry>
  
  <entry>
    <title>PHP Annotated – August 2022</title>
    <link href="https://haah.kr/2022/08/25/php-annotated-august-2022/"/>
    <id>https://haah.kr/2022/08/25/php-annotated-august-2022/</id>
    <published>2022-08-25T04:43:12.000Z</published>
    <updated>2026-05-31T19:29:57.258Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://blog.jetbrains.com/wp-content/uploads/2022/08/php-annotated-blog-featured-image-1280x600-1.png" alt="PHP Annotated 이미지"></p><p><a href="https://blog.jetbrains.com/author/rpronskiy">Roman Pronskiy</a>가 쓰고 JetBrains에서 제공하는 PHP Annotated <a href="https://blog.jetbrains.com/phpstorm/2022/08/php-annotated-august-2022/">2022년 8월</a>의 번역&#x2F;해석본입니다.</p><p>이 중에서 몇 가지 제 취향껏 골라 그 안의 내용도 좀 뒤져보고 개발새발 번역해서 소개합니다.</p><hr><p>안녕하세요!</p><p>PHP Annotated 8월호에 오신 것을 환영합니다. 여기에서 선별된 뉴스, 기사, 도구 및 비디오를 포함하여 지난 한 달 동안 PHP 세계에서 일어난 가장 흥미로운 일을 따라잡을 것입니다.</p><h1 id="News"><a href="#News" class="headerlink" title="News"></a>News</h1><h2 id="PHP-8-2-Beta-3-has-been-released"><a href="#PHP-8-2-Beta-3-has-been-released" class="headerlink" title="PHP 8.2 Beta 3 has been released"></a>PHP 8.2 Beta 3 has been released</h2><p><a href="https://www.php.net/archive/2022.php#2022-08-18-1">PHP 8.2 베타 3</a>가 출시되었습니다. </p><p>최종 베타가 <a href="https://wiki.php.net/todo/php82">예정대로</a> 출시되었습니다. 다음 릴리스는 PHP 8.2.0 RC 1이며 9월 1일에 릴리스될 예정입니다.</p><p>PHP 8.2에서 <a href="https://stitcher.io/blog/deprecated-dynamic-properties-in-php-82">더 이상 사용되지 않는 동적 속성(property)</a>을 처리하는 방법을 확인하십시오 .</p><p>PHP 8.2에 추가될 기능에 대한 자세한 목록은 <a href="https://php.watch/versions/8.2">PHP.Watch</a> 또는 <a href="https://stitcher.io/blog/new-in-php-82">stitcher.io</a>를 참조하십시오 .</p><p>또한 플래시 뉴스레터인 <a href="https://stitcher.io/blog/road-to-php-82">The Road to PHP 8.2</a>를 확인하십시오 .</p><h2 id="PHP-8-0-22-and-PHP-8-1-9-have-been-released"><a href="#PHP-8-0-22-and-PHP-8-1-9-have-been-released" class="headerlink" title="PHP 8.0.22 and PHP 8.1.9 have been released"></a>PHP 8.0.22 and PHP 8.1.9 have been released</h2><p><a href="https://www.php.net/archive/2022.php#2022-08-04-1">PHP 8.0.22</a> 및 <a href="https://www.php.net/archive/2022.php#2022-08-04-3">PHP 8.1.9</a>가 릴리스되었습니다.</p><p>🪲현재 지원되는 브랜치에 대한 버그 수정 릴리스입니다.</p><h2 id="PHP-Foundation-Update-July-2022"><a href="#PHP-Foundation-Update-July-2022" class="headerlink" title="PHP Foundation Update, July 2022"></a>PHP Foundation Update, July 2022</h2><p><a href="https://thephp.foundation/blog/2022/08/04/php-foundation-update-july-2022/">PHP 재단 업데이트, 2022년 7월</a></p><p>후원자를 위한 월간 업데이트를 확인하십시오.</p><h2 id="Composer-2-4-is-out"><a href="#Composer-2-4-is-out" class="headerlink" title="Composer 2.4 is out"></a>Composer 2.4 is out</h2><p><a href="https://blog.packagist.com/composer-2-4/">Composer 2.4가 출시 되었습니다.</a></p><p>종속성의 보안 상태를 추적(audit), bash 자동 완성 및 여러 작은 변경 사항이 추가됐습니다.</p><p>두 가지 새로운 명령에 대해 자세히 알아보세요: <a href="https://php.watch/articles/composer-audit">audit</a> 및 <a href="https://php.watch/articles/composer-bump">bump</a>.</p><h2 id="deployphp-x2F-deployer-7-0-0-is-out"><a href="#deployphp-x2F-deployer-7-0-0-is-out" class="headerlink" title="deployphp&#x2F;deployer 7.0.0 is out"></a>deployphp&#x2F;deployer 7.0.0 is out</h2><p><a href="https://github.com/deployphp/deployer/releases/tag/v7.0.0">deployphp&#x2F;deployer 7.0.0</a>이 출시되었습니다.</p><p>Deployer는 널리 사용되는 프레임워크를 지원하는 PHP로 작성된 배포 도구입니다.</p><p>v.7의 가장 큰 변화 중 하나는 새로운 공급 레시피입니다. 프로비저닝 레시피는 PHP 애플리케이션을 실행하기 위한 모든 VPS를 자동으로 설치하고 구성할 수 있습니다. 웹 서버, SSL, PHP, Redis, 노드 등을 설치합니다.</p><h2 id="Codeception-x2F-Codeception-5-0-0-is-out"><a href="#Codeception-x2F-Codeception-5-0-0-is-out" class="headerlink" title="Codeception&#x2F;Codeception 5.0.0 is out"></a>Codeception&#x2F;Codeception 5.0.0 is out</h2><p><a href="https://codeception.com/07-28-2022/codeception-5.html">Codeception&#x2F;Codeception 5.0.0</a>이 출시되었습니다.</p><p>Attribute, PHP 8 지원, 샤딩 및 기타 기능이 추가되었습니다!</p><h2 id="swoole-x2F-swoole-src-5-0-0-is-out"><a href="#swoole-x2F-swoole-src-5-0-0-is-out" class="headerlink" title="swoole&#x2F;swoole-src 5.0.0 is out"></a>swoole&#x2F;swoole-src 5.0.0 is out</h2><p><a href="https://github.com/swoole/swoole-src">swoole&#x2F;swoole-src</a> 5.0.0이 출시되었습니다. </p><p>동시성 확장의 새 버전은 향상된 타입 시스템, 모든 함수의 매개변수 및 반환 값에 대한 타입 추가, 최적화된 오류 처리 및 기타 개선 사항 및 추가 사항과 함께 제공됩니다.</p><h2 id="PhpStorm-2022-2-released"><a href="#PhpStorm-2022-2-released" class="headerlink" title="PhpStorm 2022.2 released"></a>PhpStorm 2022.2 released</h2><p><a href="https://jetbrains.com/phpstorm/whatsnew/2022-2/">PhpStorm 2022.2 출시</a></p><p>이 주요 업데이트는 Mockery 및 Rector 지원, 제네릭 및 열거형 지원 강화, 디버거 및 HTTP 클라이언트 개선 등을 제공합니다.</p><p><a href="https://www.youtube.com/watch?v=d0lwc6yjFlc">🎬 PhpStorm 2022.2의 새로운 기능</a>에 대한 비디오 개요를 시청 하세요.</p><p>그리고 막 <a href="https://blog.jetbrains.com/phpstorm/2022/08/what-s-next-phpstorm-2022-3-roadmap/">PhpStorm 2022.3 로드맵</a>이 게시했습니다.</p><ul><li>PHP 8.2</li><li>Code Vision for PHP</li><li>Quick-fix preview</li><li>ParaTest support</li><li>…</li></ul><h1 id="PHP-Core"><a href="#PHP-Core" class="headerlink" title="PHP Core"></a>PHP Core</h1><p>Core 뉴스의 대부분은 PHP Foundation의 <a href="https://thephp.foundation/blog/tag/roundup/">PHP Core Roundup 시리즈</a>에서 자세히 다룹니다 . 이 시리즈의 다섯 번째 에피소드가 곧 출시될 예정이므로 간략하게만 언급하겠습니다.</p><h2 id="RFC-Asymmetric-Visibility-PHP-8-3"><a href="#RFC-Asymmetric-Visibility-PHP-8-3" class="headerlink" title="RFC: Asymmetric Visibility #PHP 8.3"></a>RFC: Asymmetric Visibility #PHP 8.3</h2><p><a href="https://wiki.php.net/rfc/asymmetric-visibility">https://wiki.php.net/rfc/asymmetric-visibility</a></p><p>이전에 Nikita Popov는 C#과 같은 <a href="https://wiki.php.net/rfc/property_accessors">속성(property) 접근자 구현을 제안했습니다</a>. 그 RFC는 토론 단계를 통과하지 못했습니다. 대신 읽기 전용 속성이 승인되었습니다.</p><p>이번에 Ilija Tovilo와 Larry Garfield는 속성이 읽기 및 쓰기 작업에 대해 별도의(“비대칭”) 가시성을 가질 수 있도록 Swift와 유사한 구문을 추가할 것을 제안합니다.</p><figure class="highlight php"><table><tr><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Foo</span></span>&#123;</span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">private</span>(set) <span class="keyword">string</span> <span class="variable">$bar</span>,</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>Larry의 몇 가지 <a href="https://externals.io/message/118353">메모</a>:</p><ul><li>읽기 전용 속성의 복제 가능성 문제를 해결합니다.</li><li>읽기 전용 속성의 상속 문제을 수정합니다. 지금은 readonly는 private 범위에서만 설정할 수 있고 protected 범위에서는 설정할 수 없습니다.</li><li>다른 속성으로부터 재생성된 속성에 유용할 것입니다. 예를 들어, <code>$o-&gt;setFirstName()</code> 혹은 <code>$o-&gt;setLastName()</code>이 호출될 때마다 내부적으로 업데이트되는 <code>public private(set) $fullName</code>. 이는 향후 로드맵에 있는 접근자 hook에 적용될 수 있습니다.</li></ul><h1 id="Tools"><a href="#Tools" class="headerlink" title="Tools"></a>Tools</h1><h2 id="serversideup-x2F-docker-php"><a href="#serversideup-x2F-docker-php" class="headerlink" title="serversideup&#x2F;docker-php"></a>serversideup&#x2F;docker-php</h2><p><a href="https://github.com/serversideup/docker-php">serversideup&#x2F;docker-php</a> – PHP용 프로덕션에 바로 사용 가능한 도커 이미지. Laravel, WordPress 등에 최적화되었습니다.</p><h2 id="Crell-x2F-Serde"><a href="#Crell-x2F-Serde" class="headerlink" title="Crell&#x2F;Serde"></a>Crell&#x2F;Serde</h2><p><a href="https://github.com/Crell/Serde">Crell&#x2F;Serde</a> – PHP 8용 강력한 Serde(직렬화&#x2F;역직렬화) 라이브러리입니다. 자세한 내용은 Larry Garfield의 <a href="https://peakd.com/hive-168588/@crell/php-serde">소개 게시물</a>을 참조 하세요.</p><h2 id="statix-php-x2F-server"><a href="#statix-php-x2F-server" class="headerlink" title="statix-php&#x2F;server"></a>statix-php&#x2F;server</h2><p><a href="https://github.com/statix-php/server">statix-php&#x2F;server</a> – PHP의 내장 서버를 둘러싼 객체 지향 래퍼입니다.</p><h2 id="aimeos-x2F-map"><a href="#aimeos-x2F-map" class="headerlink" title="aimeos&#x2F;map"></a>aimeos&#x2F;map</h2><p><a href="https://github.com/aimeos/map">aimeos&#x2F;map</a> – PHP 배열 및 컬렉션이 쉬워졌습니다. 또 다른 Laravel과 유사한 컬렉션 패키지이지만 종속성이 없습니다.</p><h2 id="hotmeteor-x2F-spectator"><a href="#hotmeteor-x2F-spectator" class="headerlink" title="hotmeteor&#x2F;spectator"></a>hotmeteor&#x2F;spectator</h2><p><a href="https://github.com/hotmeteor/spectator">hotmeteor&#x2F;spectator</a> – PHP용 OpenAPI 테스트.</p><h2 id="DaveLiddament-x2F-sarb"><a href="#DaveLiddament-x2F-sarb" class="headerlink" title="DaveLiddament&#x2F;sarb"></a>DaveLiddament&#x2F;sarb</h2><p><a href="https://github.com/DaveLiddament/sarb">DaveLiddament&#x2F;sarb</a> – 이 도구는 PHP 정적 분석기에 대한 기준점(baseline) 기능을 제공합니다(기준점 이후에 발생한 문제만 리포트).<br>v1.5.0에서는 –clean-up옵션을 제공합니다. 여기에는 코드 품질을 점진적으로 개선하기 위해 수정해야 할 5가지 임의 문제가 나열되어 있습니다.</p><h2 id="leafsphp-x2F-leaf"><a href="#leafsphp-x2F-leaf" class="headerlink" title="leafsphp&#x2F;leaf"></a>leafsphp&#x2F;leaf</h2><p><a href="https://github.com/leafsphp/leaf">leafsphp&#x2F;leaf</a> – 웹 앱과 API를 빠르게 생성하기 위한 간단하지만 강력한 마이크로 프레임워크입니다.</p><h2 id="pheature-flags-x2F-pheature-flags"><a href="#pheature-flags-x2F-pheature-flags" class="headerlink" title="pheature-flags&#x2F;pheature-flags"></a>pheature-flags&#x2F;pheature-flags</h2><p><a href="https://github.com/pheature-flags/pheature-flags">pheature-flags&#x2F;pheature-flags</a> – 제어된 조건에서 특정 기능을 활성화 및 비활성화할 수 있는 릴리스 관리 시스템입니다.</p><h2 id="gakowalski-x2F-alternative-interpreters"><a href="#gakowalski-x2F-alternative-interpreters" class="headerlink" title="gakowalski&#x2F;alternative-interpreters"></a>gakowalski&#x2F;alternative-interpreters</h2><p><a href="https://github.com/gakowalski/alternative-interpreters">gakowalski&#x2F;alternative-interpreters</a> – 대체 PHP 인터프리터, 컴파일러 및 트랜스파일러 목록입니다.</p><h1 id="Symfony"><a href="#Symfony" class="headerlink" title="Symfony"></a>Symfony</h1><h2 id="symfony-x2F-clock"><a href="#symfony-x2F-clock" class="headerlink" title="symfony&#x2F;clock"></a>symfony&#x2F;clock</h2><p><a href="https://github.com/symfony/clock">symfony&#x2F;clock</a>은 시스템 시계(clock)에서 응용 프로그램을 분리하는 새로운 컴포넌트입니다.</p><p>그것의 릴리스는 <a href="https://twitter.com/matthiasnoback/status/1540264968419004419">프레임워크 제국주의</a>(무료로 어떤 것을 취한 다음 자기 것이라고 우기는 현상)에 대해 Symfony를 비난하는 짧은 트윗 폭풍을 일으켰습니다.</p><p>Frank de Jonge(@frankdejonge)의 <a href="https://twitter.com/frankdejonge/status/1554382348724076544">트윗</a></p><blockquote><p>솔직히, @symfony 가 커뮤니티 패키지를 수용하는 대신 시계를 만드는 것은 나를 슬프게 만듭니다. 그들은 NIH 증후군으로 계속 고통 받고 있습니다. 말 그대로 3(?) 시계 패키지와 동일한 인터페이스입니다. Symfony는 아마도 그들의 인기가 떨어지게 할 것입니다.</p></blockquote><p>참고 : NIH 증후군(Not invented here syndrome)은 말 그대로 ‘여기서 개발한 것이 아니다.’(Not invented here)라는 의미로, 제3자가 개발한 기술이나 연구 성과는 인정하지 않는 배타적 조직 문화 또는 그러한 태도를 말한다. - <a href="https://ko.wikipedia.org/wiki/NIH_%EC%A6%9D%ED%9B%84%EA%B5%B0">위키백과</a></p><p>taylor otwell(@taylorotwell)의 <a href="https://twitter.com/taylorotwell/status/1554590443857379331">트윗</a></p><blockquote><p>Symfony가 왜 그렇게 하는지 전혀 읽지 않았지만 난 여기에 돈을 걸 것입니다. 1) 그건 사소합니다. 2) They don’t want to have to bug an outside rando with a day job and 1,000 other concerns to update PHP versions, fix bugs, etc. anytime something comes up.(역자 주: 해석 포기)</p></blockquote><p>Nicolas Grekas(@nicolasgrekas)의 <a href="https://twitter.com/nicolasgrekas/status/1554746882861187072">트윗</a></p><ul><li>Nicolas는 Symfony OSS core contributor입니다.</li></ul><blockquote><p><a href="https://en.wikipedia.org/wiki/Package_principles">Package Principles</a>는 읽을 가치가 있을 것입니다. 예를 들어 Stable-Dependencies Principle이 새로운 #Symfony Clock 구성 요소에 대한 논의에 한 눈에 적용해볼 수 있습니다.</p></blockquote><p><a href="https://en.wikipedia.org/wiki/Package_principles">Package Principles</a>에서 이야기 하는 Stable-Dependencies Principle </p><ul><li>디자인은 사용되는 환경의 특성에 따라 변화하고 있습니다. 따라서 패키지 디자인도 변화를 지원해야 합니다. SDP는 휘발성을 원하는 패키지가 변경하기 어려운 패키지에 의존해서는 안 된다고 명시하고 있습니다.</li></ul><h2 id="8-News-in-Config-Transformer-that-Converts-Symfony-YML-to-PHP-by-Tomas-Votruba"><a href="#8-News-in-Config-Transformer-that-Converts-Symfony-YML-to-PHP-by-Tomas-Votruba" class="headerlink" title="8 News in Config Transformer that Converts Symfony YML to PHP by Tomas Votruba."></a>8 News in Config Transformer that Converts Symfony YML to PHP by Tomas Votruba.</h2><p><a href="https://tomasvotruba.com/blog/8-news-in-config-transformer-that-converts-symfony-yml-to-php/">Symfony YML을 PHP 로 변환하는 Config Transformer의 8가지 소식</a> by Tomas Votruba</p><h2 id="Repository-pattern-the-SOLID-way-in-Symfony-by-Saeid-Raei"><a href="#Repository-pattern-the-SOLID-way-in-Symfony-by-Saeid-Raei" class="headerlink" title="Repository pattern the SOLID way in Symfony by Saeid Raei."></a>Repository pattern the SOLID way in Symfony by Saeid Raei.</h2><p><a href="https://saeidme.medium.com/repository-pattern-the-solid-way-in-symfony-a9aef1c9fc59">Symfony에서 SOLID하게 리포지토리 패턴 구현하는 법</a> by Saeid Raei.</p><h2 id="How-to-apply-Hexagonal-x2F-Clean-x2F-Onion-architecture-with-only-two-changes-to-your-symfony-project-by-Saeid-Raei"><a href="#How-to-apply-Hexagonal-x2F-Clean-x2F-Onion-architecture-with-only-two-changes-to-your-symfony-project-by-Saeid-Raei" class="headerlink" title="How to apply Hexagonal&#x2F;Clean&#x2F;Onion architecture with only two changes to your symfony project by Saeid Raei."></a>How to apply Hexagonal&#x2F;Clean&#x2F;Onion architecture with only two changes to your symfony project by Saeid Raei.</h2><p><a href="https://saeidme.medium.com/how-to-apply-hexagonal-clean-onion-architecture-with-only-two-changes-to-your-symfony-project-2c5fe16d5a4f">symfony 프로젝트에 단 두 가지 변경 사항으로 Hexagonal&#x2F;Clean&#x2F;Onion 아키텍처를 적용하는 방법</a> by Saeid Raei.</p><h2 id="Symfony-Testing-using-Repository-pattern-without-connecting-to-database-by-Saeid-Raei"><a href="#Symfony-Testing-using-Repository-pattern-without-connecting-to-database-by-Saeid-Raei" class="headerlink" title="Symfony Testing: using Repository pattern without connecting to database by Saeid Raei."></a>Symfony Testing: using Repository pattern without connecting to database by Saeid Raei.</h2><p><a href="https://saeidme.medium.com/symfony-testing-using-repository-pattern-without-connecting-to-database-f1ec1f147372">Symfony 테스트: 데이터베이스에 연결하지 않고 Repository 패턴을 사용</a> by Saeid Raei.</p><h2 id="Voila-Symfony-and-PHP-8-1-by-Mert-Simsek"><a href="#Voila-Symfony-and-PHP-8-1-by-Mert-Simsek" class="headerlink" title="Voila! Symfony and PHP 8.1 by Mert Simsek."></a>Voila! Symfony and PHP 8.1 by Mert Simsek.</h2><p><a href="https://medium.com/beyn-technology/voila-symfony-and-php-8-1-6c1533f9bbea">짜잔! Symfony와 PHP 8.1</a> by Mert Simsek.</p><h2 id="Decorating-Commands-by-Michael-Zangerle"><a href="#Decorating-Commands-by-Michael-Zangerle" class="headerlink" title="Decorating Commands by Michael Zangerle."></a>Decorating Commands by Michael Zangerle.</h2><p><a href="https://medium.com/fusonic/decorating-commands-63f03111ca0d">Decorating Commands</a> by Michael Zangerle.</p><p>두 가지 목적에 따라 다르게 동작하길 바라는 Command를 데코레이터 패턴으로 변경.</p><h2 id="Clean-up-your-migrations-by-Victor-Bocharsky"><a href="#Clean-up-your-migrations-by-Victor-Bocharsky" class="headerlink" title="Clean up your migrations! by Victor Bocharsky."></a>Clean up your migrations! by Victor Bocharsky.</h2><p><a href="https://symfonycasts.com/blog/clean-up-migrations">마이그레이션을 정리하십시오!</a> by Victor Bocharsky.</p><h1 id="Laravel"><a href="#Laravel" class="headerlink" title="Laravel"></a>Laravel</h1><h2 id="🎬-What’s-New-In-Laravel-9-23-0-Laravel-9-24-0-Laravel-9-25-0"><a href="#🎬-What’s-New-In-Laravel-9-23-0-Laravel-9-24-0-Laravel-9-25-0" class="headerlink" title="🎬 What’s New In Laravel 9.23.0, Laravel 9.24.0, Laravel 9.25.0"></a>🎬 What’s New In Laravel 9.23.0, Laravel 9.24.0, Laravel 9.25.0</h2><p>🎬 <a href="https://www.youtube.com/watch?v=xvCUdMkBrIc">Laravel 9.23.0</a>, <a href="https://www.youtube.com/watch?v=LSxfs6iHFlY">Laravel 9.24.0</a>, <a href="https://www.youtube.com/watch?v=GfoV59yJNJM">Laravel 9.25.0</a>의 새로운 기능 - Christoph Rumpel이 Laravel 업데이트에 대한 간략한 개요를 제공하는 이 새로운 YouTube 시리즈를 확인하세요.</p><h2 id="protonemedia-x2F-laravel-splade"><a href="#protonemedia-x2F-laravel-splade" class="headerlink" title="protonemedia&#x2F;laravel-splade"></a>protonemedia&#x2F;laravel-splade</h2><p><a href="https://splade.dev/">protonemedia&#x2F;laravel-spade</a> – Blade의 단순성과 Inertia.js의 마법.</p><p>SPA를 쉽게 구축할 수 있게 도와줍니다.</p><h2 id="Sairahcaz-x2F-laravel-xhprof"><a href="#Sairahcaz-x2F-laravel-xhprof" class="headerlink" title="Sairahcaz&#x2F;laravel-xhprof"></a>Sairahcaz&#x2F;laravel-xhprof</h2><p><a href="https://github.com/Sairahcaz/laravel-xhprof">Sairahcaz&#x2F;laravel-xhprof</a> – Laravel 애플리케이션을 프로파일링하기 위한 간편한 XHProf 설정.</p><h2 id="BinarCode-x2F-laravel-restify"><a href="#BinarCode-x2F-laravel-restify" class="headerlink" title="BinarCode&#x2F;laravel-restify"></a>BinarCode&#x2F;laravel-restify</h2><p><a href="https://github.com/binarcode/laravel-restify">BinarCode&#x2F;laravel-restify</a> – 강력한 JSON:API 호환 Rest API를 Laravel과 함께 만드는 가장 빠른 방법입니다.</p><h2 id="Increase-performance-by-using-Eloquent’s-setRelation-method-by-Freek-Van-der-Herten"><a href="#Increase-performance-by-using-Eloquent’s-setRelation-method-by-Freek-Van-der-Herten" class="headerlink" title="Increase performance by using Eloquent’s setRelation method by Freek Van der Herten."></a>Increase performance by using Eloquent’s setRelation method by Freek Van der Herten.</h2><p><a href="https://freek.dev/2311-increase-performance-by-using-eloquents-setrelation-method">Eloquent의 setRelation 메소드를 사용하여 성능을 높이십시오</a> by Freek Van der Herten. </p><h2 id="How-I-develop-applications-with-Laravel-by-Steve-King-McDougall"><a href="#How-I-develop-applications-with-Laravel-by-Steve-King-McDougall" class="headerlink" title="How I develop applications with Laravel by Steve (King) McDougall."></a>How I develop applications with Laravel by Steve (King) McDougall.</h2><p><a href="https://laravel-news.com/how-i-develop-applications-with-laravel">Laravel로 애플리케이션을 개발하는 방법</a> by Steve (King) McDougall.</p><h2 id="Scaling-Laravel-to-100M-jobs-and-30-000-requests-x2F-sec-by-Mateus-Guimaraes"><a href="#Scaling-Laravel-to-100M-jobs-and-30-000-requests-x2F-sec-by-Mateus-Guimaraes" class="headerlink" title="Scaling Laravel to 100M+ jobs and 30,000 requests&#x2F;sec by Mateus Guimarães."></a>Scaling Laravel to 100M+ jobs and 30,000 requests&#x2F;sec by Mateus Guimarães.</h2><p><a href="https://mateusguimaraes.com/posts/scaling-laravel">Laravel을 1억 개 이상의 작업과 초당 30,000개의 요청으로 확장합니다</a> by Mateus Guimarães.</p><h2 id="How-to-Safely-and-Efficiently-Upgrade-an-Out-of-Date-Laravel-App-by-Jamison-Valenta"><a href="#How-to-Safely-and-Efficiently-Upgrade-an-Out-of-Date-Laravel-App-by-Jamison-Valenta" class="headerlink" title="How to Safely and Efficiently Upgrade an Out-of-Date Laravel App by Jamison Valenta"></a>How to Safely and Efficiently Upgrade an Out-of-Date Laravel App by Jamison Valenta</h2><p><a href="https://tighten.com/blog/catching-up-laravel/">오래된 Laravel 앱을 안전하고 효율적으로 업그레이드하는 방법</a> by Jamison Valenta</p><h2 id="Challenges-when-lift-and-shifting-Laravel-apps-into-AWS-Lambda-by-Marco-Deleu"><a href="#Challenges-when-lift-and-shifting-Laravel-apps-into-AWS-Lambda-by-Marco-Deleu" class="headerlink" title="Challenges when lift-and-shifting Laravel apps into AWS Lambda by Marco Deleu."></a>Challenges when lift-and-shifting Laravel apps into AWS Lambda by Marco Deleu.</h2><p><a href="https://blog.deleu.dev/lift-and-shift-aws-lambda/">Laravel 앱을 AWS Lambda로 리프트 앤 시프팅할 때의 문제</a> by Marco Deleu.</p><h2 id="🎬-5-hour-Laravel-9-tutorial-for-beginners"><a href="#🎬-5-hour-Laravel-9-tutorial-for-beginners" class="headerlink" title="🎬 5-hour Laravel 9 tutorial for beginners."></a>🎬 5-hour Laravel 9 tutorial for beginners.</h2><p><a href="https://www.youtube.com/watch?v=2mqsVzgsV_c">🎬 초보자를 위한 5시간짜리 Laravel 9 튜토리얼</a>.</p><h1 id="기타"><a href="#기타" class="headerlink" title="기타"></a>기타</h1><h2 id="Serverless-PHP-Applications-on-Digital-Ocean-Functions-by-Ayesh-Karunaratne"><a href="#Serverless-PHP-Applications-on-Digital-Ocean-Functions-by-Ayesh-Karunaratne" class="headerlink" title="Serverless PHP Applications on Digital Ocean Functions by Ayesh Karunaratne."></a>Serverless PHP Applications on Digital Ocean Functions by Ayesh Karunaratne.</h2><p><a href="https://php.watch/articles/php-serverless-digital-ocean">Digital Ocean Functions에서의 서버리스 PHP 애플리케이션</a> by Ayesh Karunaratne.</p><h2 id="Narrowing-types-for-static-analysis-by-Jordi-Boggiano"><a href="#Narrowing-types-for-static-analysis-by-Jordi-Boggiano" class="headerlink" title="Narrowing types for static analysis by Jordi Boggiano"></a>Narrowing types for static analysis by Jordi Boggiano</h2><p>Jordi Boggiano의 <a href="https://seld.be/notes/narrowing-types-for-static-analysis/">정적 분석 을 위한 타입 좁히기</a> – Composer를 비롯한 몇 가지 오래된 코드베이스를 PHPStan의 레벨 8로 이동하는 과정에서 Jordi가 배운 몇 가지 교훈.</p><h2 id="The-PHP-Handbook-–-Learn-PHP-for-Beginners-by-Flavio-Copes"><a href="#The-PHP-Handbook-–-Learn-PHP-for-Beginners-by-Flavio-Copes" class="headerlink" title="The PHP Handbook – Learn PHP for Beginners by Flavio Copes."></a>The PHP Handbook – Learn PHP for Beginners by Flavio Copes.</h2><p><a href="https://www.freecodecamp.org/news/the-php-handbook/">PHP 핸드북</a> – Flavio Copes의 초심자를 위한 PHP 배우기.</p><h2 id="The-difference-between-Traits-Interfaces-and-Abstract-Classes-in-PHP-by-Andrew-Schmelyun"><a href="#The-difference-between-Traits-Interfaces-and-Abstract-Classes-in-PHP-by-Andrew-Schmelyun" class="headerlink" title="The difference between Traits, Interfaces, and Abstract Classes in PHP by Andrew Schmelyun."></a>The difference between Traits, Interfaces, and Abstract Classes in PHP by Andrew Schmelyun.</h2><p>Andrew Schmelyun의 <a href="https://aschmelyun.com/blog/the-difference-between-traits-interfaces-and-abstract-classes-in-php/">PHP에서 Trait, 인터페이스 및 추상 클래스의 차이점</a>.</p><h2 id="When-to-use-a-trait-by-Matthias-Noback"><a href="#When-to-use-a-trait-by-Matthias-Noback" class="headerlink" title="When to use a trait? by Matthias Noback."></a>When to use a trait? by Matthias Noback.</h2><p><a href="https://matthiasnoback.nl/2022/07/when-to-use-a-trait/">Trait는 언제 사용합니까?</a> by Matthias Noback.</p><h2 id="Stop-using-“static”-in-PHP-and-Stop-using-“extends”-in-PHP-by-Mike-Zukowsky"><a href="#Stop-using-“static”-in-PHP-and-Stop-using-“extends”-in-PHP-by-Mike-Zukowsky" class="headerlink" title="Stop using “static” in PHP and Stop using “extends” in PHP by Mike Zukowsky."></a>Stop using “static” in PHP and Stop using “extends” in PHP by Mike Zukowsky.</h2><p>Mike Zukowsky의 <a href="https://blog.devgenius.io/stop-using-static-in-php-b150527819b2">PHP에서 “static”을 사용하지 맙시다</a>와 <a href="https://blog.devgenius.io/stop-using-extends-in-php-37c9da1cce83">PHP에서 “extends”를 사용하지 맙시다</a>.</p><h2 id="The-100-PHP-functions-in-2022-by-Damien-Seguy"><a href="#The-100-PHP-functions-in-2022-by-Damien-Seguy" class="headerlink" title="The 100 PHP functions in 2022 by Damien Seguy."></a>The 100 PHP functions in 2022 by Damien Seguy.</h2><p>Damien Seguy의 <a href="https://www.exakat.io/en/the-100-php-functions-in-2022/">2022년 가장 많이 사용되는 PHP 함수 100개</a>.</p><h2 id="PHP-native-Attributes-quick-reference-by-Damien-Seguy-–-How-many-core-attributes-can-you-name"><a href="#PHP-native-Attributes-quick-reference-by-Damien-Seguy-–-How-many-core-attributes-can-you-name" class="headerlink" title="PHP native Attributes quick reference by Damien Seguy – How many core attributes can you name?"></a>PHP native Attributes quick reference by Damien Seguy – How many core attributes can you name?</h2><p>Damien Seguy의 <a href="https://www.exakat.io/en/php-native-attributes-quick-reference/">PHP 기본(native) Attribute 빠르게 확인하기</a> – 여러분은 몇 가지나 이름을 댈 수 있습니까?</p><h2 id="Simple-Solutions-1-–-Active-Record-versus-Data-Mapper-by-Matthias-Noback"><a href="#Simple-Solutions-1-–-Active-Record-versus-Data-Mapper-by-Matthias-Noback" class="headerlink" title="Simple Solutions 1 – Active Record versus Data Mapper by Matthias Noback."></a>Simple Solutions 1 – Active Record versus Data Mapper by Matthias Noback.</h2><p><a href="https://matthiasnoback.nl/2022/08/simple-solutions-1-active-record-versus-data-mapper/">간단한 솔루션 1 – Active Record vs Data Mapper</a> by Matthias Noback.</p><h2 id="3-years-of-lift-and-shift-into-AWS-Lambda-by-Marco-Aurelio-Deleu"><a href="#3-years-of-lift-and-shift-into-AWS-Lambda-by-Marco-Aurelio-Deleu" class="headerlink" title="3 years of lift-and-shift into AWS Lambda by Marco Aurélio Deleu"></a>3 years of lift-and-shift into AWS Lambda by Marco Aurélio Deleu</h2><p><a href="https://blog.deleu.dev/lift-and-shift-aws-lambda/">AWS Lambda로 리프트 앤 시프트한 3년</a> – AWS Lambda를 PHP 호스팅 공급자로 사용할 때 주의해야 할 주의 사항.</p><p>(위 Laravel 쪽에서 소개된 글과 동일합니다)</p><h2 id="Do-generators-really-reduce-the-memory-usage"><a href="#Do-generators-really-reduce-the-memory-usage" class="headerlink" title="Do generators really reduce the memory usage?"></a>Do generators really reduce the memory usage?</h2><p><a href="https://phpdelusions.net/articles/generators">generator가 실제로 메모리 사용량을 줄입니까?</a></p><h2 id="What-I-would-change-about-PHP-by-Brent-Roose"><a href="#What-I-would-change-about-PHP-by-Brent-Roose" class="headerlink" title="What I would change about PHP by Brent Roose."></a>What I would change about PHP by Brent Roose.</h2><p>Brent Roose의 <a href="https://stitcher.io/blog/php-reimagined-part-2">내가 PHP에서 바꾸고 싶은 것</a>.</p><h1 id="Audio-x2F-Video"><a href="#Audio-x2F-Video" class="headerlink" title="Audio&#x2F;Video"></a>Audio&#x2F;Video</h1><h2 id="🎬-Why-you-need-to-update-PHP-by-Brent-Roose"><a href="#🎬-Why-you-need-to-update-PHP-by-Brent-Roose" class="headerlink" title="🎬 Why you need to update PHP by Brent Roose."></a>🎬 Why you need to update PHP by Brent Roose.</h2><p>Brent Roose의 <a href="https://www.youtube.com/watch?v=0KCSrhxlXfw">PHP를 업데이트해야 하는 이유</a>.</p><h2 id="🎬-PHP-101-for-Absolute-Beginners-–-A-full-2-hour-course"><a href="#🎬-PHP-101-for-Absolute-Beginners-–-A-full-2-hour-course" class="headerlink" title="🎬 PHP 101 for Absolute Beginners – A full 2-hour course."></a>🎬 PHP 101 for Absolute Beginners – A full 2-hour course.</h2><p><a href="https://www.youtube.com/watch?v=oEgLT1hGX4U">완전 초보자를 위한 PHP 101</a> – 전체 2시간 코스.</p><h1 id="Conferences"><a href="#Conferences" class="headerlink" title="Conferences"></a>Conferences</h1><p>대면 이벤트가 드디어 돌아왔습니다!</p><ul><li><a href="https://event.afup.org/">ForumPHP</a> – 디즈니랜드 파리(프랑스), 10월 13일-14일.</li><li><a href="https://phpconference.com/munich">International PHP Conference</a> – 뮌헨(독일), 10월 24일-28일.</li><li><a href="https://www.longhornphp.com/php-is-the-right-choice-in-2022-and-beyond">Longhorn PHP</a> – 텍사스 오스틴(미국), 11월 3일-5일.</li><li><a href="https://live.symfony.com/2022-paris-con/">SymfonyCon</a> – 디즈니랜드 파리(프랑스), 11월 17일-18일.</li></ul><h1 id="Community"><a href="#Community" class="headerlink" title="Community"></a>Community</h1><h2 id="A-nomenclature-of-hate-by-Jordi-Boggiano"><a href="#A-nomenclature-of-hate-by-Jordi-Boggiano" class="headerlink" title="A nomenclature of hate by Jordi Boggiano."></a>A nomenclature of hate by Jordi Boggiano.</h2><p>Jordi Boggiano의 <a href="https://seld.be/notes/a-nomenclature-of-hate/">증오 명명법</a>.</p><p>오픈 소스 프로젝트를 유지하는 것은 어렵습니다. 문제를 해결해야 할 뿐만 아니라 좌절한 사용자를 다루어야 하기 때문입니다. Alexander Makarov가 수집한 몇 가지 예를 확인하십시오: <a href="https://github.com/samdark/opensource-hate">samdark&#x2F;opensource-hate</a>.</p><h2 id="swyx-swyx-의-트윗"><a href="#swyx-swyx-의-트윗" class="headerlink" title="swyx(@swyx)의 트윗"></a>swyx(@swyx)의 트윗</h2><p><a href="https://twitter.com/swyx/status/1552730861052628992">https://twitter.com/swyx/status/1552730861052628992</a></p><p><img src="https://pbs.twimg.com/media/FYv6jU7WIAAkiX5?format=jpg&name=small" alt="swyx의 트윗 이미지"></p><h2 id="asgrim-x2F-side-effect"><a href="#asgrim-x2F-side-effect" class="headerlink" title="asgrim&#x2F;side-effect"></a>asgrim&#x2F;side-effect</h2><p><a href="https://github.com/asgrim/side-effect">asgrim&#x2F;side-effect</a> - 모든 걸 <code>__toString()</code> 메서드 안에서 처리하는 프레임워크.</p><p>James Titcumb(@asgrim)의 <a href="https://twitter.com/asgrim/status/1555188225718853634">트윗</a></p><blockquote><p>농담인 줄 알았겠지만, 진짜 만들었어</p></blockquote><p>누군가 <code>__toString()</code> 이외의 다른 메서드에 구현되었다며 버그 리포팅해서, <a href="https://twitter.com/asgrim/status/1555196078072406016">이를 수정하기도 했습니다</a>.</p>]]></content>
    
    
      
      
        
        
    <summary type="html">&lt;p&gt;&lt;img src=&quot;https://blog.jetbrains.com/wp-content/uploads/2022/08/php-annotated-blog-featured-image-1280x600-1.png&quot; alt=&quot;PHP Annotated</summary>
        
      
    
    
    
    
    <category term="PHP" scheme="https://haah.kr/tags/PHP/"/>
    
    <category term="php-annotated" scheme="https://haah.kr/tags/php-annotated/"/>
    
    <category term="php-annotated-monthly" scheme="https://haah.kr/tags/php-annotated-monthly/"/>
    
  </entry>
  
  <entry>
    <title>PHP Annotated – July 2022</title>
    <link href="https://haah.kr/2022/07/23/php-annotated-july-2022/"/>
    <id>https://haah.kr/2022/07/23/php-annotated-july-2022/</id>
    <published>2022-07-23T15:03:16.000Z</published>
    <updated>2026-05-31T19:29:57.260Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://blog.jetbrains.com/wp-content/uploads/2022/07/php-annotated-july2022-blog-featured-image-1280x600-1.png" alt="PHP Annotated 이미지"></p><p><a href="https://blog.jetbrains.com/author/rpronskiy">Roman Pronskiy</a>가 쓰고 JetBrains에서 제공하는 PHP Annotated <a href="https://blog.jetbrains.com/phpstorm/2022/07/php-annotated-july-2022/">2022년 7월</a>의 번역&#x2F;해석본입니다.</p><p>이 중에서 몇 가지 제 취향껏 골라 그 안의 내용도 좀 뒤져보고 개발새발 번역해서 소개합니다.</p><hr><p>안녕하세요!</p><p>PHP Annotated 7월호에 오신 것을 환영합니다. 여기에서 선별된 뉴스, 기사, 도구 및 비디오를 포함하여 지난 한 달 동안 PHP 세계에서 일어난 가장 흥미로운 일을 따라잡을 것입니다.</p><h1 id="News"><a href="#News" class="headerlink" title="News"></a>News</h1><h2 id="PHP-8-2-0-Alpha-2-and-PHP-8-2-0-Alpha-3-have-been-released"><a href="#PHP-8-2-0-Alpha-2-and-PHP-8-2-0-Alpha-3-have-been-released" class="headerlink" title="PHP 8.2.0 Alpha 2 and PHP 8.2.0 Alpha 3 have been released"></a>PHP 8.2.0 Alpha 2 and PHP 8.2.0 Alpha 3 have been released</h2><p>세 번째이자 마지막 알파가 <a href="https://wiki.php.net/todo/php82#timetable">예정대로</a> 출시되었습니다. 다음 릴리스는 7월 21일에 예정된 PHP 8.2.0 Beta 1입니다. </p><ul><li><a href="https://www.php.net/archive/2022.php#2022-06-23-1">PHP 8.2.0 Alpha 2</a></li><li><a href="https://www.php.net/archive/2022.php#2022-07-07-2">PHP 8.2.0 Alpha 3</a></li><li><a href="https://www.php.net/archive/2022.php#2022-07-21-1">PHP 8.2.0 Beta 1</a></li></ul><p>역자 주: 번역 시간 기준으로 21일이 지나 8.2.0 Beta 1은 출시되었습니다. 다음 릴리스는 8월 4일에 예정된 PHP 8.2.0 Beta 2입니다.</p><p>PHP 8.2에 추가될 기능에 대한 자세한 목록은 <a href="https://php.watch/versions/8.2">php.watch</a> 또는 <a href="https://stitcher.io/blog/new-in-php-82">stitcher.io</a>를 참조하십시오 .</p><h2 id="PHP-8-0-21-and-PHP-8-1-8-have-been-released"><a href="#PHP-8-0-21-and-PHP-8-1-8-have-been-released" class="headerlink" title="PHP 8.0.21 and PHP 8.1.8 have been released"></a>PHP 8.0.21 and PHP 8.1.8 have been released</h2><ul><li><a href="https://www.php.net/archive/2022.php#2022-07-07-1">PHP 8.0.21</a></li><li><a href="https://www.php.net/archive/2022.php#2022-07-07-3">PHP 8.1.8</a></li></ul><h2 id="PHP-Foundation-Update-June-2022"><a href="#PHP-Foundation-Update-June-2022" class="headerlink" title="PHP Foundation Update, June 2022"></a>PHP Foundation Update, June 2022</h2><p><a href="https://thephp.foundation/blog/2022/07/04/php-foundation-update-june-2022/">PHP Foundation 업데이트, 2022년 6월</a></p><p>후원자를 위한 월간 업데이트를 확인하십시오.</p><ul><li>개발자가 달성한 것, 새로운 후원자 및 재단에 기여할 수 있는 재정적 방법 등</li></ul><h2 id="php-net-redesign-is-being-discussed"><a href="#php-net-redesign-is-being-discussed" class="headerlink" title="php.net redesign is being discussed"></a>php.net redesign is being discussed</h2><p><a href="https://github.com/php/web-php/pull/602">php.net 재설계가 논의 중입니다</a></p><p><img src="https://pbs.twimg.com/media/FWl6PbkXwAIz_JY?format=jpg&name=small" alt="개발 중인 php 웹사이트 캡쳐 화면"></p><blockquote><p>디자인 실험으로 현재 #php 웹사이트를 개편했습니다. 더 수정할 수 있는 부분이 많이 있지만 지금까지는 만족합니다. 어떻게 생각하세요?</p></blockquote><p>Mike van Riel(@mvriel)의 <a href="https://twitter.com/mvriel/status/1542898919142789123">트윗</a></p><p>한편 <a href="https://twitter.com/localheinz">Andreas Möller</a> 덕분에 php.net 소스 코드는 이제 <a href="https://github.com/FriendsOfPHP/PHP-CS-Fixer">friendsofphp&#x2F;php-cs-fixer</a>를 사용하여 코딩 표준 문제를 수정 합니다.</p><p>PHP의 메인 사이트 업데이트를 돕고 싶다면 <a href="https://github.com/php/web-php/blob/master/.github/CONTRIBUTING.md">기여 가이드(contributing guide)</a>를 확인하세요 .</p><h2 id="A-popular-async-framework-for-PHP-ReactPHP-turned-10"><a href="#A-popular-async-framework-for-PHP-ReactPHP-turned-10" class="headerlink" title="A popular async framework for PHP ReactPHP turned 10"></a>A popular async framework for PHP ReactPHP turned 10</h2><p>인기 있는 PHP 비동기 프레임워크 <a href="https://clue.engineering/2022/announcing-reactphp-async">ReactPHP 10</a></p><p>10주년을 기념하기 위해 팀은 async 및 await 기능이 포함된 완전히 새로운 비동기 구성 요소인 <a href="https://github.com/reactphp/async">reactphp&#x2F;async</a>를 출시했으며 이는 PHP 8.1+와 같은 fiber를 기반으로 구축되었습니다.</p><p>Cees-Jan Kiewiet의 <a href="https://blog.wyrihaximus.net/2022/07/my-road-to-fibers-with-reactphp/">My road to fibers with ReactPHP</a>를 읽어보세요.</p><h2 id="Is-PHP-dead"><a href="#Is-PHP-dead" class="headerlink" title="Is PHP dead?"></a>Is PHP dead?</h2><p><a href="https://is-php-dead.lol/">PHP는 죽었습니까?</a></p><p>한 번 그리고 영원히 대답을 남겼습니다.</p><h1 id="PHP-Core"><a href="#PHP-Core" class="headerlink" title="PHP Core"></a>PHP Core</h1><p>Core 뉴스의 대부분은 PHP Foundation의 <a href="https://thephp.foundation/blog/tag/roundup/">PHP Core Roundup 시리즈</a>에서 자세히 다룹니다 . 이 시리즈의 다음 에피소드가 곧 출시될 예정이므로 업데이트에 대해 간단히 언급하겠습니다.</p><h2 id="✅-RFC-Disjunctive-Normal-Form-Types-PHP-8-2"><a href="#✅-RFC-Disjunctive-Normal-Form-Types-PHP-8-2" class="headerlink" title="✅ RFC: Disjunctive Normal Form Types #PHP 8.2"></a>✅ RFC: Disjunctive Normal Form Types #PHP 8.2</h2><p><a href="https://wiki.php.net/rfc/dnf_types">RFC: Disjunctive Normal Form Types</a> #PHP 8.2</p><p>Disjunctive Normal Form 유형에 대한 지원이 PHP 8.2에 승인되었습니다. 결합 및 교차 유형을 혼합할 수 있습니다.</p><figure class="highlight php"><table><tr><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Foo</span> </span>&#123;  </span><br><span class="line">    <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">bar</span>(<span class="params"></span>): (<span class="params">A &amp; B</span>) | <span class="title">D</span></span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>Derick Rethan가 George Peter Banyard와 함께 하는 🔈 <a href="https://derickrethans.nl/phpinternalsnews-103.html">PHP Internals News 팟캐스트 에피소드 103</a>에서 자세히 알아보십시오.</p><h2 id="✅-RFC-Fetch-properties-of-enums-in-const-expressions-PHP-8-2"><a href="#✅-RFC-Fetch-properties-of-enums-in-const-expressions-PHP-8-2" class="headerlink" title="✅ RFC: Fetch properties of enums in const expressions #PHP 8.2"></a>✅ RFC: Fetch properties of enums in const expressions #PHP 8.2</h2><p><a href="https://wiki.php.net/rfc/fetch_property_in_const_expressions">RFC: const 표현식에서 enum 속성 가져오기</a> #PHP 8.2</p><p>PHP 8.2에서는 -&gt; &#x2F; ?-&gt; 를 사용하여 상수 표현식에서 enum 속성을 가져올 수 있습니다.</p><figure class="highlight php"><table><tr><td class="code"><pre><span class="line"><span class="class"><span class="keyword">enum</span> <span class="title">A</span>: <span class="title">string</span> </span>&#123;</span><br><span class="line">    <span class="keyword">case</span> B = <span class="string">&#x27;B&#x27;</span>;</span><br><span class="line">    <span class="keyword">const</span> <span class="variable constant_">C</span> = [<span class="built_in">self</span>::<span class="variable constant_">B</span>-&gt;value =&gt; <span class="built_in">self</span>::<span class="variable constant_">B</span>];</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="✅-RFC-Random-Extension-Improvement-PHP-8-2"><a href="#✅-RFC-Random-Extension-Improvement-PHP-8-2" class="headerlink" title="✅ RFC: Random Extension Improvement #PHP 8.2"></a>✅ RFC: Random Extension Improvement #PHP 8.2</h2><p><a href="https://wiki.php.net/rfc/random_extension_improvement">RFC: 랜덤 확장 개선</a> #PHP 8.2</p><p>몇 가지 문제가 <a href="https://wiki.php.net/rfc/rng_extension">“Random Extension 5.x” RFC</a>의 투표가 시작된 이후에만 제기 되었습니다(적절한 토론이 부족했기 때문에). 이러한 각 문제에 대해 투표 옵션을 만들고 추가 결정을 내리기로 했고 모두 통과했습니다. </p><h2 id="✅-RFC-Make-the-iterator-family-accept-all-iterables-PHP-8-2"><a href="#✅-RFC-Make-the-iterator-family-accept-all-iterables-PHP-8-2" class="headerlink" title="✅ RFC: Make the iterator_*() family accept all iterables #PHP 8.2."></a>✅ RFC: Make the iterator_*() family accept all iterables #PHP 8.2.</h2><p><a href="https://wiki.php.net/rfc/iterator_xyz_accept_array">RFC: iterator_*() 패밀리가 모든 이터러블 #PHP 8.2를 허용하도록 합니다.</a></p><p>PHP 8.2에서 iterator_to_array()와 iterator_count()의 <code>$iterator</code> 파라미터는 <code>\Traversable</code>에서 <code>iterable</code>(예: \Traversable|array)로 확장됩니다.</p><figure class="highlight php"><table><tr><td class="code"><pre><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">foo</span>(<span class="params"><span class="keyword">iterable</span> <span class="variable">$foo</span></span>) </span>&#123;</span><br><span class="line">    <span class="variable">$foo</span> = <span class="title function_ invoke__">iterator_to_array</span>(<span class="variable">$foo</span>); <span class="comment">//now accepts arrays</span></span><br><span class="line"> </span><br><span class="line">    <span class="keyword">return</span> <span class="title function_ invoke__">array_map</span>(<span class="title function_ invoke__">strlen</span>(...), <span class="variable">$foo</span>);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="✅-RFC-Constants-in-Traits-PHP-8-2"><a href="#✅-RFC-Constants-in-Traits-PHP-8-2" class="headerlink" title="✅ RFC: Constants in Traits #PHP 8.2"></a>✅ RFC: Constants in Traits #PHP 8.2</h2><p><a href="https://wiki.php.net/rfc/constants_in_traits">RFC: Trait에서의 상수</a> #PHP 8.2</p><p>PHP 8.2에서는 현재 property에서 가능한 것과 동일한 방식으로 Trait에 상수를 정의할 수 있습니다.</p><figure class="highlight php"><table><tr><td class="code"><pre><span class="line"><span class="class"><span class="keyword">trait</span> <span class="title">Foo</span> </span>&#123;</span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">const</span> <span class="variable constant_">PHP_VERSION</span> = <span class="string">&#x27;8.2&#x27;</span>;</span><br><span class="line">&#125;</span><br><span class="line"> </span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Base</span> </span>&#123;</span><br><span class="line">    <span class="keyword">use</span> <span class="title">Foo</span>;</span><br><span class="line">&#125;</span><br><span class="line"> </span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Bar</span> <span class="keyword">extends</span> <span class="title">Base</span> </span>&#123;</span><br><span class="line">    <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">phpVersion</span>(<span class="params"></span>): <span class="title">void</span> </span>&#123;</span><br><span class="line">        <span class="keyword">echo</span> <span class="built_in">parent</span>::<span class="variable constant_">PHP_VERSION</span>; <span class="comment">// 8.2</span></span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="❌-RFC-New-Curl-URL-API"><a href="#❌-RFC-New-Curl-URL-API" class="headerlink" title="❌ RFC: New Curl URL API"></a>❌ RFC: New Curl URL API</h2><p><a href="https://wiki.php.net/rfc/curl-url-api">RFC: 새로운 Curl URL API</a></p><h2 id="❌-RFC-json-encode-indentation"><a href="#❌-RFC-json-encode-indentation" class="headerlink" title="❌ RFC: json_encode indentation"></a>❌ RFC: json_encode indentation</h2><p><a href="https://wiki.php.net/rfc/json_encode_indentation">RFC: json_encode 들여쓰기</a></p><h2 id="❌-RFC-Stricter-implicit-boolean-coercions"><a href="#❌-RFC-Stricter-implicit-boolean-coercions" class="headerlink" title="❌ RFC: Stricter implicit boolean coercions"></a>❌ RFC: Stricter implicit boolean coercions</h2><p><a href="https://wiki.php.net/rfc/stricter_implicit_boolean_coercions">RFC: 더 엄격한 암시적 bool 강제 변환</a></p><h2 id="❌-RFC-Create-a-global-login-system-for-php-net"><a href="#❌-RFC-Create-a-global-login-system-for-php-net" class="headerlink" title="❌ RFC: Create a global login system for php.net"></a>❌ RFC: Create a global login system for php.net</h2><p><a href="https://wiki.php.net/rfc/global_login">RFC: php.net용 글로벌 로그인 시스템 생성</a></p><h2 id="❌-RFC-Short-Closures-2-0"><a href="#❌-RFC-Short-Closures-2-0" class="headerlink" title="❌ RFC: Short Closures 2.0"></a>❌ RFC: Short Closures 2.0</h2><p><a href="https://wiki.php.net/rfc/auto-capture-closure">RFC: 짧은 Closures 2.0</a></p><p>Marcel Pociot(@marcelpociot)의 <a href="https://twitter.com/marcelpociot/status/1548252633554554882">트윗</a></p><blockquote><p>다음에 승인될 수 있도록 RFC를 개선해 봅시다.🤞</p></blockquote><h2 id="🤔-RFC-Auto-implement-Stringable-for-string-backed-enums"><a href="#🤔-RFC-Auto-implement-Stringable-for-string-backed-enums" class="headerlink" title="🤔 RFC: Auto-implement Stringable for string backed enums"></a>🤔 RFC: Auto-implement Stringable for string backed enums</h2><p><a href="https://wiki.php.net/rfc/auto-implement_stringable_for_string_backed_enums">RFC: 문자열 지원 열거형에 대한 Stringable 자동 구현</a></p><p>이 RFC는 문자열을 지원하는 열거형이 Stringable을 자동으로 구현하기를 제안하지만 여전히 메서드의 사용자 영역 구현은 허용하지 않습니다.</p><h2 id="🤔-RFC-PDO-driver-specific-sub-classes"><a href="#🤔-RFC-PDO-driver-specific-sub-classes" class="headerlink" title="🤔 RFC: PDO driver specific sub-classes"></a>🤔 RFC: PDO driver specific sub-classes</h2><p><a href="https://wiki.php.net/rfc/pdo_driver_specific_subclasses">RFC: PDO 드라이버별 하위 클래스</a></p><h2 id="💡-RFC-Unify-PHP’s-typing-modes-aka-remove-strict-type-declare"><a href="#💡-RFC-Unify-PHP’s-typing-modes-aka-remove-strict-type-declare" class="headerlink" title="💡 RFC: Unify PHP’s typing modes (aka remove strict_type declare)"></a>💡 RFC: Unify PHP’s typing modes (aka remove strict_type declare)</h2><p><a href="https://github.com/Girgias/unify-typing-modes-rfc#readme">RFC: PHP의 타이핑 모드 통합(strict_type 선언 제거라고도 함)</a></p><p>타입 캐스팅 사용 및 개발자 부담에 미치는 영향에 대한 고려와 함께,<br>strict_type를 PHP(9+)에서 기본값으로 변경하는 draft 아이디어입니다.</p><blockquote><p>PHP는 다른 언어와 비교하여 작동할 수 있는 두 가지 입력 모드가 있습니다. 하나는 너무 느슨하고 다른 하나는 너무 엄격합니다. 이 RFC는 이 두 모드의 존재 이유, 단점, 두 모드를 다시 통합하기 전에 변경해야 할 사항에 대해 설명합니다.</p></blockquote><h1 id="Tools"><a href="#Tools" class="headerlink" title="Tools"></a>Tools</h1><h2 id="laravel-x2F-pint"><a href="#laravel-x2F-pint" class="headerlink" title="laravel&#x2F;pint"></a>laravel&#x2F;pint</h2><p><a href="https://github.com/laravel/pint">laravel&#x2F;pint</a> – 미니멀리스트를 위한 PHP 코드 스타일 수정기(fixer). 기본적으로 <a href="https://github.com/FriendsOfPHP/PHP-CS-Fixer">FriendsOfPHP&#x2F;PHP-CS-Fixer</a> 래퍼지만 더 쉬운 구성과 멋진 출력을 제공합니다.</p><h2 id="DaveLiddament-x2F-php-language-extensions"><a href="#DaveLiddament-x2F-php-language-extensions" class="headerlink" title="DaveLiddament&#x2F;php-language-extensions"></a>DaveLiddament&#x2F;php-language-extensions</h2><p><a href="https://github.com/DaveLiddament/php-language-extensions">DaveLiddament&#x2F;php-language-extensions</a> - PHP 언어 확장을 정의하기 위한 속성(정적 분석에 의해 시행됨): #[Friend], #[Package]등.</p><p>currently in BETA.</p><h2 id="RobiNN1-x2F-phpCacheAdmin"><a href="#RobiNN1-x2F-phpCacheAdmin" class="headerlink" title="RobiNN1&#x2F;phpCacheAdmin"></a>RobiNN1&#x2F;phpCacheAdmin</h2><p><a href="https://github.com/RobiNN1/phpCacheAdmin">RobiNN1&#x2F;phpCacheAdmin</a> – Redis, Memcache(d) 및 OPCache용 웹 대시보드.</p><h2 id="thecodingmachine-x2F-safe"><a href="#thecodingmachine-x2F-safe" class="headerlink" title="thecodingmachine&#x2F;safe"></a>thecodingmachine&#x2F;safe</h2><p><a href="https://github.com/thecodingmachine/safe">thecodingmachine&#x2F;safe</a> – 에러가 발생하면 <code>false</code>를 반환하는 대신 예외를 발생시키도록 재작성된 PHP 함수 모음.</p><figure class="highlight php"><table><tr><td class="code"><pre><span class="line"><span class="keyword">use</span> <span class="keyword">function</span> <span class="title">Safe</span>\<span class="title">file_get_contents</span>;</span><br><span class="line"><span class="keyword">use</span> <span class="keyword">function</span> <span class="title">Safe</span>\<span class="title">json_decode</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">// This code is both safe and simple!</span></span><br><span class="line"><span class="variable">$content</span> = <span class="title function_ invoke__">file_get_contents</span>(<span class="string">&#x27;foobar.json&#x27;</span>);</span><br><span class="line"><span class="variable">$foobar</span> = <span class="title function_ invoke__">json_decode</span>(<span class="variable">$content</span>);</span><br></pre></td></tr></table></figure><h2 id="cerbero90-x2F-enum"><a href="#cerbero90-x2F-enum" class="headerlink" title="cerbero90&#x2F;enum"></a>cerbero90&#x2F;enum</h2><p><a href="https://github.com/cerbero90/enum">cerbero90&#x2F;enum</a> – enum 기능을 강화하기 위한 종속성 없는 PHP 라이브러리.</p><h2 id="PrinsFrank-x2F-standards"><a href="#PrinsFrank-x2F-standards" class="headerlink" title="PrinsFrank&#x2F;standards"></a>PrinsFrank&#x2F;standards</h2><p><a href="https://github.com/PrinsFrank/standards">PrinsFrank&#x2F;standards</a> – ISO3166, ISO4217, ISO639 등 PHP Enum의 표준 모음입니다.</p><h2 id="soatok-x2F-cupcake"><a href="#soatok-x2F-cupcake" class="headerlink" title="soatok&#x2F;cupcake"></a>soatok&#x2F;cupcake</h2><p><a href="https://github.com/soatok/cupcake">soatok&#x2F;cupcake</a> – 간단하고 안전한 HTML form(생성 및 처리)을 위한 PHP 라이브러리입니다.</p><h2 id="T-Regx-x2F-T-Regx"><a href="#T-Regx-x2F-T-Regx" class="headerlink" title="T-Regx&#x2F;T-Regx"></a>T-Regx&#x2F;T-Regx</h2><p><a href="https://github.com/T-Regx/T-Regx">T-Regx&#x2F;T-Regx</a> – 현대 표준에 부합하는 PHP 정규식입니다. readme에서 <code>preg_*</code> 불일치에 대한 섹션을 확인하십시오.</p><p>어떤 인자는 <code>preg_*</code> 함수에 심각한(fatal) 에러를 발생시킵니다. T-Regx는 이를 예측하고, catch할 수 있도록 예외를 던집니다.</p><h2 id="deComplex-me"><a href="#deComplex-me" class="headerlink" title="deComplex.me"></a>deComplex.me</h2><p><a href="https://decomplex.me/eZGq7A">deComplex.me</a> – 두 코드 블록의 복잡성을 나란히 비교하는 웹 도구입니다.</p><h2 id="PiotrPress-x2F-wordpress-hooks"><a href="#PiotrPress-x2F-wordpress-hooks" class="headerlink" title="PiotrPress&#x2F;wordpress-hooks"></a>PiotrPress&#x2F;wordpress-hooks</h2><p><a href="https://github.com/PiotrPress/wordpress-hooks">PiotrPress&#x2F;wordpress-hooks</a> – attribute에 대한 좋은 사용 사례입니다! 라이브러리를 사용하면 WordPress Hooks(필터 및 작업)를 개체의 메서드에 자동으로 추가할 수 있습니다.</p><h2 id="markrogoyski-x2F-itertools-php"><a href="#markrogoyski-x2F-itertools-php" class="headerlink" title="markrogoyski&#x2F;itertools-php"></a>markrogoyski&#x2F;itertools-php</h2><p><a href="https://github.com/markrogoyski/itertools-php">markrogoyski&#x2F;itertools-php</a> – 루프를 강화하는 PHP 반복 도구.</p><h2 id="Composer-2-4-will-be-released-later-this-year"><a href="#Composer-2-4-will-be-released-later-this-year" class="headerlink" title="Composer 2.4 will be released later this year"></a>Composer 2.4 will be released later this year</h2><p>Composer 2.4는 올해 말에 출시될 예정이며 두 가지 새로운 명령을 제공합니다.</p><ul><li>Ayesh Karunaratne의 <a href="https://php.watch/articles/composer-audit">New composer audit Command and security audits</a>.</li><li>Ayesh Karunaratne의 <a href="https://php.watch/articles/composer-bump">New composer bump Command</a>.</li></ul><h1 id="Symfony"><a href="#Symfony" class="headerlink" title="Symfony"></a>Symfony</h1><h2 id="Launched-ux-symfony-com-and-released-4-New-UX-Components"><a href="#Launched-ux-symfony-com-and-released-4-New-UX-Components" class="headerlink" title="Launched ux.symfony.com and released 4 New UX Components."></a>Launched ux.symfony.com and released 4 New UX Components.</h2><p><a href="https://ux.symfony.com/">ux.symfony.com</a>을 출시하고 4개의 <a href="https://symfony.com/blog/hello-ux-symfony-com-and-4-new-ux-components">새로운 UX 컴포넌트</a>를 출시 했습니다 . 이 웹사이트는 각 UX 구성 요소를 만지고 샘플링하는 놀이터입니다.</p><h2 id="Twig-Smoke-Rendering"><a href="#Twig-Smoke-Rendering" class="headerlink" title="Twig Smoke Rendering"></a>Twig Smoke Rendering</h2><p><a href="https://tomasvotruba.com/blog/twig-smoke-rendering-fortune-favors-the-bold/">Twig Smoke Rendering – Fortune Favors the Bold</a> by Tomas Votruba.</p><h1 id="Laravel"><a href="#Laravel" class="headerlink" title="Laravel"></a>Laravel</h1><h2 id="Vite-is-now-the-default-frontend-asset-bundler-in-new-Laravel-projects"><a href="#Vite-is-now-the-default-frontend-asset-bundler-in-new-Laravel-projects" class="headerlink" title="Vite is now the default frontend asset bundler in new Laravel projects"></a>Vite is now the default frontend asset bundler in new Laravel projects</h2><p>Vite는 이제 Breeze 및 Jetstream을 포함해 새로운 Laravel 프로젝트의 기본 프론트엔드 asset 번들러 입니다.</p><p>Taylor Otwell(@taylorotwell)의 <a href="https://twitter.com/taylorotwell/status/1541795873838989314">트윗</a></p><blockquote><p>새로운 Laravel 프로젝트가 Vite를 사용하여 프론트엔드 자산을 번들로 제공한다는 소식을 전하게 되어 기쁩니다. Breeze와 Jetstream도 업데이트되었습니다. 🔥<br>Inertia Vue 또는 React와 함께 새로운 Breeze&#x2F;Vite 스택을 사용할 때 번개처럼 빠른 핫 모듈 교체를 경험하십시오. ⚡</p></blockquote><p>Christoph Rumpel 의 <a href="https://christoph-rumpel.com/2022/6/moving-a-laravel-webpack-project-to-vite">Moving A Laravel Webpack Project To Vite</a> 튜토리얼을 확인하십시오.</p><h2 id="hammerstonedev-x2F-sidecar"><a href="#hammerstonedev-x2F-sidecar" class="headerlink" title="hammerstonedev&#x2F;sidecar"></a>hammerstonedev&#x2F;sidecar</h2><p><a href="https://github.com/hammerstonedev/sidecar">hammerstonedev&#x2F;sidecar</a> – 이 패키지를 사용하면 Laravel 애플리케이션에서 AWS Lambda 기능을 배포하고 실행할 수 있습니다. 사용 사례의 예는 <a href="https://stefanzweifel.io/posts/2022/06/21/introducing-sidecar-browsershot">Browsershot</a>을 통해 스크린샷을 만드는 것 입니다.</p><h2 id="calebporzio-x2F-parental"><a href="#calebporzio-x2F-parental" class="headerlink" title="calebporzio&#x2F;parental"></a>calebporzio&#x2F;parental</h2><p><a href="https://github.com/calebporzio/parental">calebporzio&#x2F;parental</a> – STI(Single Table Inheritance, 단일 테이블 상속) 기능을 Eloquent에 제공합니다.</p><p>STI : 모델을 확장하지만(일반적으로 특정 동작을 추가하기 위해) 동일한 테이블을 참조하는 것.</p><h2 id="spatie-x2F-laravel-onboard"><a href="#spatie-x2F-laravel-onboard" class="headerlink" title="spatie&#x2F;laravel-onboard"></a>spatie&#x2F;laravel-onboard</h2><p><a href="https://github.com/spatie/laravel-onboard">spatie&#x2F;laravel-onboard</a> – 앱에 대한 단계별 사용자 온보딩을 생성하기 위한 패키지입니다.</p><h2 id="zgabievi-x2F-laravel-promocodes"><a href="#zgabievi-x2F-laravel-promocodes" class="headerlink" title="zgabievi&#x2F;laravel-promocodes"></a>zgabievi&#x2F;laravel-promocodes</h2><p><a href="https://github.com/zgabievi/laravel-promocodes">zgabievi&#x2F;laravel-promocodes</a> – 강력한 쿠폰 및 프로모션 코드 생성기.</p><h2 id="abrouter-x2F-laravel-abtest"><a href="#abrouter-x2F-laravel-abtest" class="headerlink" title="abrouter&#x2F;laravel-abtest"></a>abrouter&#x2F;laravel-abtest</h2><p><a href="https://github.com/abrouter/laravel-abtest">abrouter&#x2F;laravel-abtest</a> – Laravel로 A&#x2F;B 테스트를 실행하는 간단한 패키지입니다.</p><h2 id="Running-PHPStan-on-max-with-Laravel-by-Steve-McDougall"><a href="#Running-PHPStan-on-max-with-Laravel-by-Steve-McDougall" class="headerlink" title="Running PHPStan on max with Laravel by Steve McDougall."></a>Running PHPStan on max with Laravel by Steve McDougall.</h2><p><a href="https://laravel-news.com/running-phpstan-on-max-with-laravel">https://laravel-news.com/running-phpstan-on-max-with-laravel</a></p><p>PHPStan을 최대한으로 실행하기.</p><h2 id="Add-comments-to-SQL-queries-made-by-Laravel-by-Freek-Van-der-Herten"><a href="#Add-comments-to-SQL-queries-made-by-Laravel-by-Freek-Van-der-Herten" class="headerlink" title="Add comments to SQL queries made by Laravel by Freek Van der Herten."></a>Add comments to SQL queries made by Laravel by Freek Van der Herten.</h2><p><a href="https://freek.dev/2279-add-comments-to-sql-queries-made-by-laravel">https://freek.dev/2279-add-comments-to-sql-queries-made-by-laravel</a></p><p>쿼리의 출처를 쉽게 찾아낼 수 있도록 Laravel이 만든 쿼리에 주석을 추가합니다.</p><h2 id="Containerizing-Laravel-Applications-by-Matt-Casperson"><a href="#Containerizing-Laravel-Applications-by-Matt-Casperson" class="headerlink" title="Containerizing Laravel Applications by Matt Casperson."></a>Containerizing Laravel Applications by Matt Casperson.</h2><p><a href="https://www.honeybadger.io/blog/containerizing-laravel-applications/">https://www.honeybadger.io/blog/containerizing-laravel-applications/</a></p><p>기존 Laravel 애플리케이션을 컨테이너화하는 과정.</p><h1 id="기타"><a href="#기타" class="headerlink" title="기타"></a>기타</h1><h2 id="The-very-useful-variadic-argument-by-Damien-Seguy"><a href="#The-very-useful-variadic-argument-by-Damien-Seguy" class="headerlink" title="The very useful variadic argument by Damien Seguy."></a>The very useful variadic argument by Damien Seguy.</h2><p><a href="https://www.exakat.io/en/the-very-useful-variadic-argument/">https://www.exakat.io/en/the-very-useful-variadic-argument/</a></p><p>정적 변수는 함수 호출이 끝날 때 죽지 않고 다음 호출까지 살아 있습니다.</p><figure class="highlight php"><table><tr><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">A</span> </span>&#123;</span><br><span class="line">    <span class="keyword">public</span> <span class="built_in">static</span> <span class="function"><span class="keyword">function</span> <span class="title">counter</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line">        <span class="built_in">static</span> <span class="variable">$i</span> = <span class="number">0</span>;</span><br><span class="line">        <span class="keyword">return</span> ++<span class="variable">$i</span>;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">B</span> <span class="keyword">extends</span> <span class="title">A</span> </span>&#123;&#125;</span><br><span class="line">  </span><br><span class="line"><span class="title function_ invoke__">var_dump</span>(A::<span class="title function_ invoke__">counter</span>()); <span class="comment">// int(1)</span></span><br><span class="line"><span class="title function_ invoke__">var_dump</span>(A::<span class="title function_ invoke__">counter</span>()); <span class="comment">// int(2)</span></span><br><span class="line"><span class="title function_ invoke__">var_dump</span>(B::<span class="title function_ invoke__">counter</span>()); <span class="comment">// int(1)</span></span><br><span class="line"><span class="title function_ invoke__">var_dump</span>(B::<span class="title function_ invoke__">counter</span>()); <span class="comment">// int(2)</span></span><br></pre></td></tr></table></figure><p>PHP 8.0까지는 호출되는 클래스에 따라 고유한 정적 변수가 존재했습니다만, 8.1부터 바뀌었습니다.<br>이 글에서는 정적 변수의 문제와 이를 제거하는 방법을 설명합니다.</p><h2 id="5-ways-to-give-a-name-to-your-booleans-by-Damien-Seguy"><a href="#5-ways-to-give-a-name-to-your-booleans-by-Damien-Seguy" class="headerlink" title="5 ways to give a name to your booleans by Damien Seguy."></a>5 ways to give a name to your booleans by Damien Seguy.</h2><p><a href="https://www.exakat.io/en/5-ways-to-give-a-name-to-your-booleans/">bool에 이름을 지정하는 5가지 방법</a> - Damien Seguy</p><ul><li>상수로 만들고</li><li>enum으로 전환하고<figure class="highlight php"><table><tr><td class="code"><pre><span class="line"><span class="class"><span class="keyword">enum</span> <span class="title">Comparison</span> </span>&#123;</span><br><span class="line">  <span class="keyword">case</span> STRICT;</span><br><span class="line">  <span class="keyword">case</span> LOOSE;</span><br><span class="line">&#125;</span><br><span class="line"> </span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">foo</span>(<span class="params"><span class="keyword">bool</span> <span class="variable">$comparison</span></span>) </span>&#123;&#125; </span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">goo</span>(<span class="params">Comparison <span class="variable">$comparison</span></span>) </span>&#123;&#125; </span><br><span class="line"> </span><br><span class="line"><span class="title function_ invoke__">foo</span>(<span class="literal">true</span>);</span><br><span class="line"><span class="title function_ invoke__">goo</span>(<span class="title class_">Comparison</span>::<span class="variable constant_">STRICT</span>);</span><br></pre></td></tr></table></figure></li><li>named parameter를 사용하고<figure class="highlight php"><table><tr><td class="code"><pre><span class="line"><span class="variable">$v</span> = <span class="title function_ invoke__">in_array</span>(<span class="variable">$needle</span>, <span class="variable">$haystack</span>, <span class="attr">strict</span>: <span class="literal">true</span>); </span><br></pre></td></tr></table></figure></li><li>dummy 할당(assignation)을 사용하고<figure class="highlight php"><table><tr><td class="code"><pre><span class="line"><span class="variable">$v</span> = <span class="title function_ invoke__">in_array</span>(<span class="variable">$needle</span>, <span class="variable">$haystack</span>, <span class="variable">$strict</span> = <span class="literal">true</span>); </span><br></pre></td></tr></table></figure></li><li>comment를 활용<figure class="highlight php"><table><tr><td class="code"><pre><span class="line"><span class="variable">$v</span> = <span class="title function_ invoke__">in_array</span>(<span class="variable">$needle</span>, <span class="variable">$haystack</span>, /\* strict \*/ <span class="literal">true</span>);</span><br></pre></td></tr></table></figure></li></ul><h2 id="Top-100-PHP-classes-that-you-should-know-by-Damien-Seguy"><a href="#Top-100-PHP-classes-that-you-should-know-by-Damien-Seguy" class="headerlink" title="Top 100 PHP classes that you should know by Damien Seguy."></a>Top 100 PHP classes that you should know by Damien Seguy.</h2><p><a href="https://www.exakat.io/en/top-100-php-classes-that-you-should-know/">당신이 알아야 할 100대 PHP 클래스</a> - Damien Seguy.</p><h2 id="PHP-version-stats-July-2022-by-Brent-Roose"><a href="#PHP-version-stats-July-2022-by-Brent-Roose" class="headerlink" title="PHP version stats: July, 2022 by Brent Roose."></a>PHP version stats: July, 2022 by Brent Roose.</h2><p><a href="https://stitcher.io/blog/php-version-stats-july-2022">PHP 버전 통계</a> : 2022년 7월 by Brent Roose.</p><h2 id="5-Pitfalls-of-Upgrade-to-Native-PHP-Enums-and-How-to-Avoid-Them-by-Tomas-Votruba"><a href="#5-Pitfalls-of-Upgrade-to-Native-PHP-Enums-and-How-to-Avoid-Them-by-Tomas-Votruba" class="headerlink" title="5 Pitfalls of Upgrade to Native PHP Enums and How to Avoid Them by Tomas Votruba."></a>5 Pitfalls of Upgrade to Native PHP Enums and How to Avoid Them by Tomas Votruba.</h2><p><a href="https://tomasvotruba.com/blog/five-pitfalls-of-upgrade-to-native-php-enums-and-how-to-avoid-them/">네이티브 PHP 열거형으로 업그레이드할 때의 5가지 함정과 이를 피하는 방법</a> by Tomas Votruba</p><h2 id="On-the-use-of-enums-by-Larry-Garfield-–-When-should-you-use-PHP-enums-and-when-shouldn’t-you"><a href="#On-the-use-of-enums-by-Larry-Garfield-–-When-should-you-use-PHP-enums-and-when-shouldn’t-you" class="headerlink" title="On the use of enums by Larry Garfield – When should you use PHP enums, and when shouldn’t you?"></a>On the use of enums by Larry Garfield – When should you use PHP enums, and when shouldn’t you?</h2><p>Larry Garfield의 <a href="https://peakd.com/hive-168588/@crell/on-the-use-of-enums">enum 사용에 대해</a> – PHP enum을 언제 사용해야 하고 언제 사용하지 않아야 합니까?</p><h2 id="Effective-immutability-with-PHPStan-by-Matthias-Noback-–-DateTimeImmutable-is-actually-mutable"><a href="#Effective-immutability-with-PHPStan-by-Matthias-Noback-–-DateTimeImmutable-is-actually-mutable" class="headerlink" title="Effective immutability with PHPStan by Matthias Noback – DateTimeImmutable is actually mutable."></a>Effective immutability with PHPStan by Matthias Noback – DateTimeImmutable is actually mutable.</h2><p>Matthias Noback의 <a href="https://matthiasnoback.nl/2022/07/effective-immutability-with-phpstan/">PHPStan을 사용한 효과적인 불변성</a> <code>DateTimeImmutable</code>은 실제로 변경 가능합니다.</p><figure class="highlight php"><table><tr><td class="code"><pre><span class="line"><span class="variable">$dt</span> = <span class="keyword">new</span> <span class="title class_">DateTimeImmutable</span>(<span class="string">&#x27;now&#x27;</span>);</span><br><span class="line"><span class="keyword">echo</span> <span class="variable">$dt</span>-&gt;<span class="title function_ invoke__">getTimestamp</span>() . <span class="string">&quot;\n&quot;</span>;</span><br><span class="line"></span><br><span class="line"><span class="variable">$dt</span>-&gt;<span class="title function_ invoke__">__construct</span>(<span class="string">&#x27;tomorrow&#x27;</span>);</span><br><span class="line"><span class="keyword">echo</span> <span class="variable">$dt</span>-&gt;<span class="title function_ invoke__">getTimestamp</span>() . <span class="string">&quot;\n&quot;</span>;</span><br></pre></td></tr></table></figure><p>위와 같이 실제로 변경 가능하기 때문에, 진짜로 변경 가능하지 않도록 하려면 더 많은 노력이 듭니다.<br>그런데 대체 누가 __construct() 호출하나요?<br>그냥 마음 편하게 빌드 과정에서 PHPStan으로 잘 감시합시다…라고 하는 글입니다.</p><h2 id="Benchmarking-serialization-by-Larry-Garfield"><a href="#Benchmarking-serialization-by-Larry-Garfield" class="headerlink" title="Benchmarking serialization by Larry Garfield."></a>Benchmarking serialization by Larry Garfield.</h2><p>Larry Garfield의 <a href="https://peakd.com/hive-168588/@crell/benchmarking-serialization">직렬화 벤치마킹</a>.</p><h2 id="Decoupling-your-security-user-from-your-user-model-by-Matthias-Noback"><a href="#Decoupling-your-security-user-from-your-user-model-by-Matthias-Noback" class="headerlink" title="Decoupling your security user from your user model by Matthias Noback."></a>Decoupling your security user from your user model by Matthias Noback.</h2><p>Matthias Noback의 <a href="https://matthiasnoback.nl/2022/07/decoupling-your-security-user-from-your-user-model/">사용자 모델에서 보안 사용자 분리</a></p><h2 id="Complete-guide-for-PHP-amp-Neo4j-and-using-graph-databases-by-Michal-Stefanak"><a href="#Complete-guide-for-PHP-amp-Neo4j-and-using-graph-databases-by-Michal-Stefanak" class="headerlink" title="Complete guide for PHP &amp; Neo4j and using graph databases by Michal Štefaňák."></a>Complete guide for PHP &amp; Neo4j and using graph databases by Michal Štefaňák.</h2><p>Michal Štefaňák의 <a href="https://ko-fi.com/post/Complete-guide-for-PHP-Neo4j-Q5Q2DT98D">PHP 및 Neo4j에 대한 완벽 가이드</a>.</p><h2 id="How-to-automatically-add-return-type-declarations-with-Rector-and-without-breaking-your-code"><a href="#How-to-automatically-add-return-type-declarations-with-Rector-and-without-breaking-your-code" class="headerlink" title="How to automatically add return type declarations with Rector and without breaking your code."></a>How to automatically add return type declarations with Rector and without breaking your code.</h2><p>코드를 손상시키지 않고 Rector를 사용하여 <a href="https://getrector.org/blog/how-to-automatically-add-return-type-declarations-without-breaking-your-code">반환 유형 선언을 자동으로 추가하는 방법</a>.</p><h2 id="PHP-FPM-tuning-Using-‘pm-static’-for-max-performance-by-Hayden-James"><a href="#PHP-FPM-tuning-Using-‘pm-static’-for-max-performance-by-Hayden-James" class="headerlink" title="PHP-FPM tuning: Using ‘pm static’ for max performance by Hayden James."></a>PHP-FPM tuning: Using ‘pm static’ for max performance by Hayden James.</h2><p>Hayden James의 <a href="https://haydenjames.io/php-fpm-tuning-using-pm-static-max-performance/">PHP-FPM 튜닝: 최대 성능을 위해 ‘pm static’ 사용</a>.</p><h2 id="How-can-I-trust-my-test-suite-by-Antonello-D’Ippolito"><a href="#How-can-I-trust-my-test-suite-by-Antonello-D’Ippolito" class="headerlink" title="How can I trust my test suite? by Antonello D’Ippolito."></a>How can I trust my test suite? by Antonello D’Ippolito.</h2><p>안토넬로 디폴리토의 <a href="https://blog.mollie.com/how-can-i-trust-my-test-suite-f884390e79f3">내 테스트 스위트를 어떻게 신뢰할 수 있습니까?</a>.</p><h1 id="오디오-x2F-비디오"><a href="#오디오-x2F-비디오" class="headerlink" title="오디오&#x2F;비디오"></a>오디오&#x2F;비디오</h1><ul><li>🎬 Brent Roose의 <a href="https://www.youtube.com/watch?v=x9bSUo6TGgY">PHP 객체의 진화: PHP 5.6에서 PHP 8.2까지</a>.</li><li>🎬 Brent Roose의 <a href="https://www.youtube.com/watch?v=e0tstsbD4Ro">null 문제</a>.</li><li>🔈 무료 The Geek 팟캐스트 <a href="https://www.freethegeek.fm/38">에피소드 38</a> – Steve McDougall과 함께. 이 에피소드에서는 그가 스트리밍을 시작한 방법, 그가 Slim PHP 대신 Laravel을 사용하게 된 동기, 오픈 소스에 기여하는 것이 어떤 것인지 등을 다룹니다.</li><li>🎬 PHP 라운드테이블 <a href="https://www.youtube.com/watch?v=I9aDTqwhG6g">85: PHP 사용자 그룹 현황</a>.</li><li>🎬 <a href="https://www.youtube.com/playlist?list=PLL6_RArGSORJ2OU4qn8rJmIwSGBIc8C_X">로드 러너 비디오 자습서</a>.</li><li>🎬 <a href="https://www.youtube.com/watch?v=7YuYxbYd3P0">Docker 및 PhpStorm으로 Xdebug 3를 설치하는 방법</a>.</li></ul><h1 id="Community"><a href="#Community" class="headerlink" title="Community"></a>Community</h1><ul><li><p>Philip Sharp가 편집한 <a href="https://afieldguidetoelephpants.net/">ElePHPants에 대한 현장 가이드</a>. 57종의 코끼리가 있다는 사실, 알고 계셨나요?</p></li><li><p><a href="https://pufa.afup.org/">PUFA</a> – wordle과 비슷하지만 PHP 기능과 키워드를 추측하기 위한 것입니다.<br><img src="https://lh5.googleusercontent.com/Vp6o9LPEuKyeJPw8WGXfgCUMVSnK7J3FSSFEdxS7nCI1kh367q22xjP6bcasagawWJihlXyOaxHrLUzIzGe7WEJycqiLKDgIaEDJ2fWycuNZWPduluONVYiD0mM6_1fJW3k113o4fAHkR-js-dQ" alt="PUFA 화면"></p></li><li><p>Frédéric Bouchery(@FredBouchery)의 <a href="https://twitter.com/FredBouchery/status/1538817185686208513">트윗</a> </p><blockquote><p>I just came back from the future, this is what I read on a tombstone<br>#PHP #PhpNotDead</p></blockquote></li></ul><p><img src="https://pbs.twimg.com/media/FVr59WSWQAEzzzp?format=jpg&name=small" alt="I DIDNT THINK I WOULD DIE BEFORE PHP 비석"></p><hr><p>오늘은 여기까지입니다. 읽어주셔서 감사합니다!</p>]]></content>
    
    
      
      
        
        
    <summary type="html">&lt;p&gt;&lt;img src=&quot;https://blog.jetbrains.com/wp-content/uploads/2022/07/php-annotated-july2022-blog-featured-image-1280x600-1.png&quot; alt=&quot;PHP</summary>
        
      
    
    
    
    
    <category term="PHP" scheme="https://haah.kr/tags/PHP/"/>
    
    <category term="php-annotated" scheme="https://haah.kr/tags/php-annotated/"/>
    
    <category term="php-annotated-monthly" scheme="https://haah.kr/tags/php-annotated-monthly/"/>
    
  </entry>
  
  <entry>
    <title>PHP Annotated – June 2022</title>
    <link href="https://haah.kr/2022/06/18/php-annotated-june-2022/"/>
    <id>https://haah.kr/2022/06/18/php-annotated-june-2022/</id>
    <published>2022-06-18T00:59:27.000Z</published>
    <updated>2026-05-31T19:29:57.260Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://blog.jetbrains.com/wp-content/uploads/2022/06/php-annotated-blog-featured-image-1280x600-1.png" alt="PHP Annotated 이미지"></p><p><a href="https://blog.jetbrains.com/author/rpronskiy">Roman Pronskiy</a>가 쓰고 JetBrains에서 제공하는 PHP Annotated <a href="https://blog.jetbrains.com/phpstorm/2022/06/php-annotated-june-2022/">2022년 6월</a>의 번역&#x2F;해석본입니다.</p><p>이 중에서 몇 가지 제 취향껏 골라 그 안의 내용도 좀 뒤져보고 개발새발 번역해서 소개합니다.</p><hr><p>안녕하세요!</p><p>PHP Annotated 6월호에 오신 것을 환영합니다. 여기에서는 선별된 뉴스, 기사, 도구 및 비디오를 포함하여 지난 한 달 동안 PHP 세계에서 일어난 가장 흥미로운 일을 따라갈 것입니다.</p><blockquote><p>PHP Annotated 6월호를 편집하는 데 도움을 준 <a href="https://twitter.com/s_panteleev">Sergey Panteleev</a>에게 감사드립니다.</p></blockquote><h1 id="News"><a href="#News" class="headerlink" title="News"></a>News</h1><h2 id="php-net-received-a-new-homepage-design"><a href="#php-net-received-a-new-homepage-design" class="headerlink" title="php.net received a new homepage design!"></a>php.net received a new homepage design!</h2><p><a href="php.net">php.net</a>이 새로운 홈페이지 디자인을 받았습니다!</p><p>새로운 모습을 보여주신 Lucas Azevedo와 팀에 감사드립니다.</p><h2 id="❗PHP-7-4-30-PHP-8-0-20-and-PHP-8-1-7-have-been-released"><a href="#❗PHP-7-4-30-PHP-8-0-20-and-PHP-8-1-7-have-been-released" class="headerlink" title="❗PHP 7.4.30, PHP 8.0.20, and PHP 8.1.7 have been released"></a>❗PHP 7.4.30, PHP 8.0.20, and PHP 8.1.7 have been released</h2><p>PHP 7.4.30 , PHP 8.0.20 , PHP 8.1.7 이 릴리스되었습니다</p><p>이것은 지원되는 브랜치에 대한 보안 업데이트입니다. 모든 사용자는 최신 버전으로 업그레이드하는 것이 좋습니다.</p><h2 id="PHP-8-2-0-Alpha-1-has-been-released"><a href="#PHP-8-2-0-Alpha-1-has-been-released" class="headerlink" title="PHP 8.2.0 Alpha 1 has been released"></a>PHP 8.2.0 Alpha 1 has been released</h2><p><a href="https://www.php.net/archive/2022.php#2022-06-09-3">PHP 8.2.0 Alpha 1</a>이 릴리스되었습니다</p><p>PHP 8.2 릴리스 프로세스를 시작하는 첫 번째 알파가 출시되었습니다. 업데이트는 <a href="https://wiki.php.net/todo/php82#timetable">정해진 일정</a>에 따라 2주마다 릴리스되며 최종 릴리스는 11월 24일 경으로 예상됩니다.<br>기능 동결(feature freeze)은 7월 19일에 예상되며, 이는 일부 변경 사항이 여전히 릴리스에 포함될 수 있음을 의미합니다. 현재 가장 눈에 띄는 변화는 다음과 같습니다.</p><ul><li><a href="https://php.watch/versions/8.2/readonly-classes">읽기(readonly) 전용 클래스</a></li><li><a href="https://php.watch/versions/8.2/true-type">true 타입</a><ul><li>PHP 7.0에선 string, int, and bool 등의 scalar 타입을 지원하기 시작</li><li>PHP 8.0에선 Union 타입과 Union 타입에서 사용 가능한 false 타입을 지원</li><li>PHP 8.2에선 null, false와 함께 독립형 타입으로써 true도 사용할 수 있게 됐습니다.</li></ul></li><li><a href="https://php.watch/versions/8.2/null-false-types">독립형 타입으로써의 null과 false</a></li><li><a href="https://php.watch/versions/8.2/backtrace-parameter-redaction">민감한 매개변수 값을 감추는 기능 지원</a></li><li><a href="https://php.watch/versions/8.2/dynamic-properties-deprecated">동적 속성은 deprecated</a></li><li><a href="https://php.watch/versions/8.2/partially-supported-callable-deprecation">부분적으로 지원되는 callable은 deprecated</a></li><li><a href="https://php.watch/versions/8.2/$%7Bvar%7D-string-interpolation-deprecated"><code>$&#123;var&#125;</code> 문자열 보간은 deprecated</a></li></ul><p>전체 변경 사항 목록은 <a href="https://php.watch/versions/8.2">php.watch&#x2F;versions&#x2F;8.2</a>를 참조하십시오.</p><p>Mac을 사용하는 경우 <a href="https://github.com/shivammathur/homebrew-php">shivammathur&#x2F;homebrew-php</a> 덕분에 Nightly 채널을 통해 homebrew로 PHP 8.2를 사용해 볼 수 있습니다 .</p><p>그렇지 않으면 <a href="https://hub.docker.com/_/php?tab=tags&page=1&name=8.2.0">Docker 이미지</a>가 번거로움 없이 시도해 볼 수 있는 가장 좋은 옵션일 것입니다.</p><h2 id="PER-Coding-Style-has-been-tagged-1-0-0"><a href="#PER-Coding-Style-has-been-tagged-1-0-0" class="headerlink" title="PER Coding Style has been tagged 1.0.0"></a>PER Coding Style has been tagged 1.0.0</h2><p><a href="https://github.com/php-fig/per-coding-style">PER 코딩 스타일</a>에 1.0.0 태그가 지정되었습니다.</p><p>PHP-FIG(@phpfig)의 <a href="https://twitter.com/phpfig/status/1535140189428977664">트윗</a></p><blockquote><p>PER 코딩 스타일 1.0.0은 PSR-12와 동일합니다. 이 권장 사항은 이제 PHP 언어로 제공되는 모든 새로운 기능을 따라잡기 위해 훨씬 더 빠르게 발전할 것입니다.</p><p>작업 그룹 모두를 축하합니다!</p></blockquote><h2 id="PhpStorm-2022-2-Early-Access-Program-Is-Open"><a href="#PhpStorm-2022-2-Early-Access-Program-Is-Open" class="headerlink" title="PhpStorm 2022.2 Early Access Program Is Open"></a>PhpStorm 2022.2 Early Access Program Is Open</h2><p><a href="https://blog.jetbrains.com/phpstorm/2022/05/phpstorm-2022-2-early-access-program-is-open/">PhpStorm 2022.2 Early Access Program 공개</a></p><p>Rector의 Built-in 지원, PHP의 제네릭에 대한 많은 개선 사항 등이 있습니다.</p><h2 id="Developer-Ecosystem-Survey-2022"><a href="#Developer-Ecosystem-Survey-2022" class="headerlink" title="Developer Ecosystem Survey 2022"></a>Developer Ecosystem Survey 2022</h2><p><a href="https://surveys.jetbrains.com/s3/t-developer-ecosystem-survey-2022">개발자 생태계 설문조사 2022</a></p><p>연례 생태계 설문조사에 참여하여 MacBook Pro, Xbox Series X, PlayStation 5 또는 기타 상품을 받을 수 있는 기회를 잡으십시오.</p><h1 id="PHP-Core"><a href="#PHP-Core" class="headerlink" title="PHP Core"></a>PHP Core</h1><p>Core 뉴스의 대부분은 PHP Foundation 의 <a href="https://thephp.foundation/blog/2022/05/30/php-core-roundup-2/">PHP Core Roundup 시리즈</a>에서 자세히 다룹니다. 이 시리즈의 세 번째 에피소드가 곧 출시될 예정이므로 간략하게만 언급하겠습니다.</p><h2 id="✅-RFC-Add-true-type-PHP-8-2"><a href="#✅-RFC-Add-true-type-PHP-8-2" class="headerlink" title="✅ RFC: Add true type #PHP 8.2"></a>✅ RFC: Add true type #PHP 8.2</h2><p><a href="https://wiki.php.net/rfc/true-type">RFC: 트루 타입 추가</a> #PHP 8.2</p><p>유사 유형이었던 <code>null</code>과 <code>false</code>에 추가하여 PHP는 이제 <code>true</code> 독립형 유형을 갖게 되며 이는 <code>false</code>에 대응합니다.<br>자세한 내용 은 이 변경 사항의 작성자인 George P. Banyard와 함께 하는 Derik Rethans의 <a href="https://phpinternals.news/102">PHP Internals News 팟캐스트</a>를 들어보십시오.</p><h2 id="✅-RFC-Undefined-Property-Error-Promotion-PHP-9-0"><a href="#✅-RFC-Undefined-Property-Error-Promotion-PHP-9-0" class="headerlink" title="✅ RFC: Undefined Property Error Promotion #PHP 9.0"></a>✅ RFC: Undefined Property Error Promotion #PHP 9.0</h2><p><a href="https://wiki.php.net/rfc/undefined_property_error_promotion">RFC: 정의되지 않은 속성 접근 시 오류 발생</a> #PHP 9.0</p><p>기존 E_WARNING이 Error로 승격됩니다.<br>Magic 메서드로 handler를 통해 지원되는 getter 메서드는 유지됩니다.</p><h2 id="✅-RFC-Expand-deprecation-notice-scope-for-partially-supported-callables-PHP-8-2"><a href="#✅-RFC-Expand-deprecation-notice-scope-for-partially-supported-callables-PHP-8-2" class="headerlink" title="✅ RFC: Expand deprecation notice scope for partially supported callables #PHP 8.2"></a>✅ RFC: Expand deprecation notice scope for partially supported callables #PHP 8.2</h2><p><a href="https://wiki.php.net/rfc/partially-supported-callables-expand-deprecation-notices">RFC: 부분적으로 지원되는 callable에 대한 지원 중단 알림(deprecation notice) 범위 확장</a> #PHP 8.2</p><h2 id="📊-RFC-Stricter-implicit-boolean-coercion-PHP-8-2"><a href="#📊-RFC-Stricter-implicit-boolean-coercion-PHP-8-2" class="headerlink" title="📊 RFC: Stricter implicit boolean coercion #PHP 8.2"></a>📊 RFC: Stricter implicit boolean coercion #PHP 8.2</h2><p><a href="https://wiki.php.net/rfc/stricter_implicit_boolean_coercions">RFC: 더 엄격한 암시적 부울 강제 변환</a> #PHP 8.2</p><h2 id="📊-RFC-Create-a-global-login-system-for-php-net"><a href="#📊-RFC-Create-a-global-login-system-for-php-net" class="headerlink" title="📊 RFC: Create a global login system for php.net"></a>📊 RFC: Create a global login system for php.net</h2><p><a href="https://wiki.php.net/rfc/global_login">RFC: php.net용 글로벌 로그인 시스템 생성</a></p><p>RFC는 *.php.net 사이트용 SSO 생성을 제안합니다. 다만 시행 계획이 불투명해 1차 시도를 넘지 못할 가능성이 큽니다.</p><h2 id="📊-RFC-Random-Extension-5-x-PHP-8-2"><a href="#📊-RFC-Random-Extension-5-x-PHP-8-2" class="headerlink" title="📊 RFC: Random Extension 5.x #PHP 8.2"></a>📊 RFC: Random Extension 5.x #PHP 8.2</h2><p><a href="https://wiki.php.net/rfc/rng_extension">RFC: Random Extension 5.x</a> #PHP 8.2</p><p>이 RFC와 <a href="https://wiki.php.net/rfc/object_scope_prng">이전의 시도</a> 이후의 지속적인 노력에 감사드립니다.</p><h2 id="🤔-RFC-Fetch-properties-in-const-expressions-PHP-8-2"><a href="#🤔-RFC-Fetch-properties-in-const-expressions-PHP-8-2" class="headerlink" title="🤔 RFC: Fetch properties in const expressions #PHP 8.2"></a>🤔 RFC: Fetch properties in const expressions #PHP 8.2</h2><p><a href="https://wiki.php.net/rfc/fetch_property_in_const_expressions">RFC: const 표현식에서 속성 가져오기</a> #PHP 8.2</p><figure class="highlight php"><table><tr><td class="code"><pre><span class="line"><span class="class"><span class="keyword">enum</span> <span class="title">A</span>: <span class="title">string</span> </span>&#123;    </span><br><span class="line">    <span class="keyword">case</span> B = <span class="string">&#x27;B&#x27;</span>;</span><br><span class="line">    <span class="comment">// This is currently not permitted</span></span><br><span class="line">    <span class="keyword">const</span> <span class="variable constant_">C</span> = [<span class="built_in">self</span>::<span class="variable constant_">B</span>-&gt;value =&gt; <span class="built_in">self</span>::<span class="variable constant_">B</span>];</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>이것이 매우 유용할 수 있는 예가 있습니다. 예를 들어 <a href="https://github.com/symfony/symfony/pull/46363#issuecomment-1128578078"><code>Symfony and #[Target]</code></a>을 확인 하십시오.</p><h2 id="🤔-RFC-Short-Closures-2-0"><a href="#🤔-RFC-Short-Closures-2-0" class="headerlink" title="🤔 [RFC] Short Closures 2.0"></a>🤔 [RFC] Short Closures 2.0</h2><p><a href="https://wiki.php.net/rfc/auto-capture-closure">[RFC] Short Closures 2.0</a></p><p>원래 Nuno Maduro와 Larry Garfield가 제안했으며 현재 Arnaud Le Blanc가 채택한 이 RFC는 여러 명령문을 허용하여 화살표 함수를 확장하는 제안을 올렸습니다.</p><figure class="highlight php"><table><tr><td class="code"><pre><span class="line"><span class="function"><span class="keyword">fn</span> (<span class="params"></span>) </span>&#123;    </span><br><span class="line">    <span class="variable">$tmp</span> = <span class="variable">$a</span> + <span class="variable">$b</span>;</span><br><span class="line">    <span class="keyword">return</span> <span class="variable">$tmp</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="Interview-with-the-PHP-Foundation-Core-Developers-supplemented-with-answers-from-Arnaud-Le-Blanc"><a href="#Interview-with-the-PHP-Foundation-Core-Developers-supplemented-with-answers-from-Arnaud-Le-Blanc" class="headerlink" title="Interview with the PHP Foundation Core Developers supplemented with answers from Arnaud Le Blanc."></a>Interview with the PHP Foundation Core Developers supplemented with answers from Arnaud Le Blanc.</h2><p>Arnaud Le Blanc의 답변으로 보충 된 <a href="https://thephp.foundation/blog/2022/05/06/interview-with-core-developers/">PHP Foundation 핵심 개발자와의 인터뷰</a>.</p><h1 id="Tools"><a href="#Tools" class="headerlink" title="Tools"></a>Tools</h1><h2 id="Indigo-beta"><a href="#Indigo-beta" class="headerlink" title="Indigo (beta)"></a>Indigo (beta)</h2><p><a href="https://indigostack.app/">Indigo (베타)</a> — 이 도구는 Mac에서 로컬 개발 환경을 구성하고 실행하는 방식을 혁신하는 것을 목표로 합니다.</p><h2 id="Easy-ECC-1-0-0"><a href="#Easy-ECC-1-0-0" class="headerlink" title="Easy-ECC 1.0.0"></a>Easy-ECC 1.0.0</h2><p><a href="https://paragonie.com/blog/2022/06/recap-our-contributions-more-secure-internet">Paragon Initiative Enterprises 팀</a> 은 PHP에서 elliptic curve 암호화 작업을 더 쉽게 해주는 도구인 <a href="https://github.com/paragonie/easy-ecc">Easy-ECC</a> 1.0.0과 JWT에 대한 보다 안전한 대안인 <a href="https://github.com/paragonie/paseto">PASETO</a>를 출시했습니다.</p><h2 id="minicli-x2F-minicli"><a href="#minicli-x2F-minicli" class="headerlink" title="minicli&#x2F;minicli"></a>minicli&#x2F;minicli</h2><p><a href="https://github.com/minicli/minicli">minicli&#x2F;minicli</a> – CLI 중심 PHP 애플리케이션을 구축하기 위한 최소한의 종속성 없는 프레임워크입니다.</p><h2 id="crwlr-x2F-query-string"><a href="#crwlr-x2F-query-string" class="headerlink" title="crwlr&#x2F;query-string"></a>crwlr&#x2F;query-string</h2><p><a href="https://github.com/crwlrsoft/url">crwlr&#x2F;query-string</a> – URL용 스위스 군용 칼입니다. HTTP 요청에 대한 쿼리 문자열을 매우 편리하게 생성, 액세스 및 조작할 수 있습니다. 자세한 내용은 기사 를 참조하십시오.</p><h2 id="voku-x2F-simple-html-dom"><a href="#voku-x2F-simple-html-dom" class="headerlink" title="voku&#x2F;simple_html_dom"></a>voku&#x2F;simple_html_dom</h2><p><a href="https://github.com/voku/simple_html_dom">voku&#x2F;simple_html_dom</a> – 현대적이고 단순한 PHP용 HTML DOM 파서.</p><h2 id="PHP-CS-Fixer-Configurator"><a href="#PHP-CS-Fixer-Configurator" class="headerlink" title="PHP-CS-Fixer Configurator"></a>PHP-CS-Fixer Configurator</h2><p><a href="https://mlocati.github.io/php-cs-fixer-configurator/#version:3.8">PHP-CS-Fixer Configurator</a> – 모든 <a href="https://github.com/FriendsOfPHP/PHP-CS-Fixer">PHP CS Fixer</a> 옵션과 설명 이 있는 멋진 웹사이트입니다 .</p><h2 id="IvanGrigorov-x2F-VMValidator"><a href="#IvanGrigorov-x2F-VMValidator" class="headerlink" title="IvanGrigorov&#x2F;VMValidator"></a>IvanGrigorov&#x2F;VMValidator</h2><p><a href="https://github.com/IvanGrigorov/VMValidator">IvanGrigorov&#x2F;VMValidator</a> – PHP 모델을 검증(validate)하기 위한 attribute 세트입니다.</p><h2 id="thecodingmachine-x2F-graphqlite"><a href="#thecodingmachine-x2F-graphqlite" class="headerlink" title="thecodingmachine&#x2F;graphqlite"></a>thecodingmachine&#x2F;graphqlite</h2><p><a href="https://github.com/thecodingmachine/graphqlite">thecodingmachine&#x2F;graphqlite</a> – 이 도구를 사용하면 PHP 속성&#x2F;주석을 사용하여 GraphQL API를 선언할 수 있습니다.</p><h2 id="exakat-x2F-php-static-analysis-tools"><a href="#exakat-x2F-php-static-analysis-tools" class="headerlink" title="exakat&#x2F;php-static-analysis-tools"></a>exakat&#x2F;php-static-analysis-tools</h2><p><a href="https://github.com/exakat/php-static-analysis-tools">exakat&#x2F;php-static-analysis-tools</a> – 유용한 PHP 정적 분석 도구의 검토 목록입니다. Psalm&#x2F;PHPStan 뿐만이 아닙니다. PhpStorm의 모든 스마트한 검사기를 CI 파이프라인으로 가져오는 JetBrains의 도구인 <a href="https://www.jetbrains.com/help/qodana/qodana-php.html">Qodana PHP</a>도 있습니다 .</p><h2 id="nmcteam-x2F-3dash"><a href="#nmcteam-x2F-3dash" class="headerlink" title="nmcteam&#x2F;3dash"></a>nmcteam&#x2F;3dash</h2><p><a href="https://github.com/nmcteam/3dash">nmcteam&#x2F;3dash</a> – PHP용 가벼우 정적 사이트 생성기. <a href="https://sculpin.io/">Sculpin</a>과 <a href="https://jigsaw.tighten.com/">Jigsaw</a>도 멋지지만 이 작은 도구는 정말 깔끔하고 API가 매우 간단합니다. 빠르게 예시를 보려면 공식 웹사이트를 확인하세요: <a href="https://3dash.dev/">3dash.dev</a>.</p><h1 id="PhpStorm"><a href="#PhpStorm" class="headerlink" title="PhpStorm"></a>PhpStorm</h1><h2 id="DDEV-Integration-–-IntelliJ-IDEs-Plugin"><a href="#DDEV-Integration-–-IntelliJ-IDEs-Plugin" class="headerlink" title="DDEV Integration – IntelliJ IDEs Plugin"></a>DDEV Integration – IntelliJ IDEs Plugin</h2><p><a href="https://plugins.jetbrains.com/plugin/18813-ddev-integration">DDEV 통합 – IntelliJ IDE 플러그인</a> – PhpStorm용 <a href="https://github.com/drud/ddev">DDEV</a> 통합 플러그인 의 베타 버전입니다.</p><h2 id="Boost-your-productivity-in-Laravel-with-advanced-PhpStorm-setup-by-Dmitry-Khorev"><a href="#Boost-your-productivity-in-Laravel-with-advanced-PhpStorm-setup-by-Dmitry-Khorev" class="headerlink" title="Boost your productivity in Laravel with advanced PhpStorm setup by Dmitry Khorev"></a>Boost your productivity in Laravel with advanced PhpStorm setup by Dmitry Khorev</h2><p><a href="https://medium.com/@dkhorev/boost-your-productivity-in-laravel-with-advanced-phpstorm-setup-34a354efbbce">https://medium.com/@dkhorev/boost-your-productivity-in-laravel-with-advanced-phpstorm-setup-34a354efbbce</a></p><p>고급 PhpStorm 설정으로 Laravel에서 생산성을 높여보세요.</p><p>PhpStorm이 생산성을 위한 완벽한 IDE인 이유</p><ul><li>Huge list of static code inspections</li><li>Code auto-format and optimizing imports</li><li>Best IDE’s navigation tool (“Search Everywhere”)</li><li>Configurable common file and method templates</li><li>Laravel model&#x2F;query integration use cases</li><li>Git integration</li></ul><h2 id="Clean-and-minimalistic-PhpStorm-by-Brent-Roose"><a href="#Clean-and-minimalistic-PhpStorm-by-Brent-Roose" class="headerlink" title="Clean and minimalistic PhpStorm by Brent Roose"></a>Clean and minimalistic PhpStorm by Brent Roose</h2><p>Brent Roose의 <a href="https://stitcher.io/blog/clean-and-minimalistic-phpstorm">깨끗하고 최소한의 PhpStorm</a>.</p><ul><li>Hide all toolbars</li><li>Light colour schemes</li><li>Increased font size</li><li>Code folding</li><li>Tabs at the bottom</li><li>Undocked sidebar</li><li>The navigation bar</li><li>Distraction free mode</li><li>Scopes and file colours</li></ul><h1 id="Symfony"><a href="#Symfony" class="headerlink" title="Symfony"></a>Symfony</h1><h2 id="Symfony-6-1"><a href="#Symfony-6-1" class="headerlink" title="Symfony 6.1"></a>Symfony 6.1</h2><p><a href="https://symfony.com/blog/symfony-6-1-0-released">Symfony 6.1</a>이 출시되었으며 많은 <a href="https://symfony.com/blog/symfony-6-1-curated-new-features">새로운 기능</a>이 포함되어 있습니다 .</p><p>Ruud Kamphuis(@Ruud_)의 <a href="https://twitter.com/Ruud_/status/1530135229444370433">트윗</a></p><blockquote><p>Symfony 6.1은 3시간 전에 출시되었습니다. 방금 업그레이드 PR을 병합하고 프로덕션에 제공했습니다 🚀. 모든 것이 원활하게 실행됩니다.<br>애플리케이션은 ±10년이 넘었고 10k+ 클래스가 있으며 현재 20k rpm을 처리하고 있습니다.<br>모두 행복한 금요일 보내세요 😎<br><a href="https://jobs.ticketswap.com/">https://jobs.ticketswap.com</a></p></blockquote><h2 id="Get-certified-on-Symfony-6-and-Twig-3"><a href="#Get-certified-on-Symfony-6-and-Twig-3" class="headerlink" title="Get certified on Symfony 6 and Twig 3"></a>Get certified on Symfony 6 and Twig 3</h2><p><a href="https://symfony.com/blog/get-certified-on-symfony-6-and-twig-3">Symfony 6 및 Twig 3 인증 받기</a></p><p>이제 Symfony 6 및 Twig 3 온라인 자격증(certifications) 시험을 칠 수 있습니다. 두 시험 모두 처음부터 재작업되었습니다.</p><h2 id="A-Week-of-Symfony-806-6-12-June-2022"><a href="#A-Week-of-Symfony-806-6-12-June-2022" class="headerlink" title="A Week of Symfony #806 (6-12 June 2022)."></a>A Week of Symfony #806 (6-12 June 2022).</h2><p><a href="https://symfony.com/blog/a-week-of-symfony-806-6-12-june-2022">A Week of Symfony #806 (6-12 June 2022)</a></p><h2 id="Initializing-your-Symfony-project-with-solid-foundations-by-Loic-Vernet"><a href="#Initializing-your-Symfony-project-with-solid-foundations-by-Loic-Vernet" class="headerlink" title="Initializing your Symfony project with solid foundations by Loïc Vernet."></a>Initializing your Symfony project with solid foundations by Loïc Vernet.</h2><p><a href="https://www.strangebuzz.com/en/blog/initializing-your-symfony-project-with-solid-foundations">견고한 기반으로 Symfony 프로젝트를 초기화 하기</a></p><h2 id="How-to-test-Symfony-routes-to-make-huge-refactoring-safe-by-Tomas-Votruba"><a href="#How-to-test-Symfony-routes-to-make-huge-refactoring-safe-by-Tomas-Votruba" class="headerlink" title="How to test Symfony routes to make huge refactoring safe by Tomas Votruba."></a>How to test Symfony routes to make huge refactoring safe by Tomas Votruba.</h2><p><a href="https://tomasvotruba.com/blog/how-to-test-symfony-routes-to-make-huge-refactorings-safe/">거대한 리팩토링을 안전하게 만들기 위해 Symfony Route를 테스트하는 방법</a></p><h1 id="Laravel"><a href="#Laravel" class="headerlink" title="Laravel"></a>Laravel</h1><h2 id="spatie-x2F-laravel-comments-livewire"><a href="#spatie-x2F-laravel-comments-livewire" class="headerlink" title="spatie&#x2F;laravel-comments-livewire"></a>spatie&#x2F;laravel-comments-livewire</h2><p><a href="https://laravel-comments.com/">spatie&#x2F;laravel-comments-livewire</a> – Spatie의 새로운 유료 Livewire 패키지로 Laravel 애플리케이션의 모델과 주석을 연결합니다.</p><h2 id="laravel-x2F-vite-plugi"><a href="#laravel-x2F-vite-plugi" class="headerlink" title="laravel&#x2F;vite-plugi"></a>laravel&#x2F;vite-plugi</h2><p><a href="https://github.com/laravel/vite-plugin">laravel&#x2F;vite-plugi</a> – <a href="https://vitejs.dev/">Vite</a>는 빠른 개발 환경을 제공하고 프로덕션용 코드를 번들로 제공하는 최신 프론트엔드 빌드 도구입니다. Laravel은 이제 개발 및 프로덕션용 asset을 로드하기 위한 공식 플러그인 및 Blade 지시문을 제공하여 Vite와 원활하게 통합됩니다.</p><h2 id="hasinhayder-x2F-hydra"><a href="#hasinhayder-x2F-hydra" class="headerlink" title="hasinhayder&#x2F;hydra"></a>hasinhayder&#x2F;hydra</h2><p><a href="https://github.com/hasinhayder/hydra">hasinhayder&#x2F;hydra</a> – 뛰어난 사용자 및 역할 관리 API와 함께 제공되는 Laravel 9x + Laravel Sanctum이 포함된 zero-config API boilerplate입니다.</p><h2 id="Laravel-Artisan-Cheatsheet"><a href="#Laravel-Artisan-Cheatsheet" class="headerlink" title="Laravel Artisan Cheatsheet"></a>Laravel Artisan Cheatsheet</h2><p><a href="https://artisan.page/">Laravel Artisan Cheatsheet</a> – Laravel의 내장 Artisan 명령 및 해당 옵션에 대한 온라인 레퍼런스입니다.</p><h2 id="codestudiohq-x2F-laravel-totem"><a href="#codestudiohq-x2F-laravel-totem" class="headerlink" title="codestudiohq&#x2F;laravel-totem"></a>codestudiohq&#x2F;laravel-totem</h2><p><a href="https://github.com/codestudiohq/laravel-totem">codestudiohq&#x2F;laravel-totem</a> – 이 도구를 사용하면 잘 구성된 대시보드에서 Laravel 일정을 관리할 수 있습니다.</p><h2 id="worksome-x2F-request-factories"><a href="#worksome-x2F-request-factories" class="headerlink" title="worksome&#x2F;request-factories"></a>worksome&#x2F;request-factories</h2><p><a href="https://github.com/worksome/request-factories">worksome&#x2F;request-factories</a> – 그 모든 boilerplate 없이도 Laravel에서 요청을 테스트합니다.</p><h2 id="35-Laravel-Eloquent-Recipes-by-Martin-Joo"><a href="#35-Laravel-Eloquent-Recipes-by-Martin-Joo" class="headerlink" title="35 Laravel Eloquent Recipes by Martin Joo"></a>35 Laravel Eloquent Recipes by Martin Joo</h2><p><a href="https://martinjoo.dev/35-eloquent-recipes">35 Laravel Eloquent Recipes</a></p><h2 id="Laravel-Route-Grouping-6-Techniques-to-Organize-Routes-by-Povilas-Korop"><a href="#Laravel-Route-Grouping-6-Techniques-to-Organize-Routes-by-Povilas-Korop" class="headerlink" title="Laravel Route Grouping: 6 Techniques to Organize Routes by Povilas Korop"></a>Laravel Route Grouping: 6 Techniques to Organize Routes by Povilas Korop</h2><p><a href="https://laravel-news.com/laravel-route-organization-tips">Laravel Route 그룹화: Route 구성을 위한 6가지 기술</a></p><h2 id="How-To-Implement-Laravel-Dynamic-Scheduling-by-Ian-Kumu"><a href="#How-To-Implement-Laravel-Dynamic-Scheduling-by-Ian-Kumu" class="headerlink" title="How To Implement Laravel Dynamic Scheduling by Ian Kumu"></a>How To Implement Laravel Dynamic Scheduling by Ian Kumu</h2><p><a href="https://www.iankumu.com/blog/laravel-dynamic-scheduling/">Laravel Dynamic Scheduling 구현 방법</a></p><h2 id="Restructuring-a-Laravel-Controller-using-Services-Events-Jobs-Actions-and-more-by-Povilas-Korop"><a href="#Restructuring-a-Laravel-Controller-using-Services-Events-Jobs-Actions-and-more-by-Povilas-Korop" class="headerlink" title="Restructuring a Laravel Controller using Services, Events, Jobs, Actions, and more by Povilas Korop."></a>Restructuring a Laravel Controller using Services, Events, Jobs, Actions, and more by Povilas Korop.</h2><p><a href="https://laravel-news.com/controller-refactor">Services, Events, Jobs, Actions 등을 사용하여 Laravel 컨트롤러를 재구성합니다.</a></p><h1 id="기타"><a href="#기타" class="headerlink" title="기타"></a>기타</h1><h2 id="My-PHP-enum-style-guide-by-Brent-Roose"><a href="#My-PHP-enum-style-guide-by-Brent-Roose" class="headerlink" title="My PHP enum style guide by Brent Roose."></a>My PHP enum style guide by Brent Roose.</h2><p>Brent Roose의 <a href="https://stitcher.io/blog/php-enum-style-guide">PHP 열거형(enum) 스타일 가이드</a>.</p><h2 id="List-o-mania-by-Mark-Baker-An-article-on-PHP’s-list-construct-with-some-clever-tricks-and-a-few-of-its-limitations"><a href="#List-o-mania-by-Mark-Baker-An-article-on-PHP’s-list-construct-with-some-clever-tricks-and-a-few-of-its-limitations" class="headerlink" title="List-o-mania by Mark Baker. An article on PHP’s list construct with some clever tricks and a few of its limitations."></a>List-o-mania by Mark Baker. An article on PHP’s list construct with some clever tricks and a few of its limitations.</h2><p>Mark Baker의 <a href="https://markbakeruk.net/2022/06/06/list-o-mania/">List-o-mania</a>. list 몇 가지 영리한 트릭과 몇 가지 제한 사항이 포함된 PHP의 list 구성에 대한 기사입니다 .</p><h2 id="The-very-useful-variadic-argument-by-Damien-Seguy"><a href="#The-very-useful-variadic-argument-by-Damien-Seguy" class="headerlink" title="The very useful variadic argument by Damien Seguy."></a>The very useful variadic argument by Damien Seguy.</h2><p>Damien Seguy의 <a href="https://www.exakat.io/en/the-very-useful-variadic-argument/">매우 유용한 가변 인수</a>.</p><h2 id="Reviewing-Property-Declaration-In-PHP-by-Damien-Seguy"><a href="#Reviewing-Property-Declaration-In-PHP-by-Damien-Seguy" class="headerlink" title="Reviewing Property Declaration In PHP by Damien Seguy."></a>Reviewing Property Declaration In PHP by Damien Seguy.</h2><p>Damien Seguy의 <a href="https://www.exakat.io/en/reviewing-property-declaration-in-php/">PHP에서 속성 선언 검토</a>.</p><h1 id="Community"><a href="#Community" class="headerlink" title="Community"></a>Community</h1><h2 id="2022-PHP-Conferences-List"><a href="#2022-PHP-Conferences-List" class="headerlink" title="2022 PHP Conferences List"></a>2022 PHP Conferences List</h2><p><a href="https://getparthenon.com/blog/2022-php-conferences-list/">https://getparthenon.com/blog/2022-php-conferences-list/</a></p><h2 id="Check-out-these-funny-t-shirts-by-Rafael-Dohms"><a href="#Check-out-these-funny-t-shirts-by-Rafael-Dohms" class="headerlink" title="Check out these funny t-shirts by Rafael Dohms:"></a>Check out these funny t-shirts by Rafael Dohms:</h2><p><a href="https://twitter.com/rdohms">Rafael Doohms</a>의 <a href="https://www.etsy.com/shop/DeveloperWear">재미있는 티셔츠</a>를 확인 하세요 .</p><p><img src="https://blog.jetbrains.com/wp-content/uploads/2022/06/il_1588xN.3968791093_8rig.webp" alt="재미있는 티셔츠 이미지"></p><h2 id="Where-can-you-get-an-elephpant"><a href="#Where-can-you-get-an-elephpant" class="headerlink" title="Where can you get an elephpant?"></a>Where can you get an elephpant?</h2><p><a href="https://www.exakat.io/en/where-can-you-get-an-elephpant-php-elephant/">코끼리는 어디서 구하나요?</a></p><ul><li>하늘색과 분홍색: <a href="https://www.elephpant.com/">elephpant.com</a>.</li><li>블루 <a href="https://www.exakat.io/product/inphpinity/">PHP 8 inphpinity</a> : <a href="https://www.exakat.io/product/inphpinity/">exakat.io</a>.</li><li>흰색, 조커 및 진한 파란색: <a href="https://shop.confoo.ca/toys">confoo.ca</a>.</li><li>주황색: <a href="https://thelia.net/index.php/thelia-elephpant.html">lia.net</a>.</li><li>이탈리아 삼색: <a href="https://shop.grusp.org/product/aida-phpday-elephpant/?v=796834e7a283">grusp.org</a>.</li><li>주황색 php[architect]: <a href="http://www.phparch.com/">phparch.com&#x2F;swag</a>.</li><li>레드 라라벨: <a href="https://www.phparch.com/swag/laravel-plush-elephpant/">phparch.com&#x2F;swag</a>.</li></ul><h2 id="워드프레스에도-사랑스러운-마스코트가-있다는-것을-알고-계셨나요"><a href="#워드프레스에도-사랑스러운-마스코트가-있다는-것을-알고-계셨나요" class="headerlink" title="워드프레스에도 사랑스러운 마스코트가 있다는 것을 알고 계셨나요?"></a>워드프레스에도 사랑스러운 마스코트가 있다는 것을 알고 계셨나요?</h2><p>WordPress(@WordPress)의 <a href="https://twitter.com/WordPress/status/1532344032327761922">트윗</a></p><blockquote><p><a href="https://twitter.com/hashtag/Wapuu?src=hashtag_click">#Wapuu</a>는 WordCamp Europe의 모든 곳에서 진행됩니다! 당신은 그에 대해 얼마나 많은 다른 사진을 얻을 수 있습니까? 우리가 모두 볼 수 있도록 <a href="http://wordpress.org/photos">http://wordpress.org/photos</a>에 게시 하십시오!</p></blockquote><blockquote><p>📸 아래 사진은 <a href="https://twitter.com/hashtag/WordPress?src=hashtag_click">#WordPress</a> 사진 디렉토리 <a href="https://t.co/90SvbhINp6">bit.ly&#x2F;3PMYBe7</a>에서 Nicholas Garofalo의 “Wapuu ready to travel to <a href="https://twitter.com/hashtag/WCEU?src=hashtag_click">#WCEU</a>“</p></blockquote><p><img src="https://pbs.twimg.com/media/FUP6xsVXoAAq-7z?format=jpg&name=large" alt="Yellow Wapuu 이미지"></p>]]></content>
    
    
      
      
        
        
    <summary type="html">&lt;p&gt;&lt;img src=&quot;https://blog.jetbrains.com/wp-content/uploads/2022/06/php-annotated-blog-featured-image-1280x600-1.png&quot; alt=&quot;PHP Annotated</summary>
        
      
    
    
    
    
    <category term="PHP" scheme="https://haah.kr/tags/PHP/"/>
    
    <category term="php-annotated" scheme="https://haah.kr/tags/php-annotated/"/>
    
    <category term="php-annotated-monthly" scheme="https://haah.kr/tags/php-annotated-monthly/"/>
    
  </entry>
  
  <entry>
    <title>PHP Annotated – May 2022</title>
    <link href="https://haah.kr/2022/05/27/php-annotated-may-2022/"/>
    <id>https://haah.kr/2022/05/27/php-annotated-may-2022/</id>
    <published>2022-05-27T14:24:59.000Z</published>
    <updated>2026-05-31T19:29:57.261Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://blog.jetbrains.com/wp-content/uploads/2020/01/phpstorm-PHP_Annotated_blog_1600x800.png" alt="Php_annotated 이미지"></p><p><a href="https://blog.jetbrains.com/author/rpronskiy">Roman Pronskiy</a>가 쓰고 JetBrains에서 제공하는 PHP Annotated <a href="https://blog.jetbrains.com/phpstorm/2022/05/php-annotated-may-2022/">2022년 5월</a>의 번역&#x2F;해석본입니다.</p><p>이 중에서 몇 가지 제 취향껏 골라 그 안의 내용도 좀 뒤져보고 개발새발 번역해서 소개합니다.</p><hr><p>안녕하세요!</p><p>PHP Annotated 5월호에 오신 것을 환영합니다. 여기에서는 선별된 뉴스, 기사, 도구 및 비디오를 포함하여 지난 한 달 동안 PHP 세계에서 일어난 가장 흥미로운 일을 따라잡았습니다.</p><blockquote><p>PHP Annotated 5월호를 편집하는 데 도움을 준 <a href="https://twitter.com/s_panteleev">Sergey Panteleev</a>에게 감사드립니다.</p></blockquote><h1 id="News"><a href="#News" class="headerlink" title="News"></a>News</h1><h2 id="PHP-8-1-6-and-PHP-8-0-19-released"><a href="#PHP-8-1-6-and-PHP-8-0-19-released" class="headerlink" title="PHP 8.1.6 and PHP 8.0.19 released"></a>PHP 8.1.6 and PHP 8.0.19 released</h2><p><a href="https://www.php.net/ChangeLog-8.php#8.1.6">https://www.php.net/ChangeLog-8.php#8.1.6</a><br><a href="https://www.php.net/ChangeLog-8.php#8.0.19">https://www.php.net/ChangeLog-8.php#8.0.19</a></p><p>활성(active) branch에 비보안 버그 수정 업데이트입니다.</p><h2 id="Release-managers-for-PHP-8-2-have-been-selected"><a href="#Release-managers-for-PHP-8-2-have-been-selected" class="headerlink" title="Release managers for PHP 8.2 have been selected!"></a>Release managers for PHP 8.2 have been selected!</h2><p><a href="https://wiki.php.net/todo/php82">https://wiki.php.net/todo/php82</a></p><p>PHP 8.2의 릴리스 관리자가 선정되었습니다!</p><p>바로 <a href="https://twitter.com/adoyy">Pierrick Charron</a>과 <a href="https://twitter.com/s_panteleev">Sergey Panteleev</a>입니다. PHP 8.1 RM인 <a href="https://twitter.com/ramsey">Ben Remsey</a>가 새로운 신입 RM을 도울 것입니다.</p><p><a href="https://php.watch/versions/8.2">PHP.Watch</a> 및 Brent의 <a href="https://stitcher.io/blog/new-in-php-82">What’s new in PHP 8.2</a> 게시물에서 PHP 8.2가 어떻게 형성되고 있는지 확인할 수 있습니다. 첫 번째 예비 PHP 8.2 벤치마크는 PHP 8.1에 비해 2.5% 성능 향상을 보여줍니다.</p><h2 id="Popular-Python-and-PHP-libraries-hijacked-to-steal-AWS-keys"><a href="#Popular-Python-and-PHP-libraries-hijacked-to-steal-AWS-keys" class="headerlink" title="Popular Python and PHP libraries hijacked to steal AWS keys"></a>Popular Python and PHP libraries hijacked to steal AWS keys</h2><p><a href="https://www.bleepingcomputer.com/news/security/popular-python-and-php-libraries-hijacked-to-steal-aws-keys/">https://www.bleepingcomputer.com/news/security/popular-python-and-php-libraries-hijacked-to-steal-aws-keys/</a></p><p><a href="https://sockpuppets.medium.com/how-i-hacked-ctx-and-phpass-modules-656638c6ec5e">PHPass 패키지가 어떻게 해킹되었는지</a> 알아보세요. (위 기사와는 조금 다른 내용입니다.)</p><ul><li>Rust&#x2F;Python&#x2F;PHP&#x2F;Node의 유명 패키지 레지스트리에서 소유자의 이메일이나 연결된 github 계정이 유효하지 않는 패키지를 탈취할 수 있음을 보여주고,<br>이메일 계정을 탈취하기 위해 도메인을 구입하거나 폐기된 GitHub 리포지토리를 다시 살렸다고 합니다(사실 폐기된 리포지토리명으로 생성은 안 되는데 아무렇게 만든 뒤 변경하는 방식으로는 가능했습니다). 이렇게 탈취한 뒤 악성코드를 심어 새로운 버전을 올리거나 최신 버전을 수정(이것도 문제)한 뒤 사용자들이 가져가게 합니다.</li></ul><h2 id="PHP-FIG-has-published-a-security-related-errata-on-PSR-7"><a href="#PHP-FIG-has-published-a-security-related-errata-on-PSR-7" class="headerlink" title="PHP-FIG has published a security related errata on PSR-7"></a>PHP-FIG has published a security related errata on PSR-7</h2><p><a href="https://www.php-fig.org/psr/psr-7/meta/#7-errata">https://www.php-fig.org/psr/psr-7/meta/#7-errata</a></p><p>PHP-FIG는 PSR-7에 대한 보안 관련 정오표를 게시했습니다. MessageInterface 구현 시 몇몇 문자를 거부하는 등 헤더를 검증해야 합니다.</p><h2 id="WordPress-6-0"><a href="#WordPress-6-0" class="headerlink" title="WordPress 6.0"></a>WordPress 6.0</h2><p><a href="https://wordpress.org/news/2022/05/arturo/">https://wordpress.org/news/2022/05/arturo/</a></p><p>많은 유용한 기능과 UI 개선이 포함됐습니다.</p><h2 id="Moodle-4"><a href="#Moodle-4" class="headerlink" title="Moodle 4"></a>Moodle 4</h2><p><a href="https://moodle.com/news/moodle-4-is-here/">https://moodle.com/news/moodle-4-is-here/</a></p><p>인기 있는 오픈 소스 e-러닝 플랫폼의 주요 업데이트입니다.</p><h2 id="Developer-Ecosystem-Survey-2022"><a href="#Developer-Ecosystem-Survey-2022" class="headerlink" title="Developer Ecosystem Survey 2022"></a>Developer Ecosystem Survey 2022</h2><p><a href="https://surveys.jetbrains.com/s3/t-developer-ecosystem-survey-2022">https://surveys.jetbrains.com/s3/t-developer-ecosystem-survey-2022</a></p><p>2022년 개발자 에코시스템에 관한 설문조사에 참여하여 MacBook Pro, Xbox Series X, PlayStation 5 또는 기타 상품을 받을 수 있는 기회를 잡으십시오.</p><h1 id="PHP-Core"><a href="#PHP-Core" class="headerlink" title="PHP Core"></a>PHP Core</h1><p>Core 뉴스의 대부분은 PHP Foundation의 <a href="https://thephp.foundation/blog/2022/04/28/php-roundup-1/">PHP Core Roundup 시리즈</a>에서 자세히 다룹니다. 시리즈의 두 번째 에피소드가 곧 출시될 예정이므로 간략하게만 언급하겠습니다.</p><h2 id="🤔-RFC-Stricter-implicit-boolean-coercions"><a href="#🤔-RFC-Stricter-implicit-boolean-coercions" class="headerlink" title="🤔 [RFC] Stricter implicit boolean coercions"></a>🤔 [RFC] Stricter implicit boolean coercions</h2><p><a href="https://wiki.php.net/rfc/stricter_implicit_boolean_coercions">https://wiki.php.net/rfc/stricter_implicit_boolean_coercions</a></p><p>논의 중.</p><p>암시적인 bool 값 변환을 좀 더 엄격하게 제한하고자 합니다.</p><h2 id="🤔-RFC-Expand-deprecation-notice-scope-for-partially-supported-callables"><a href="#🤔-RFC-Expand-deprecation-notice-scope-for-partially-supported-callables" class="headerlink" title="🤔 [RFC] Expand deprecation notice scope for partially supported callables"></a>🤔 [RFC] Expand deprecation notice scope for partially supported callables</h2><p><a href="https://wiki.php.net/rfc/partially-supported-callables-expand-deprecation-notices">https://wiki.php.net/rfc/partially-supported-callables-expand-deprecation-notices</a></p><p>논의 중.</p><p>이미 8.2에 accept된 [PHP RFC: Deprecate partially supported callables]의 범위를 확장하고자 하는 추가 RFC입니다. 이 RFC에 대한 자세한 내용은 <a href="https://twitter.com/jrf_nl">Julliette</a>와 함께하는 <a href="https://phpinternals.news/101">PHP Internals News 팟캐스트</a>를 들어보십시오.</p><h2 id="✅-RFC-Undefined-Property-Error-Promotion"><a href="#✅-RFC-Undefined-Property-Error-Promotion" class="headerlink" title="✅ [RFC] Undefined Property Error Promotion"></a>✅ [RFC] Undefined Property Error Promotion</h2><p><a href="https://wiki.php.net/rfc/undefined_property_error_promotion">https://wiki.php.net/rfc/undefined_property_error_promotion</a></p><p>PHP 9.0에 Accept 됐습니다.</p><p>정의되지 않은 속성에 엑세스하면 이전엔 E_NOTICE, PHP 8.0부터는 E_WARNING, PHP 9.0부터는 error를 throw합니다.</p><h2 id="✅-RFC-MySQLi-Execute-Query"><a href="#✅-RFC-MySQLi-Execute-Query" class="headerlink" title="✅ [RFC] MySQLi Execute Query"></a>✅ [RFC] MySQLi Execute Query</h2><p><a href="https://wiki.php.net/rfc/mysqli_execute_query">https://wiki.php.net/rfc/mysqli_execute_query</a></p><p>PHP 8.2에 Accept 됐습니다.</p><p>매개변수화된 쿼리와 함께 mysqli를 더 쉽게 사용할 수 있습니다.</p><h2 id="✅-RFC-Readonly-classes"><a href="#✅-RFC-Readonly-classes" class="headerlink" title="✅ [RFC] Readonly classes"></a>✅ [RFC] Readonly classes</h2><p><a href="https://wiki.php.net/rfc/readonly_classes">https://wiki.php.net/rfc/readonly_classes</a></p><p>PHP 8.2에 Accept 됐습니다.</p><p>Giuseppe Mazzapica(@gmazzap)의 <a href="https://twitter.com/gmazzap/status/1524454362889793536">트윗</a></p><blockquote><p>With <a href="https://wiki.php.net/rfc/readonly_classes">https://wiki.php.net/rfc/readonly_classes</a> accepted, having read-only &amp; type-safe simple data structures is going to be very easy in PHP 8.2<br><img src="https://pbs.twimg.com/media/FSfyLX-XIAAy-0x?format=jpg&name=small" alt="readonly class sample code"></p></blockquote><h2 id="The-PHP-Foundation-Interview-with-Core-Developers"><a href="#The-PHP-Foundation-Interview-with-Core-Developers" class="headerlink" title="The PHP Foundation: Interview with Core Developers"></a>The PHP Foundation: Interview with Core Developers</h2><p><a href="https://thephp.foundation/blog/2022/05/06/interview-with-core-developers/">https://thephp.foundation/blog/2022/05/06/interview-with-core-developers/</a></p><p>PHP 재단의 핵심 개발자와의 인터뷰 – Sebastian Bergman이 George, Derick, Ilija, Jakub 및 Máté를 인터뷰합니다. 곧 <a href="https://twitter.com/arnaud_lb">Arnaud</a>의 답변도 알려 드리겠습니다.</p><h2 id="opcache-최적화-프로그램"><a href="#opcache-최적화-프로그램" class="headerlink" title="opcache 최적화 프로그램"></a>opcache 최적화 프로그램</h2><p><a href="https://www.npopov.com/2022/05/22/The-opcache-optimizer.html">https://www.npopov.com/2022/05/22/The-opcache-optimizer.html</a></p><p>Nikita Popov는 PHP 핵심 엔진에 대한 심층 분석 시리즈를 계속합니다.</p><h1 id="Tools"><a href="#Tools" class="headerlink" title="Tools"></a>Tools</h1><h2 id="azjezz-x2F-psl-2-0"><a href="#azjezz-x2F-psl-2-0" class="headerlink" title="azjezz&#x2F;psl 2.0"></a>azjezz&#x2F;psl 2.0</h2><p><a href="https://github.com/azjezz/psl">https://github.com/azjezz/psl</a></p><p>PHP 표준 라이브러리 – 현대적이고 일관되고 중앙 집중식이며 type을 충분히 사용하는 PHP용 non-blocking API 세트입니다. 이 주요 업데이트에는 비동기, TCP, UDP, 파일, IO 등과 같은 많은 개선 사항과 새로운 구성 요소가 포함되어 있습니다.</p><h2 id="clue-x2F-framework-x"><a href="#clue-x2F-framework-x" class="headerlink" title="clue&#x2F;framework-x"></a>clue&#x2F;framework-x</h2><p><a href="https://github.com/clue/framework-x">https://github.com/clue/framework-x</a></p><p>반응형 웹 애플리케이션을 구축하기 위한 간단하고 빠른 마이크로 프레임워크입니다. ReactPHP 비동기 스택 위에서 실행됩니다.</p><p>Christian Lück(@another_clue)의 <a href="https://twitter.com/another_clue/status/1527668009975926785">트윗</a></p><blockquote><p>@ReactPHP is going to be even more awesome! 🚀<br>Currently boosting performance from  32000 to 39000 requests&#x2F;s.<br>This makes 18 billion requests per month on top 😎 On my laptop! On a single CPU core! 🔥<br>PHP scales! 💯</p></blockquote><h2 id="MedUnes-x2F-php-spx-installer"><a href="#MedUnes-x2F-php-spx-installer" class="headerlink" title="MedUnes&#x2F;php-spx-installer"></a>MedUnes&#x2F;php-spx-installer</h2><p><a href="https://github.com/MedUnes/php-spx-installer">https://github.com/MedUnes/php-spx-installer</a></p><p><a href="https://github.com/NoiseByNorthwest/php-spx">PHP SPX</a>(A simple profiler for PHP)용 설치 프로그램입니다.</p><h2 id="bmitch-x2F-churn-php"><a href="#bmitch-x2F-churn-php" class="headerlink" title="bmitch&#x2F;churn-php"></a>bmitch&#x2F;churn-php</h2><p><a href="https://github.com/bmitch/churn-php">https://github.com/bmitch/churn-php</a></p><p>리팩토링이 필요한 파일을 검색합니다. 경로에 있는 각 PHP 파일을 검사하고 순환적 복잡성과 변경 기록을 기반으로 점수를 부여합니다.</p><p>PhpStorm에서는 여러 메트릭을 기반으로 리팩토링 후보를 찾는 built-in Refactoring Opportunities 검사를 활성화할 수 있습니다. <a href="https://blog.jetbrains.com/phpstorm/2021/07/phpstorm-2021-2-release/#refactoring_opportunities">여기</a>에서 자세히 알아보십시오.</p><p><img src="https://blog.jetbrains.com/wp-content/uploads/2021/06/inspections_refactoring_opportunities.png" alt="Refactoring Opportunities 검사 옵션"></p><p>역자 주 :<br>PhpStorm 2021.2부터 들어왔지만, IntelliJ에 PHP plugin을 사용하고 계신 분이면 이 옵션이 안 보일 수 있습니다. 이때는 <a href="https://plugins.jetbrains.com/plugin/17518-php-architecture">PHP Architecture</a> plugin을 추가로 설치하시면 됩니다.<br>아래 플러그인으로도 비슷한 효과를 보실 수 있습니다.</p><ul><li><a href="https://plugins.jetbrains.com/plugin/7622-php-inspections-ea-extended-">Php Inspections (EA Extended)</a></li><li><a href="https://plugins.jetbrains.com/plugin/7973-sonarlint">SonarLint</a></li></ul><h2 id="Monolog-3-0"><a href="#Monolog-3-0" class="headerlink" title="Monolog 3.0"></a>Monolog 3.0</h2><p><a href="https://github.com/Seldaek/monolog/releases/tag/3.0.0">https://github.com/Seldaek/monolog/releases/tag/3.0.0</a></p><p>대부분 cleanup 릴리스입니다. 더 강력한 type을 제공하고 이제 최소 PHP 8.1이 필요합니다.</p><h2 id="Tinkerwell-3"><a href="#Tinkerwell-3" class="headerlink" title="Tinkerwell 3"></a>Tinkerwell 3</h2><p><a href="https://tinkerwell.app/">https://tinkerwell.app/</a></p><p>The paid PHP code runner received a major update. Learn more.<br>유료 PHP 코드 러너가 메이저 업데이트 됐습니다. <a href="https://laravel-news.com/tinkerwell-3">자세히 알아보기</a>.</p><h2 id="Blackfire-io"><a href="#Blackfire-io" class="headerlink" title="Blackfire.io"></a>Blackfire.io</h2><p><a href="https://blackfire.io/">https://blackfire.io/</a></p><p>PHP 코드에서 병목 현상을 찾기 위한 이 다목적 도구는 이제 <a href="https://blog.blackfire.io/blackfire-supports-open-source-projects.html">오픈 소스 프로젝트에서 무료</a>입니다 .</p><h2 id="TomasVotruba-x2F-awesome-php-ast"><a href="#TomasVotruba-x2F-awesome-php-ast" class="headerlink" title="TomasVotruba&#x2F;awesome-php-ast"></a>TomasVotruba&#x2F;awesome-php-ast</h2><p><a href="https://github.com/TomasVotruba/awesome-php-ast">https://github.com/TomasVotruba/awesome-php-ast</a></p><p>A curated list of tools, articles, and books about abstract syntax trees in the PHP world.<br>PHP 세계의 추상 구문 트리에 대한 도구, 기사 및 책의 선별된 목록입니다.</p><h2 id="friendsoftwig-x2F-twigcs"><a href="#friendsoftwig-x2F-twigcs" class="headerlink" title="friendsoftwig&#x2F;twigcs"></a>friendsoftwig&#x2F;twigcs</h2><p><a href="https://github.com/friendsoftwig/twigcs">https://github.com/friendsoftwig/twigcs</a></p><p>Twig 템플릿의 스타일 체커.</p><h2 id="PHPStan-1-7-0"><a href="#PHPStan-1-7-0" class="headerlink" title="PHPStan 1.7.0"></a>PHPStan 1.7.0</h2><p><a href="https://phpstan.org/">https://phpstan.org/</a></p><p>완전히 static한 리플렉션을 추가하고 @phpstan-consistent-constructor를 구현하고 <a href="https://github.com/phpstan/phpstan-src/pull/1296">new static() 문제</a>를 해결하는 또 다른 방법으로 새로운 규칙을 추가한 버전입니다.</p><p>역자 주:<br>현재 블로그에는 1.7에 관한 내용이 없는데, <a href="https://github.com/phpstan/phpstan/releases/tag/1.7.0">GitHub release 페이지</a>에서 내용을 확인하실 수 있습니다.</p><h2 id="Latte-3-0-0"><a href="#Latte-3-0-0" class="headerlink" title="Latte 3.0.0"></a>Latte 3.0.0</h2><p><a href="https://blog.nette.org/en/latte-3-an-impressive-leap#">https://blog.nette.org/en/latte-3-an-impressive-leap#</a></p><p>완전히 재작성된 인기있는 템플릿 엔진의 업데이트.</p><h2 id="dingo-d-x2F-wp-pest-integration-test-setup"><a href="#dingo-d-x2F-wp-pest-integration-test-setup" class="headerlink" title="dingo-d&#x2F;wp-pest-integration-test-setup"></a>dingo-d&#x2F;wp-pest-integration-test-setup</h2><p><a href="https://github.com/dingo-d/wp-pest-integration-test-setup">https://github.com/dingo-d/wp-pest-integration-test-setup</a></p><p>Pest로된 WordPress 통합 테스트 스위트를 추가하는 패키지입니다. 사용 방법에 대한 자세한 내용은 이 <a href="https://madebydenis.com/wordpress-integration-tests-with-pest-php/">블로그 게시물</a>을 읽어 보세요.</p><h2 id="CuyZ-x2F-Valinor"><a href="#CuyZ-x2F-Valinor" class="headerlink" title="CuyZ&#x2F;Valinor"></a>CuyZ&#x2F;Valinor</h2><p><a href="https://github.com/CuyZ/Valinor">https://github.com/CuyZ/Valinor</a></p><p>모든 입력을 강력한 형식의 값 개체 구조로 매핑하는 데 도움이 되는 PHP 라이브러리입니다.</p><h1 id="Symfony"><a href="#Symfony" class="headerlink" title="Symfony"></a>Symfony</h1><h2 id="what’s-coming-in-Symfony-6-1"><a href="#what’s-coming-in-Symfony-6-1" class="headerlink" title="what’s coming in Symfony 6.1"></a>what’s coming in Symfony 6.1</h2><p><a href="https://symfony.com/blog/category/living-on-the-edge/6.1">https://symfony.com/blog/category/living-on-the-edge/6.1</a></p><p>Symfony 6.1에서 제공 되는 기능을 확인하세요.<br><a href="https://symfony.com/blog/new-in-symfony-6-1-service-autowiring-attributes">attribute를 통한 서비스 자동 연결(autowiring)</a> 및 <a href="https://symfony.com/blog/new-in-symfony-6-1-improved-routing-requirements-and-utf-8-parameters">개선된 라우팅 기능</a>이 커뮤니티에서 가장 인기가 많은 것 같습니다. 지금까지 여러분께 가장 좋았던 것은 무엇인가요?</p><h2 id="Experimental-Unpacking-message-properties-as-handler-arguments-in-Symfony-Messenger"><a href="#Experimental-Unpacking-message-properties-as-handler-arguments-in-Symfony-Messenger" class="headerlink" title="Experimental: Unpacking message properties as handler arguments in Symfony Messenger"></a>Experimental: Unpacking message properties as handler arguments in Symfony Messenger</h2><p><a href="https://angelovdejan.me/2022/05/10/experimental-unpacking-message-properties-as-method-arguments.html">https://angelovdejan.me/2022/05/10/experimental-unpacking-message-properties-as-method-arguments.html</a></p><p>Dejan Angelov의 Symfony Messenger에서 메시지 속성(property)을 핸들러 인수(argument)로 자동으로 전달하는 실험.</p><p>역자 주:<br><a href="https://php.watch/versions/8.0/attributes">PHP attributes</a>를 활용한 포스트 <a href="https://angelovdejan.me/2022/01/09/custom-php-attributes-for-symfony-messenger-handlers.html">Using custom PHP attributes for registering and configuring Symfony Messenger handlers</a>에서 이어지는 글입니다.</p><h2 id="Why-do-we-need-Symfony-Polyfill-…-and-why-we-shouldn’t"><a href="#Why-do-we-need-Symfony-Polyfill-…-and-why-we-shouldn’t" class="headerlink" title="Why do we need Symfony Polyfill (… and why we shouldn’t)"></a>Why do we need Symfony Polyfill (… and why we shouldn’t)</h2><p><a href="https://thecodest.co/blog/why-do-we-need-symfony-polyfill-and-why-we-shouldnt">https://thecodest.co/blog/why-do-we-need-symfony-polyfill-and-why-we-shouldnt</a></p><p>Sebastian Luczak의 Symfony Polyfill이 필요한 이유(… 그리고 필요하지 않은 이유).</p><h2 id="nbgrp-x2F-singlea"><a href="#nbgrp-x2F-singlea" class="headerlink" title="nbgrp&#x2F;singlea"></a>nbgrp&#x2F;singlea</h2><p><a href="https://github.com/nbgrp/singlea">https://github.com/nbgrp/singlea</a></p><p><a href="https://nbgrp.github.io/singlea/singleauth/">SingleAuth</a> 인증 프레임워크를 기반으로 하는 진정한 SSO 서비스를 제공하는 Symfony 번들 세트입니다.</p><h1 id="Laravel"><a href="#Laravel" class="headerlink" title="Laravel"></a>Laravel</h1><h2 id="Does-Laravel-Scale-by-Jack-Ellis"><a href="#Does-Laravel-Scale-by-Jack-Ellis" class="headerlink" title="Does Laravel Scale? by Jack Ellis."></a>Does Laravel Scale? by Jack Ellis.</h2><p><a href="https://usefathom.com/blog/does-laravel-scale">https://usefathom.com/blog/does-laravel-scale</a></p><p>“라라벨은 확장할 수 있습니까?” by Jack Ellis.</p><p>글쓴이가 운영하는 Fathom Analytics팀은 월 1,570억 개 이상의 요청을 처리할 수 있는 인프라에서 Laravel을 실행합니다.</p><p>역자 주:<br>Laravel이 대규모로 애플리케이션을 처리할 수 없을 거라는 부정적인 시각에 반박합니다.</p><ul><li>대부분이 Wikipedia나 Facebook 만큼의 트래픽을 처리할 생각은 아닐 것</li><li>라라벨의 벤치마크 점수는 낮지만, 벤치마크는 큰 의미가 없다. </li><li>주요 병목 현상의 원인이 되는 데이터베이스, 캐시 등의 외부 서비스 연동에서 발생하는 문제를 해결해야 하고, CDN, Queue system이나 Laravel Octane 같은 도구를 사용할 수도 있다. 커뮤니티 지원도 중요하다.</li><li>대규모 서비스를 위한 코드 작성이나 대규모로 배포를 위한 방법도 고민해야 한다.</li><li>결론 : Laravel이 99.99994% 이상의 웹 애플리케이션을 위한 환상적인 선택이라는 것</li></ul><h2 id="The-Ultimate-Guide-to-Getting-Started-With-Laravel"><a href="#The-Ultimate-Guide-to-Getting-Started-With-Laravel" class="headerlink" title="The Ultimate Guide to Getting Started With Laravel"></a>The Ultimate Guide to Getting Started With Laravel</h2><p><a href="https://blog.freshbits.in/the-ultimate-guide-to-getting-started-with-laravel">https://blog.freshbits.in/the-ultimate-guide-to-getting-started-with-laravel</a></p><p>Gaurav Makhecha의 Laravel 시작을 위한 궁극의 가이드.<br>초보자가 처음부터 Laravel을 배울 수 있도록 도와주는 포괄적이고 긴 튜토리얼입니다.</p><h2 id="Eloquent-Performance-4-Examples-of-N-1-Query-Problems"><a href="#Eloquent-Performance-4-Examples-of-N-1-Query-Problems" class="headerlink" title="Eloquent Performance: 4 Examples of N+1 Query Problems"></a>Eloquent Performance: 4 Examples of N+1 Query Problems</h2><p><a href="https://laravel-news.com/laravel-n1-query-problems">https://laravel-news.com/laravel-n1-query-problems</a></p><p><a href="https://www.youtube.com/channel/UCTuplgOBi6tJIlesIboymGA">Laravel Daily</a>의 Povilas Korop이 이야기하는 N+1 Query의 4가지 사례</p><ul><li>Case 1. 일반적인 N+1 Query</li><li>Case 2. Two Important Symbols.</li><li>Case 3. “Hidden” Relationship in Accessor.</li><li>Case 4. Be Careful with Packages.</li></ul><p>Laravel 8.43부터 built-in <a href="https://laravel-news.com/disable-eloquent-lazy-loading-during-development">N+1 Query detector</a>가 도입됐습니다!</p><h2 id="How-to-add-a-spotlight-like-search-field-to-your-Laravel-app-by-Freek-Van-der-Herten"><a href="#How-to-add-a-spotlight-like-search-field-to-your-Laravel-app-by-Freek-Van-der-Herten" class="headerlink" title="How to add a spotlight-like search field to your Laravel app by Freek Van der Herten."></a>How to add a spotlight-like search field to your Laravel app by Freek Van der Herten.</h2><p><a href="https://freek.dev/2251-how-to-add-a-spotlight-like-search-field-to-your-laravel-app">https://freek.dev/2251-how-to-add-a-spotlight-like-search-field-to-your-laravel-app</a></p><p>Freek Van der Herten의 Laravel 앱에 스포트라이트 같은 검색 필드를 추가하는 방법.<br>중첩된 메뉴가 끔찍하기 때문이죠.</p><h2 id="Laravel-DDD-by-Steve-McDougall"><a href="#Laravel-DDD-by-Steve-McDougall" class="headerlink" title="Laravel DDD by Steve McDougall."></a>Laravel DDD by Steve McDougall.</h2><p><a href="https://www.juststeveking.uk/getting-started-with-ddd-in-laravel/">https://www.juststeveking.uk/getting-started-with-ddd-in-laravel/</a></p><p>Laravel에서 DDD 시작하기.</p><h2 id="roelofjan-elsinga-x2F-aloia-cms"><a href="#roelofjan-elsinga-x2F-aloia-cms" class="headerlink" title="roelofjan-elsinga&#x2F;aloia-cms"></a>roelofjan-elsinga&#x2F;aloia-cms</h2><p><a href="https://github.com/roelofjan-elsinga/aloia-cms">https://github.com/roelofjan-elsinga/aloia-cms</a></p><p>라라벨에서 drop-in CMS를 구현하기 위한 패키지. 컨텐츠를 저장하기 위해 파일을 사용합니다.</p><h2 id="The-Laravel-Idea-plugin-for-PhpStorm-collaborated-with-Christoph-Rumpel-to-bring"><a href="#The-Laravel-Idea-plugin-for-PhpStorm-collaborated-with-Christoph-Rumpel-to-bring" class="headerlink" title="The Laravel Idea plugin for PhpStorm collaborated with Christoph Rumpel to bring"></a>The Laravel Idea plugin for PhpStorm collaborated with Christoph Rumpel to bring</h2><p><a href="https://laravel-idea.com/">https://laravel-idea.com/</a></p><p>PhpStorm용 Laravel Idea 플러그인. <a href="https://twitter.com/christophrumpel">Christoph Rumpel</a>과 협력 하여 📺 <a href="https://www.youtube.com/playlist?list=PL4pc9iNIOrQAvzPPThXCdCRcSKbAHzQSx">비디오 자습서 시리즈</a>를 제공 합니다.</p><h1 id="기타"><a href="#기타" class="headerlink" title="기타"></a>기타</h1><h2 id="Attribute-usage-in-the-top-1000-PHP-packages"><a href="#Attribute-usage-in-the-top-1000-PHP-packages" class="headerlink" title="Attribute usage in the top-1000 PHP packages"></a>Attribute usage in the top-1000 PHP packages</h2><p><a href="https://stitcher.io/blog/attribute-usage-in-top-php-packages">https://stitcher.io/blog/attribute-usage-in-top-php-packages</a></p><p>Brent Roose의 상위 1000개 PHP 패키지에서 Attribute 사용 여부 조사.<br>스포일러: 그들 중 20%만이 Attribute를 사용하며 가장 많이 사용되는 Attribute는 #[ReturnTypeWillChange]입니다.</p><h2 id="📺-Dealing-with-deprecations-by-Brent-Roose"><a href="#📺-Dealing-with-deprecations-by-Brent-Roose" class="headerlink" title="📺 Dealing with deprecations by Brent Roose."></a>📺 Dealing with deprecations by Brent Roose.</h2><p><a href="https://stitcher.io/blog/dealing-with-deprecations">https://stitcher.io/blog/dealing-with-deprecations</a></p><p>Brent는 <a href="https://stitcher.io/blog/new-in-php-82">PHP 8.2에 많이 추가된</a> deprecation에 효과적으로 대처하는 방법에 대해 설명합니다.</p><p>그건 그렇고, PhpStorm에서 <code>#[Deprecated(reason: &#39;&#39;, replacement: &#39;&#39;)]</code> attribute로 업그레이드하는 방법을 사용자에게 지시할 수 있습니다 - <a href="https://blog.jetbrains.com/phpstorm/2020/10/phpstorm-2020-3-eap-4/">자세히 알아보기</a>.</p><h2 id="Dockerize-a-PHP-Application-with-CI-x2F-CD-by-Rafie-Younes"><a href="#Dockerize-a-PHP-Application-with-CI-x2F-CD-by-Rafie-Younes" class="headerlink" title="Dockerize a PHP Application with CI&#x2F;CD by Rafie Younes."></a>Dockerize a PHP Application with CI&#x2F;CD by Rafie Younes.</h2><p><a href="https://semaphoreci.com/community/tutorials/dockerizing-a-php-application">https://semaphoreci.com/community/tutorials/dockerizing-a-php-application</a></p><h2 id="How-to-profile-your-PHP-applications-with-Xdebug-by-Vincent-Broute"><a href="#How-to-profile-your-PHP-applications-with-Xdebug-by-Vincent-Broute" class="headerlink" title="How to profile your PHP applications with Xdebug by Vincent Brouté."></a>How to profile your PHP applications with Xdebug by Vincent Brouté.</h2><p><a href="https://www.vincentbroute.fr/blog/how-to-profile-your-php-applications-with-xdebug/">https://www.vincentbroute.fr/blog/how-to-profile-your-php-applications-with-xdebug/</a></p><p>Xdebug로 PHP 애플리케이션을 프로파일링하는 방법 .</p><h2 id="Much-ado-about-null-by-Larry-Garfield"><a href="#Much-ado-about-null-by-Larry-Garfield" class="headerlink" title="Much ado about null by Larry Garfield."></a>Much ado about null by Larry Garfield.</h2><p><a href="https://peakd.com/hive-168588/@crell/much-ado-about-null">https://peakd.com/hive-168588/@crell/much-ado-about-null</a></p><p>왜 당신이 정말로 그 null type을 사용하고 싶은지, 그리고 당신이 그 대신에 무엇을 해야 하는지.</p><h2 id="Move-that-foreach-inside-the-method-by-Damien-Seguy"><a href="#Move-that-foreach-inside-the-method-by-Damien-Seguy" class="headerlink" title="Move that foreach() inside the method by Damien Seguy."></a>Move that foreach() inside the method by Damien Seguy.</h2><p><a href="https://www.exakat.io/en/move-that-foreach-inside-the-method/">https://www.exakat.io/en/move-that-foreach-inside-the-method/</a></p><p>여러 PHP 함수는 단일 또는 다중 값으로 작동합니다. 예를 들어 array_merge()는 여러 배열을 하나로 병합합니다.<br>각 요소를 개별적으로 처리하기 위해 동일한 메서드를 여러 번 호출하는 대신 인수 목록을 한 번에 처리하여 약간의 성능 향상을 얻을 수 있습니다.</p><p>역자 주:<br><a href="http://haah.kr/2022/05/09/php-annotated-2022-spring-catch-up/">지난 php-annotated</a>에 소개된 <a href="https://www.exakat.io/en/speeding-up-array_merge/">Speeding up array_merge()</a>도 참고하세요.</p><h2 id="Steve-Bauman-SteveTheBauman-의-트윗"><a href="#Steve-Bauman-SteveTheBauman-의-트윗" class="headerlink" title="Steve Bauman(@SteveTheBauman)의 트윗"></a>Steve Bauman(@SteveTheBauman)의 트윗</h2><p><a href="https://twitter.com/SteveTheBauman/status/1525525749461135361">https://twitter.com/SteveTheBauman/status/1525525749461135361</a></p><blockquote><p>Today I learned you can unpack conditionally in PHP, pretty neat! 👌<br><img src="https://pbs.twimg.com/media/FSvAVOOWIAIMa5Y?format=jpg&name=small" alt="Steve Bauman(@SteveTheBauman)의 트윗"></p></blockquote><h2 id="Hadi-Hariri-hhariri-의-트윗"><a href="#Hadi-Hariri-hhariri-의-트윗" class="headerlink" title="Hadi Hariri(@hhariri)의 트윗"></a>Hadi Hariri(@hhariri)의 트윗</h2><p><a href="https://twitter.com/hhariri/status/1524018677116506114">https://twitter.com/hhariri/status/1524018677116506114</a></p><blockquote><p>“언젠가 여러 구현을 가질 수 있기 때문에 인터페이스를 선언하고 있습니다.”라고 말하는 사람이 있죠.<br>물론입니다. 그 날이 오면 Extract Interface 리팩토링을 수행하세요. 대부분의 IDE는 한 번의 클릭으로 이를 수행합니다. 그때까지 인터페이스를 삭제하십시오.</p></blockquote><h1 id="Community"><a href="#Community" class="headerlink" title="Community"></a>Community</h1><h2 id="friendsofphp-org"><a href="#friendsofphp-org" class="headerlink" title="friendsofphp.org"></a>friendsofphp.org</h2><p><a href="https://friendsofphp.org/">https://friendsofphp.org/</a></p><p>가까운 PHP 모임을 찾아보세요! 그들이 마침내 돌아왔습니다! 또한 가상 이벤트를 제공하는 새로운 <a href="https://twitter.com/mergephp">PHP Mega Meetup Group</a>인 <a href="https://mergephp.carrd.co/">Merge PHP</a>도 있습니다.</p><h2 id="📺-The-PHP-Roundtable-podcast-Back-at-the-Table-in-episode-84"><a href="#📺-The-PHP-Roundtable-podcast-Back-at-the-Table-in-episode-84" class="headerlink" title="📺 The PHP Roundtable podcast - Back at the Table in episode 84"></a>📺 The PHP Roundtable podcast - Back at the Table in episode 84</h2><p><a href="https://www.youtube.com/watch?v=JkIqSy1tylM">https://www.youtube.com/watch?v=JkIqSy1tylM</a></p><p>With Sara Golemon, Joe Ferguson, Ben Ramsey, and Eric Van Johnson.</p><h2 id="awesome-new-paper-elephants-by-Vincent-Pontier"><a href="#awesome-new-paper-elephants-by-Vincent-Pontier" class="headerlink" title="awesome new paper elephants by Vincent Pontier"></a>awesome new paper elephants by Vincent Pontier</h2><p><a href="https://www.vincentpontier.com/elephpant/categorie-produit/phpaper-toy/?orderby=price">https://www.vincentpontier.com/elephpant/categorie-produit/phpaper-toy/?orderby=price</a></p><p>Vincent Pontier의 멋진 새 종이 코끼리 를 확인하세요.</p><p><img src="https://blog.jetbrains.com/wp-content/uploads/2022/05/pasted-image-0.png" alt="종이 코끼리 이미지"></p><h2 id="thelia-net-x2F-Elephant"><a href="#thelia-net-x2F-Elephant" class="headerlink" title="thelia.net&#x2F;#Elephant"></a>thelia.net&#x2F;#Elephant</h2><p><a href="https://thelia.net/#Elephant">https://thelia.net/#Elephant</a></p><p>고전적인 플러시 천 디자인을 선호한다면 여기 당신의 무리에 추가할 만한 멋진 품목이 있습니다!</p><p><img src="https://lh3.googleusercontent.com/F4kMzYDyQPGkrppka57zTpQcQztIDBUfTN-EGhekZWDgnvrv5Jvzb1H-nVW5oxu9rENhHYCdPrZotMj9ARp9jqxdUK2x7Z7ssiDiSbLGHg4NRanG43LqohLVfzO9DpGcGBr4Vhe-HXukXwCfJQ" alt="플러시 천 코끼리 인형 이미지"></p>]]></content>
    
    
      
      
        
        
    <summary type="html">&lt;p&gt;&lt;img src=&quot;https://blog.jetbrains.com/wp-content/uploads/2020/01/phpstorm-PHP_Annotated_blog_1600x800.png&quot; alt=&quot;Php_annotated</summary>
        
      
    
    
    
    
    <category term="PHP" scheme="https://haah.kr/tags/PHP/"/>
    
    <category term="php-annotated" scheme="https://haah.kr/tags/php-annotated/"/>
    
    <category term="php-annotated-monthly" scheme="https://haah.kr/tags/php-annotated-monthly/"/>
    
  </entry>
  
  <entry>
    <title>PHP Annotated — 2022 Spring Catch-up</title>
    <link href="https://haah.kr/2022/05/09/php-annotated-2022-spring-catch-up/"/>
    <id>https://haah.kr/2022/05/09/php-annotated-2022-spring-catch-up/</id>
    <published>2022-05-09T14:08:24.000Z</published>
    <updated>2026-05-31T19:29:57.258Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://blog.jetbrains.com/wp-content/uploads/2020/01/phpstorm-PHP_Annotated_blog_1600x800.png" alt="Php_annotated 이미지"></p><p><a href="https://blog.jetbrains.com/author/rpronskiy">Roman Pronskiy</a>가 쓰고 JetBrains에서 제공하는 PHP Annotated <a href="https://blog.jetbrains.com/phpstorm/2022/05/php-annotated-2022-spring-catch-up/">2022년 봄 버전</a>의 번역&#x2F;해석본입니다.</p><p>이 중에서 몇 가지 제 취향껏 골라 그 안의 내용도 좀 뒤져보고 개발새발 번역해서 소개합니다.</p><hr><h1 id="News"><a href="#News" class="headerlink" title="News"></a>News</h1><h2 id="PHP-7-4-29-PHP-8-1-5-and-PHP-8-0-18"><a href="#PHP-7-4-29-PHP-8-1-5-and-PHP-8-0-18" class="headerlink" title="PHP 7.4.29, PHP 8.1.5, and PHP 8.0.18"></a>PHP 7.4.29, PHP 8.1.5, and PHP 8.0.18</h2><p><a href="https://www.php.net/ChangeLog-7.php#7.4.29">https://www.php.net/ChangeLog-7.php#7.4.29</a><br><a href="https://www.php.net/ChangeLog-8.php#8.1.5">https://www.php.net/ChangeLog-8.php#8.1.5</a><br><a href="https://www.php.net/ChangeLog-8.php#8.0.18">https://www.php.net/ChangeLog-8.php#8.0.18</a></p><p>내장된 종속성의 업데이트로 인한, Windows 사용자를 위한 보안 릴리스입니다. Windows가 아닌 사용자의 경우 일반적인 버그 수정 업데이트일 뿐입니다. PHP 7.3의경우 보안 문제가 있더라도 업데이트가 더 이상 릴리스되지 않습니다. PHP 7.3 또는 PHP 5.x 버전을 계속 사용하고 있다면 가능한 한 빨리 업데이트하는 것이 좋습니다.</p><p>Symfony 팀은 다가오는 Symfony 6.1 릴리스에서 최소 필수 PHP 버전을 8.1로 올렸습니다. Drupal 10 과 Laravel 10에서도 동일한 변화가 이루어졌습니다.</p><p>또한 최근 출시된 Ubuntu 22.04 LTS 에는 PHP 8.1이 사전 설치된 상태로 제공됩니다.</p><h2 id="Updates-from-the-PHP-Foundation"><a href="#Updates-from-the-PHP-Foundation" class="headerlink" title="Updates from the PHP Foundation"></a>Updates from the PHP Foundation</h2><p><a href="https://opencollective.com/phpfoundation">https://opencollective.com/phpfoundation</a></p><ul><li><a href="https://opencollective.com/phpfoundation/updates/the-php-foundation-update-march-2022">6명의 후원 개발자</a>가 활발하게 핵심(core) 영역을 유지관리하고 있습니다.<ul><li>PHP Foundation Core Developers를 구하는 것이 2022년의 목표였고 이 6명이 초기 멤버로 활동하게 됩니다.</li><li>이 중에는 Xdebug의 Derick Rethans도 있는데, <a href="https://twitter.com/derickr/status/1510007095403466758?s=20&t=3Bt9UThUpprNzi0l_SyLlg">일주일에 하루 일을 한다는 트윗</a>을 남긴 것으로 보아 위 개발자들이 모두 full-time으로 일을 하는 것은 아닌가 봅니다.</li></ul></li><li><a href="thephp.foundation">php.foundation</a> 웹사이트가 가동 중입니다.<ul><li>후원사가 많이 늘었네요. OP.GG도 꾸준히 후원하고 있습니다.</li></ul></li><li>Core 개발에 대한 통찰력이 담긴 별도의 뉴스레터가 정기적으로 발행될 것입니다. 다음은 초판입니다: <a href="https://thephp.foundation/blog/2022/04/28/php-roundup-1/">PHP Roundup #1</a>.</li><li>Sebastian Bergmann의 <a href="https://thephp.foundation/blog/2022/05/06/interview-with-core-developers/">핵심 개발자 인터뷰</a>.</li></ul><h2 id="Developer-Ecosystem-Survey-2022"><a href="#Developer-Ecosystem-Survey-2022" class="headerlink" title="Developer Ecosystem Survey 2022"></a>Developer Ecosystem Survey 2022</h2><p><a href="https://surveys.jetbrains.com/s3/t-developer-ecosystem-survey-2022">https://surveys.jetbrains.com/s3/t-developer-ecosystem-survey-2022</a></p><p>JetBrains의 연례 설문조사가 막 시작되었으며 물론 PHP에 대한 섹션도 있습니다. <a href="https://www.jetbrains.com/lp/devecosystem-2021/php/">작년의 결과</a>에서와 같은 것을 볼 수 있을 것입니다. 설문조사에 참여해서 경품을 받을 수 있는 기회를 잡으세요!</p><h2 id="News-from-PHP-FIG"><a href="#News-from-PHP-FIG" class="headerlink" title="News from PHP-FIG"></a>News from PHP-FIG</h2><ul><li><a href="https://github.com/php-fig/per-coding-style">Coding Style PER (PHP Evolving Recommendation)</a>은 PHP-FIG에서 공식적으로 승인했으며 PSR-12를 대체합니다. 이것은 “라이브” 표준을 보여주는 최초의 <a href="https://www.php-fig.org/bylaws/per-workflow/">PER</a> 문서입니다. PER 덕분에 PHP에 새로운 구문이 추가될 때마다 다른 PSR 표준을 발표할 필요가 없습니다. 대신 <a href="https://semver.org/lang/ru/">SemVer</a>에 따라 PER이 업데이트됩니다.</li><li>새로운 PSR 초안이 승인되었습니다: <a href="https://github.com/php-fig/fig-standards/blob/master/proposed/tracing.md">PSR-22 – Application Tracing</a>.</li></ul><h2 id="PhpStorm-2022-1-released"><a href="#PhpStorm-2022-1-released" class="headerlink" title="PhpStorm 2022.1 released"></a>PhpStorm 2022.1 released</h2><p><a href="https://blog.jetbrains.com/phpstorm/2022/04/phpstorm-2022-1-release/">https://blog.jetbrains.com/phpstorm/2022/04/phpstorm-2022-1-release/</a></p><p>Blade, WordPress, ArrayShape annotation 등에 대한 개선 사항이 함께 제공됩니다. 짧은 <a href="https://www.youtube.com/watch?v=gqck6bJ1JWo">What’s New</a> 비디오를 확인하거나 전체 스토리를 보려면 <a href="https://blog.jetbrains.com/phpstorm/2022/04/phpstorm-2022-1-release/">블로그 게시물</a>을 읽으십시오.</p><h2 id="Composer-2-3-Release"><a href="#Composer-2-3-Release" class="headerlink" title="Composer 2.3 Release"></a>Composer 2.3 Release</h2><p><a href="https://blog.packagist.com/composer-2-3/">https://blog.packagist.com/composer-2-3/</a></p><p>이 릴리스는 사용자 및 현대화된 내부 코드베이스를 위한 약간의 개선 사항을 제공합니다.</p><p>최근에 발견된 취약점도 있었습니다. <a href="https://blog.packagist.com/cve-2022-24828-composer-command-injection-vulnerability/">CVE-2022-24828: Composer Command Injection</a>. composer.json에 있는 URL에 명시적으로 나열된 Git 또는 Mercurial 리포지토리를 제어하는 공격자는 특수하게 조작된 분기 이름을 사용하여 composer 업데이트를 실행하는 시스템에서 명령을 실행할 수 있습니다.</p><p><code>composer self-update</code>를 실행하여 Composer가 최신 상태인지 확인하십시오.</p><h2 id="Craft-CMS-4"><a href="#Craft-CMS-4" class="headerlink" title="Craft CMS 4"></a>Craft CMS 4</h2><p><a href="https://craftcms.com/blog/craft-4?ref=phpannotated">https://craftcms.com/blog/craft-4?ref=phpannotated</a></p><p>인기 있는 <a href="https://github.com/craftcms/cms">오픈 소스</a> CMS의 주요 업데이트가 릴리스되었습니다.</p><h1 id="PHP-Core"><a href="#PHP-Core" class="headerlink" title="PHP Core"></a>PHP Core</h1><p>Core 뉴스의 대부분은 PHP Foundation의 <a href="https://thephp.foundation/blog/2022/04/28/php-roundup-1/">PHP Roundup 시리즈</a>에서 자세히 다루므로 간략하게만 언급하겠습니다.</p><h2 id="Last-call-for-PHP-8-2-release-managers"><a href="#Last-call-for-PHP-8-2-release-managers" class="headerlink" title="Last call for PHP 8.2 release managers!"></a>Last call for PHP 8.2 release managers!</h2><p><a href="https://externals.io/message/117595#117664">https://externals.io/message/117595#117664</a></p><p>PHP 8.2 릴리스 관리자를 구하는 마지막 요청입니다!<br>3년 반을 약정할 수 있어야 하며 PHP, Git, 가급적이면 C에 대한 지식이 있어야 합니다. <a href="https://wiki.php.net/todo/php82#volunteers">이미</a> 베테랑 후보자 1명과 신인 후보자 6명이 있습니다.</p><h2 id="✅-RFC-Redacting-parameters-in-back-traces-PHP8-2"><a href="#✅-RFC-Redacting-parameters-in-back-traces-PHP8-2" class="headerlink" title="✅ [RFC] Redacting parameters in back traces #PHP8.2"></a>✅ [RFC] Redacting parameters in back traces #PHP8.2</h2><p><a href="https://wiki.php.net/rfc/redact_parameters_in_back_traces">https://wiki.php.net/rfc/redact_parameters_in_back_traces</a></p><p>예외 시 back trace 기록에서 민감한 정보를 노출하는 것을 막기 위해 함수의 매개변수에 적용할 수 있는 새로운 표준을 제시했습니다.</p><h2 id="✅-RFC-Allow-null-and-false-as-stand-alone-types-PHP8-2"><a href="#✅-RFC-Allow-null-and-false-as-stand-alone-types-PHP8-2" class="headerlink" title="✅ [RFC] Allow null and false as stand-alone types #PHP8.2"></a>✅ [RFC] Allow null and false as stand-alone types #PHP8.2</h2><p><a href="https://wiki.php.net/rfc/null-false-standalone-types">https://wiki.php.net/rfc/null-false-standalone-types</a></p><p>현재 null은 단일 유형으로 선언할 수 없습니다. false는 더 나아가 전통적으로 null 대신 오류 상태를 전달하기 위해 사용됐고, 이게 union type RFC에 “literal type”으로 소개된 주요 이유였습니다.</p><p>이 RFC에선 null과 false를 단일 타입으로 사용할 수 있도록 제안합니다.</p><h2 id="✅-RFC-Deprecate-string-interpolation-PHP8-2"><a href="#✅-RFC-Deprecate-string-interpolation-PHP8-2" class="headerlink" title="✅ [RFC] Deprecate ${} string interpolation #PHP8.2"></a>✅ [RFC] Deprecate ${} string interpolation #PHP8.2</h2><p><a href="https://wiki.php.net/rfc/deprecate_dollar_brace_string_interpolation">https://wiki.php.net/rfc/deprecate_dollar_brace_string_interpolation</a></p><p>PHP는 큰따옴표( “) 및 heredoc을 사용하여 다양한 방식으로 문자열에 변수를 포함할 수 있습니다.</p><ul><li>변수 직접 포함(“$foo”)</li><li>변수 외부의 중괄호(“{$foo}”)</li><li>달러 기호 뒤의 중괄호(“${foo}”)</li><li>가변적인 변수(“${expr}”, (string) ${expr}와 동일한 표현)</li></ul><p>옵션 1과 2에는 장단점이 있습니다. 옵션 3과 4는 중복되는 구문으로 인해 쉽게 혼동되고, 3은 1과 2보다 성능이 완전히 떨어지며, 4는 문자열 보간에서 거의 유용하지 않은 <a href="https://www.php.net/manual/en/language.variables.variable.php">완전히 다른 의미</a>를 갖습니다.</p><p>이 RFC 는 PHP 8.2에서 옵션 3과 4를 더 이상 사용하지 않고 PHP 9.0에서 제거할 것을 제안합니다.</p><h2 id="✅-RFC-Deprecate-and-Remove-utf8-encode-and-utf8-decode"><a href="#✅-RFC-Deprecate-and-Remove-utf8-encode-and-utf8-decode" class="headerlink" title="✅ [RFC] Deprecate and Remove utf8_encode and utf8_decode"></a>✅ [RFC] Deprecate and Remove utf8_encode and utf8_decode</h2><p><a href="https://wiki.php.net/rfc/remove_utf8_decode_and_utf8_encode">https://wiki.php.net/rfc/remove_utf8_decode_and_utf8_encode</a></p><ul><li>PHP 8.2에서 utf8_encode 및 utf8_decode의 모든 사용은 표준 E_DEPRECATED 진단을 발생시킵니다.</li><li>PHP 9.0에서는 utf8_encode 및 utf8_decode 함수가 PHP에서 제거됩니다.</li><li>문서나 사용 중단(deprecation) 메시지는 사용자가 사용 방법이 올바른지 확인하고 기본 대체제로 mb_convert_encoding를 권장하며 UConverter::transcode와 iconv도 선택지로 나열하도록 권장합니다.</li></ul><h2 id="✅-RFC-Undefined-Variable-Error-Promotion"><a href="#✅-RFC-Undefined-Variable-Error-Promotion" class="headerlink" title="✅ [RFC] Undefined Variable Error Promotion"></a>✅ [RFC] Undefined Variable Error Promotion</h2><p><a href="https://wiki.php.net/rfc/undefined_variable_error_promotion">https://wiki.php.net/rfc/undefined_variable_error_promotion</a></p><p>이 RFC는 정의되지 않은 변수에 액세스하는 것이 PHP의 다음 메이저 버전(Target: PHP 9.0)에서 잘못된 동작으로 렌더링되고, 정의되지 않은 변수에 액세스하면 오류 예외가 발생할 것을 제안합니다.</p><h2 id="🗳-RFC-Readonly-classes"><a href="#🗳-RFC-Readonly-classes" class="headerlink" title="🗳 [RFC] Readonly classes"></a>🗳 [RFC] Readonly classes</h2><p><a href="https://wiki.php.net/rfc/readonly_classes">https://wiki.php.net/rfc/readonly_classes</a></p><p>PHP 8.1은 <a href="https://wiki.php.net/rfc/readonly_properties_v2">PHP RFC: Readonly properties 2.0</a>을 통해 읽기 전용 속성에 대한 지원을 추가 했습니다. 그러나 특히 많은 속성을 포함하는 경우 (준)불변 클래스를 선언하는 것은 여전히 쉽지 않습니다. 따라서 이 RFC는 readonly 클래스에 대한 지원을 추가할 것을 제안합니다.</p><p>투표는 2022-05-11까지인데, 10일 현재 27:6으로 찬성이 우세합니다.</p><h2 id="❌-RFC-Sealed-Classes"><a href="#❌-RFC-Sealed-Classes" class="headerlink" title="❌ [RFC] Sealed Classes"></a>❌ [RFC] Sealed Classes</h2><p><a href="https://wiki.php.net/rfc/sealed_classes">https://wiki.php.net/rfc/sealed_classes</a></p><p>봉인된 클래스는 속성 값 목록에 명명된 클래스에 의해서만 직접 확장될 수 있도록 제안되었으나 투표는 2&#x2F;3의 찬성표를 얻지 못하고 거부(Decline)되었습니다.</p><h2 id="🆕-RFC-Add-true-type"><a href="#🆕-RFC-Add-true-type" class="headerlink" title="🆕 [RFC] Add true type"></a>🆕 [RFC] Add true type</h2><p><a href="https://wiki.php.net/rfc/true-type">https://wiki.php.net/rfc/true-type</a></p><p>위에서 언급한 <a href="https://wiki.php.net/rfc/null-false-standalone-types">null and false as standalone types</a>이 통과됨에 따라 true도 독립된 타입으로 승격하자는 제안입니다.</p><h2 id="🆕-RFC-Disjunctive-Normal-Form-Types"><a href="#🆕-RFC-Disjunctive-Normal-Form-Types" class="headerlink" title="🆕 [RFC] Disjunctive Normal Form Types"></a>🆕 [RFC] Disjunctive Normal Form Types</h2><p><a href="https://wiki.php.net/rfc/dnf_types">https://wiki.php.net/rfc/dnf_types</a></p><p><a href="https://en.wikipedia.org/wiki/Disjunctive_normal_form">DNF(Disjunctive Normal Form)</a>는 부울 표현식을 구성하는 표준 방법입니다.</p><p>이 RFC 는 합집합과 교집합 유형을 허용하기 위해 DNF 유형을 지원할 것을 제안합니다.</p><h2 id="RFC-final-class-Collections-Deque"><a href="#RFC-final-class-Collections-Deque" class="headerlink" title="[RFC] final class Collections\Deque"></a>[RFC] final class Collections\Deque</h2><p><a href="https://wiki.php.net/rfc/deque">https://wiki.php.net/rfc/deque</a></p><p>최적화된 데이터 구조를 PHP에 추가하려는 계획의 일환으로 첫 번째 제안이 준비되었습니다.<br><code>Deque</code> – 이것은 양방향 대기열입니다. 즉, 시작과 끝에서 항목을 추가 및 제거할 수 있습니다. <code>SplQueue</code>또는 <code>SplDoublyLinkedList</code> 대신 사용하여 성능을 향상시키고 메모리 소비를 줄일 수 있습니다.</p><h2 id="RFC-Introduce-a-class-string-type"><a href="#RFC-Introduce-a-class-string-type" class="headerlink" title="RFC Introduce a class-string type"></a>RFC Introduce a class-string type</h2><p><a href="https://gist.github.com/cspray/0f4e67e8731a8ea9382147707e75287f">https://gist.github.com/cspray/0f4e67e8731a8ea9382147707e75287f</a></p><p>공식 RFC는 아니지만 class-string을 실제 유형으로 만드는 것은 흥미로운 아이디어입니다. 이미 정적 분석기의 주석에서 널리 사용되기 때문입니다.</p><h1 id="Tools"><a href="#Tools" class="headerlink" title="Tools"></a>Tools</h1><h2 id="CanIPHP-com"><a href="#CanIPHP-com" class="headerlink" title="CanIPHP.com"></a>CanIPHP.com</h2><p><a href="https://caniphp.com/">https://caniphp.com/</a></p><p>caniuse.com처럼 PHP 기능별로 사용할 수 있는 버전을 찾을 수 있습니다.</p><h2 id="clue-x2F-stream-filter"><a href="#clue-x2F-stream-filter" class="headerlink" title="clue&#x2F;stream-filter"></a>clue&#x2F;stream-filter</h2><p><a href="https://github.com/clue/stream-filter">https://github.com/clue/stream-filter</a></p><p>PHP에서 스트림 필터링에 대한 간단하고 현대적인 접근 방식입니다.</p><p>PHP에서 스트림 필터를 사용하여 이런 <a href="https://github.com/jaem3l/unfuck">미친 짓</a>도 할 수 있고, 반대로 이렇게 <a href="https://github.com/dg/bypass-finals">실용적인 것</a>도 할 수 있습니다.</p><p>(두 예시는 final 키워드를 제거하거나 모든 접근 제한을 푸는 행위를 하고 있어서 저는 둘 다 미친 짓처럼 보이기도…)</p><h2 id="sfx101-x2F-deck"><a href="#sfx101-x2F-deck" class="headerlink" title="sfx101&#x2F;deck"></a>sfx101&#x2F;deck</h2><p><a href="https://github.com/sfx101/deck">https://github.com/sfx101/deck</a></p><p>PHP 초보자에게 유용할 수 있는 로컬 웹 개발 환경의 빠른 시작 및 구성을 위한 GUI 도구입니다.</p><h2 id="marijnvanwezel-x2F-try"><a href="#marijnvanwezel-x2F-try" class="headerlink" title="marijnvanwezel&#x2F;try"></a>marijnvanwezel&#x2F;try</h2><p><a href="https://github.com/marijnvanwezel/try">https://github.com/marijnvanwezel/try</a></p><p>단일 명령으로 Composer 패키지를 사용해 볼 수 있는 간단한 CLI 도구입니다. 그냥 설치하고 실행 해보세요: <code>try %vendor%/%package%.</code></p><h2 id="frodeborli-x2F-moebius"><a href="#frodeborli-x2F-moebius" class="headerlink" title="frodeborli&#x2F;moebius"></a>frodeborli&#x2F;moebius</h2><p><a href="https://github.com/frodeborli/moebius">https://github.com/frodeborli/moebius</a></p><p>PHP 버전 8.1 이상을 위한 Golang과 유사한 코루틴. 저자는 자신의 이벤트 루프 구현체와 자체 테스트 프레임워크를 사용했습니다.</p><p>Fiber를 사용하고, Swoole과도 비슷해보이지만 별도 extension이 필요 없습니다.</p><h2 id="Crell-x2F-AttributeUtils"><a href="#Crell-x2F-AttributeUtils" class="headerlink" title="Crell&#x2F;AttributeUtils"></a>Crell&#x2F;AttributeUtils</h2><p><a href="https://github.com/Crell/AttributeUtils">https://github.com/Crell/AttributeUtils</a></p><p>속성(attribute))의 구문 분석 및 관리를 용이하게 하는 유틸리티입니다.</p><p>doctrine&#x2F;annotations 혹은 doctrine annotation interface가 적용된 PHP 8의 속성을 모두 읽을 수 있는 <a href="https://github.com/koriym/Koriym.Attributes">koriym&#x2F;Koriym.Attributes</a>도 흥미롭습니다.</p><h2 id="spatie-x2F-visit"><a href="#spatie-x2F-visit" class="headerlink" title="spatie&#x2F;visit"></a>spatie&#x2F;visit</h2><p><a href="https://github.com/spatie/visit">https://github.com/spatie/visit</a></p><p>모든 URL의 응답을 아름답게 표시하는 CLI HTTP 클라이언트입니다. colorize(code highlighting)하기 위해 bat과 jq를 사용합니다.</p><blockquote><p>Think of it as curl for humans.</p></blockquote><h2 id="laravel-x2F-valet"><a href="#laravel-x2F-valet" class="headerlink" title="laravel&#x2F;valet"></a>laravel&#x2F;valet</h2><p><a href="https://github.com/laravel/valet">https://github.com/laravel/valet</a></p><p>Mac용 경량 로컬 개발 환경입니다. Docker 또는 VirtualBox 대신 기본 Nginx와 PHP만 있습니다. 라라벨 뿐만 아니라 모든 프로젝트에서 사용할 수 있으며 v3부터는 폴더(프로젝트)마다 PHP 버전을 다르게 사용할 수 있습니다.</p><h2 id="roach-php-x2F-core"><a href="#roach-php-x2F-core" class="headerlink" title="roach-php&#x2F;core"></a>roach-php&#x2F;core</h2><p><a href="https://github.com/roach-php/core">https://github.com/roach-php/core</a></p><p>PHP를 위한 완벽한 웹 스크래핑 툴킷.</p><h2 id="PHPStan-1-6-0"><a href="#PHPStan-1-6-0" class="headerlink" title="PHPStan 1.6.0"></a>PHPStan 1.6.0</h2><p><a href="https://phpstan.org/blog/phpstan-1-6-0-with-conditional-return-types">https://phpstan.org/blog/phpstan-1-6-0-with-conditional-return-types</a></p><p>조건부 리턴 타입 및 정수(integer) 마스크를 지원하여 출시되었습니다.</p><h2 id="flow-php-x2F-etl"><a href="#flow-php-x2F-etl" class="headerlink" title="flow-php&#x2F;etl"></a>flow-php&#x2F;etl</h2><p><a href="https://github.com/flow-php/etl">https://github.com/flow-php/etl</a></p><p>ReactPHP 또는 Amphp를 통한 비동기 처리를 지원하는 PHP용 ETL(Extract Transform Load) 데이터 처리 라이브러리입니다.</p><h2 id="igorhrcek-x2F-wp-cli-secure-command"><a href="#igorhrcek-x2F-wp-cli-secure-command" class="headerlink" title="igorhrcek&#x2F;wp-cli-secure-command"></a>igorhrcek&#x2F;wp-cli-secure-command</h2><p><a href="https://github.com/igorhrcek/wp-cli-secure-command/">https://github.com/igorhrcek/wp-cli-secure-command/</a></p><p>WordPress 설치를 보호하는 하나의 CLI command.</p><h2 id="williarin-x2F-wordpress-interop"><a href="#williarin-x2F-wordpress-interop" class="headerlink" title="williarin&#x2F;wordpress-interop"></a>williarin&#x2F;wordpress-interop</h2><p><a href="https://github.com/williarin/wordpress-interop">https://github.com/williarin/wordpress-interop</a></p><p>다른 PHP 응용 프로그램에서 WordPress 데이터베이스에 더 쉽게 액세스할 수 있도록 하는 Doctrine&#x2F;DBAL 기반 패키지입니다.</p><h2 id="sj-i-x2F-php-profiler"><a href="#sj-i-x2F-php-profiler" class="headerlink" title="sj-i&#x2F;php-profiler"></a>sj-i&#x2F;php-profiler</h2><p><a href="https://github.com/sj-i/php-profiler">https://github.com/sj-i/php-profiler</a><br><a href="https://github.com/reliforp/reli-prof">https://github.com/reliforp/reli-prof</a></p><p>php-profiler에서 <a href="https://github.com/reliforp/reli-prof">reliforp&#x2F;reli-prof</a>로 이름을 바꾸고 있습니다.</p><p>순수 PHP(FFI)로 구현된 PHP용 샘플링 프로파일러입니다. flame 다이어그램을 생성하고, top-like 모드(demon mode도 있음)에서 trace 출력을 실행하는 등의 작업을 수행할 수 있습니다.</p><h2 id="mrsuh-x2F-php-var-sizeof"><a href="#mrsuh-x2F-php-var-sizeof" class="headerlink" title="mrsuh&#x2F;php-var-sizeof"></a>mrsuh&#x2F;php-var-sizeof</h2><p><a href="https://github.com/mrsuh/php-var-sizeof">https://github.com/mrsuh/php-var-sizeof</a></p><p>A function to get the memory size for any variable that promises to be more accurate compared to memory_get_usage(). Requires PHP 7.4 or higher with FFI.</p><p><a href="https://github.com/mrsuh/php-var-sizeof#var_sizeof-vs-memory_get_usage">memory_get_usage()에 비해</a> 더 정확한, 모든 변수의 메모리 크기를 가져오는 함수 입니다. FFI를 사용하는 PHP 7.4 이상이 필요합니다.</p><h2 id="davidcole1340-x2F-ext-php-rs"><a href="#davidcole1340-x2F-ext-php-rs" class="headerlink" title="davidcole1340&#x2F;ext-php-rs"></a>davidcole1340&#x2F;ext-php-rs</h2><p><a href="https://github.com/davidcole1340/ext-php-rs">https://github.com/davidcole1340/ext-php-rs</a></p><p>Rust에서 PHP 확장을 빌드하기 위한 Zend API에 대한 바인딩입니다.</p><h2 id="easysoft-x2F-phpmicro"><a href="#easysoft-x2F-phpmicro" class="headerlink" title="easysoft&#x2F;phpmicro"></a>easysoft&#x2F;phpmicro</h2><p><a href="https://github.com/easysoft/phpmicro">https://github.com/easysoft/phpmicro</a></p><p>당신의 CLI 툴과 함께 (PHP에 구애받지 않는) 바이너리로 배포될 수 있도록 정적으로 컴파일된 마이크로 PHP 인터프리터입니다. Marcel Pociot가 프로세스를 자동화하기를 <a href="https://twitter.com/marcelpociot/status/1498244220620099588">기대합니다</a>!</p><blockquote><p>While other people argue about PHP not being a good choice, I started working on making PHP&#x2F;Laravel Zero apps truly portable</p></blockquote><ul><li>Marcel Pociot <a href="https://twitter.com/marcelpociot">@marcelpociot</a></li></ul><h1 id="Symfony"><a href="#Symfony" class="headerlink" title="Symfony"></a>Symfony</h1><h2 id="See-what’s-coming-in-Symfony-6-1"><a href="#See-what’s-coming-in-Symfony-6-1" class="headerlink" title="See what’s coming in Symfony 6.1."></a>See what’s coming in Symfony 6.1.</h2><p><a href="https://symfony.com/blog/category/living-on-the-edge/6.1">https://symfony.com/blog/category/living-on-the-edge/6.1</a></p><h2 id="📺-Harmonious-Development-with-Symfony-6"><a href="#📺-Harmonious-Development-with-Symfony-6" class="headerlink" title="📺 Harmonious Development with Symfony 6"></a>📺 Harmonious Development with Symfony 6</h2><p><a href="https://symfonycasts.com/screencast/symfony">https://symfonycasts.com/screencast/symfony</a></p><p>이제 Symfony를 시작하기 위한 2시간 이상의 튜토리얼이 SymfonyCasts에서 완전히 무료로 제공됩니다.</p><h2 id="Using-Symfony-Form-in-WordPress"><a href="#Using-Symfony-Form-in-WordPress" class="headerlink" title="Using Symfony Form in WordPress."></a>Using Symfony Form in WordPress.</h2><p><a href="https://jolicode.com/blog/using-symfony-form-in-wordpress">https://jolicode.com/blog/using-symfony-form-in-wordpress</a></p><p>WordPress에서 Symfony Form 사용하기</p><h2 id="“Symfony-The-Fast-Track”"><a href="#“Symfony-The-Fast-Track”" class="headerlink" title="“Symfony: The Fast Track”"></a>“Symfony: The Fast Track”</h2><p><a href="https://symfony.com/book">https://symfony.com/book</a></p><p>초보자와 숙련된 개발자 모두를 위한 공식 Symfony 책입니다. Symfony 6 기준.</p><h2 id="Symfony-Station-Communique-–-April-29-2022"><a href="#Symfony-Station-Communique-–-April-29-2022" class="headerlink" title="Symfony Station Communiqué – April 29, 2022."></a>Symfony Station Communiqué – April 29, 2022.</h2><p><a href="https://www.symfonystation.com/Symfony-Station-Communique-29-April-2022">https://www.symfonystation.com/Symfony-Station-Communique-29-April-2022</a></p><h1 id="Laravel"><a href="#Laravel" class="headerlink" title="Laravel"></a>Laravel</h1><h2 id="📺-Laravel-Origins-The-Documentary"><a href="#📺-Laravel-Origins-The-Documentary" class="headerlink" title="📺 Laravel Origins: The Documentary"></a>📺 Laravel Origins: The Documentary</h2><p><a href="https://www.youtube.com/watch?v=mH7cgoX3K0g">https://www.youtube.com/watch?v=mH7cgoX3K0g</a></p><p>이 비디오는 Laravel이 왜 생겨났는지, 지난 10년 동안 어떻게 성장했는지, 그리고 Taylor와 더 넓은 Laravel 커뮤니티의 미래에 대한 이야기를 알려줍니다.</p><h2 id="Laravel-Idea-5-3"><a href="#Laravel-Idea-5-3" class="headerlink" title="Laravel Idea 5.3"></a>Laravel Idea 5.3</h2><p><a href="https://laravel-idea.com/blog/2022/5-3-release">https://laravel-idea.com/blog/2022/5-3-release</a></p><p>인기 있는 유료 PhpStorm 플러그인 업데이트.</p><h2 id="LaravelProTips-com-–-A-collection-of-useful-articles-and-tweets"><a href="#LaravelProTips-com-–-A-collection-of-useful-articles-and-tweets" class="headerlink" title="LaravelProTips.com – A collection of useful articles and tweets."></a>LaravelProTips.com – A collection of useful articles and tweets.</h2><p><a href="https://laravelprotips.com/">https://laravelprotips.com/</a></p><p>유용한 기사 및 트윗 모음.</p><h2 id="alexeymezenin-x2F-laravel-best-practices"><a href="#alexeymezenin-x2F-laravel-best-practices" class="headerlink" title="alexeymezenin&#x2F;laravel-best-practices"></a>alexeymezenin&#x2F;laravel-best-practices</h2><p><a href="https://github.com/alexeymezenin/laravel-best-practices">https://github.com/alexeymezenin/laravel-best-practices</a></p><p>더 많은 Laravel 모범 사례.</p><p><a href="https://github.com/xotrs/laravel-best-practices">한국어 버전</a>은 2018년에 <a href="https://github.com/xotrs">임영록(cherrypick)</a>님이 번역해주셨습니다. 원래의 저장소는 작년까지도 계속 업데이트 되고 있었네요.</p><h2 id="📺-Build-a-Laravel-app-and-deploy-it-to-production-in-5-hours"><a href="#📺-Build-a-Laravel-app-and-deploy-it-to-production-in-5-hours" class="headerlink" title="📺 Build a Laravel app and deploy it to production in 5 hours"></a>📺 Build a Laravel app and deploy it to production in 5 hours</h2><p><a href="https://www.youtube.com/watch?v=mmtVkDh9RGw">https://www.youtube.com/watch?v=mmtVkDh9RGw</a></p><p>Brent가 시작부터 프로덕션 배포까지의 과정을 5시간 동안 빠르게 진행합니다.</p><h2 id="📺-Xdebug-3-Laravel-Sail-with-PhpStorm"><a href="#📺-Xdebug-3-Laravel-Sail-with-PhpStorm" class="headerlink" title="📺 Xdebug 3: Laravel Sail with PhpStorm."></a>📺 Xdebug 3: Laravel Sail with PhpStorm.</h2><p><a href="https://www.youtube.com/watch?v=Xgn0EtB4chc">https://www.youtube.com/watch?v=Xgn0EtB4chc</a></p><p>Derick Rethans가 Laravel Sail Docker 환경에서 Xdebug를 활성화하고 설정하는 방법을 보여줍니다.</p><h1 id="Yii"><a href="#Yii" class="headerlink" title="Yii"></a>Yii</h1><h2 id="Yii-news-2022-issue-1"><a href="#Yii-news-2022-issue-1" class="headerlink" title="Yii news 2022, issue 1."></a>Yii news 2022, issue 1.</h2><p><a href="https://opencollective.com/yiisoft/updates/yii-news-2022-issue-1">https://opencollective.com/yiisoft/updates/yii-news-2022-issue-1</a></p><h2 id="Interview-Questions-For-Yii-2"><a href="#Interview-Questions-For-Yii-2" class="headerlink" title="Interview Questions For Yii 2"></a>Interview Questions For Yii 2</h2><p>대부분은 일반적으로 PHP에 관한 것이며 모든 구직자에게 유용할 수 있습니다.</p><h1 id="기타"><a href="#기타" class="headerlink" title="기타"></a>기타</h1><h2 id="Pascal-Landau의-PHP-개발자용-Docker에-대한-포괄적인-게시물"><a href="#Pascal-Landau의-PHP-개발자용-Docker에-대한-포괄적인-게시물" class="headerlink" title="Pascal Landau의 PHP 개발자용 Docker에 대한 포괄적인 게시물"></a>Pascal Landau의 PHP 개발자용 Docker에 대한 포괄적인 게시물</h2><p><a href="https://www.pascallandau.com/docker-php-tutorial/">https://www.pascallandau.com/docker-php-tutorial/</a></p><p><a href="https://www.pascallandau.com/blog/docker-from-scratch-for-php-applications-in-2022/">2022년 PHP 8.1 애플리케이션을 위한 Docker 시작하기</a>, <a href="https://www.pascallandau.com/blog/phpstorm-docker-xdebug-3-php-8-1-in-2022/">PHP 8.1에서의 PhpStorm, Docker 및 Xdebug 3</a> 등 그의 <a href="https://www.pascallandau.com/blog/">웹 사이트</a>에서 더 확인해보세요.</p><h2 id="Posts-on-naming-constructors-by-Andreas-Moller-and-by-Stefan-Priebsch"><a href="#Posts-on-naming-constructors-by-Andreas-Moller-and-by-Stefan-Priebsch" class="headerlink" title="Posts on naming constructors by Andreas Möller and by Stefan Priebsch."></a>Posts on naming constructors by Andreas Möller and by Stefan Priebsch.</h2><p>Naming constructors(생성자에 이름을 지어주기)에 관한 두가지 글입니다.</p><ul><li><a href="https://localheinz.com/blog/2022/03/26/naming-constructors/">Naming constructors</a> by Andreas Möller</li><li><a href="https://thephp.cc/articles/how-do-you-name-constructors">How do you name constructors?</a> by Stefan Priebsch</li></ul><p>Matthias Verraes의 <a href="https://verraes.net/2014/06/named-constructors-in-php/">Named Constructors in PHP</a>에서 출발하는 글입니다. 기본 생성자 하나만 제공되는 PHP에서 constructor 대신 도메인을 충분히 표현하는 static method로 overloading이 안 되는 문제를 보완하는 방식입니다.</p><figure class="highlight php"><table><tr><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">SomeValueObject</span></span></span><br><span class="line"><span class="class"></span>&#123;</span><br><span class="line"><span class="keyword">private</span> <span class="function"><span class="keyword">function</span> <span class="title">__construct</span>(<span class="params"></span></span></span><br><span class="line"><span class="params"><span class="function">        ...</span></span></span><br><span class="line"><span class="params"><span class="function">    </span>) </span>&#123;</span><br><span class="line">    ...</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="built_in">static</span> <span class="function"><span class="keyword">function</span> <span class="title">fromInt</span>(<span class="params"><span class="keyword">int</span> <span class="variable">$value</span></span>): <span class="title">self</span></span></span><br><span class="line"><span class="function">    </span>&#123;</span><br><span class="line">        ...</span><br><span class="line">    &#125;</span><br><span class="line"> </span><br><span class="line">    <span class="keyword">public</span> <span class="built_in">static</span> <span class="function"><span class="keyword">function</span> <span class="title">fromString</span>(<span class="params"><span class="keyword">string</span> <span class="variable">$value</span></span>): <span class="title">self</span></span></span><br><span class="line"><span class="function">    </span>&#123;</span><br><span class="line">        ...</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="How-the-Middleware-Pattern-works-and-can-easily-be-applied-in-PHP"><a href="#How-the-Middleware-Pattern-works-and-can-easily-be-applied-in-PHP" class="headerlink" title="How the Middleware Pattern works and can easily be applied in PHP."></a>How the Middleware Pattern works and can easily be applied in PHP.</h2><p><a href="https://doeken.org/blog/middleware-pattern-in-php">https://doeken.org/blog/middleware-pattern-in-php</a></p><p>미들웨어 패턴이 작동하는 방식과 PHP에서 쉽게 적용할 수 있는 방법.</p><h2 id="How-To-Mock-Functions-That-Have-External-HTTP-Requests"><a href="#How-To-Mock-Functions-That-Have-External-HTTP-Requests" class="headerlink" title="How To Mock Functions That Have External HTTP Requests."></a>How To Mock Functions That Have External HTTP Requests.</h2><p><a href="https://hermanradtke.com/how-to-mock-functions-that-have-external-http-requests/">https://hermanradtke.com/how-to-mock-functions-that-have-external-http-requests/</a></p><p>외부 HTTP 요청이 있는 함수를 mocking하는 방법.</p><h2 id="Writing-Readable-PHP"><a href="#Writing-Readable-PHP" class="headerlink" title="Writing Readable PHP"></a>Writing Readable PHP</h2><p><a href="https://writing-readable-php.com/">https://writing-readable-php.com/</a></p><p>Freek Van der Herten과 Christoph Rumpel의 유료 강좌로, 여러분과 여러분의 동료 및 미래의 자신을 위해 코드를 즐겁게 읽을 수 있는 간단한 팁을 제공합니다.</p><h2 id="PHP-Tricks-Multi-value-match"><a href="#PHP-Tricks-Multi-value-match" class="headerlink" title="PHP Tricks: Multi-value match()"></a>PHP Tricks: Multi-value match()</h2><p><a href="https://peakd.com/hive-168588/@crell/php-tricks-multi-value-match">https://peakd.com/hive-168588/@crell/php-tricks-multi-value-match</a></p><p>하나의 match 표현식(PHP 8.0 이상)에서 여러 값을 비교할 수 있다는 것을 알고 계셨습니까? 이와 같이:</p><figure class="highlight php"><table><tr><td class="code"><pre><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">mayFriend</span>(<span class="params">User <span class="variable">$u1</span>, User <span class="variable">$u2</span>, Group <span class="variable">$group</span></span>): <span class="title">FriendPermission</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="keyword">return</span> <span class="keyword">match</span> ([<span class="variable">$u1</span>-&gt;<span class="title function_ invoke__">inGroup</span>(<span class="variable">$group</span>), <span class="variable">$u2</span>-&gt;<span class="title function_ invoke__">inGroup</span>(<span class="variable">$group</span>)]) &#123;</span><br><span class="line">        [<span class="literal">true</span>, <span class="literal">true</span>] =&gt; <span class="title class_">FriendPermission</span>::<span class="variable constant_">Allow</span>,</span><br><span class="line">        [<span class="literal">true</span>, <span class="literal">false</span>] =&gt; <span class="title class_">FriendPermission</span>::<span class="variable constant_">WithApproval</span>,</span><br><span class="line">        [<span class="literal">false</span>, <span class="literal">true</span>] =&gt; <span class="title class_">FriendPermission</span>::<span class="variable constant_">WithApproval</span>,</span><br><span class="line">        [<span class="literal">false</span>, <span class="literal">false</span>] =&gt; <span class="title class_">FriendPermission</span>::<span class="variable constant_">Deny</span>,</span><br><span class="line">    &#125;;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="Interfaces-are-not-class-templates"><a href="#Interfaces-are-not-class-templates" class="headerlink" title="Interfaces are not class templates"></a>Interfaces are not class templates</h2><p><a href="https://www.exakat.io/en/interfaces-are-not-class-templates/">https://www.exakat.io/en/interfaces-are-not-class-templates/</a></p><p>메서드가 없는 유효한 인터페이스를 활용하는 방법을 설명합니다.</p><h2 id="Speeding-up-array-merge"><a href="#Speeding-up-array-merge" class="headerlink" title="Speeding up array_merge()."></a>Speeding up array_merge().</h2><p><a href="https://www.exakat.io/en/speeding-up-array_merge/">https://www.exakat.io/en/speeding-up-array_merge/</a></p><p>배열을 합치기 위해 loop 안에서 여러번 array_merge를 호출하지 말고, array_merge가 여러 인자를 받을 수 있으므로 한번에 실행하라고 조언합니다.<br>여러 인자를 받을 수 있는 implode(), array_sum()도 마찬가지의 효과가 있습니다.<br>최신 버전의 PHP를 쓰기만해도 성능 개선 효과를 볼 수 있습니다.</p><h2 id="All-the-Dynamic-Syntaxes-in-PHP-–-Good-source-for-interview-questions"><a href="#All-the-Dynamic-Syntaxes-in-PHP-–-Good-source-for-interview-questions" class="headerlink" title="All the Dynamic Syntaxes in PHP – Good source for interview questions?"></a>All the Dynamic Syntaxes in PHP – Good source for interview questions?</h2><p><a href="https://www.exakat.io/en/all-the-dynamic-syntaxes-in-php/">https://www.exakat.io/en/all-the-dynamic-syntaxes-in-php/</a></p><p>PHP의 동적 구문.</p><h2 id="Solving-Open-Source-Supply-Chain-Security-for-the-PHP-Ecosystem"><a href="#Solving-Open-Source-Supply-Chain-Security-for-the-PHP-Ecosystem" class="headerlink" title="Solving Open Source Supply Chain Security for the PHP Ecosystem"></a>Solving Open Source Supply Chain Security for the PHP Ecosystem</h2><p><a href="https://paragonie.com/blog/2022/01/solving-open-source-supply-chain-security-for-php-ecosystem">https://paragonie.com/blog/2022/01/solving-open-source-supply-chain-security-for-php-ecosystem</a></p><p>PHP 생태계를 위한 오픈 소스 공급망 보안 해결. Paragon IE 사람들의 계획(initiatives)에 대한 흥미로운 게시물입니다. 그들은 이제 앱과 종속성을 안전하게 업데이트하기 위해 <a href="https://gossamer.tools/">Gossamer</a>라는 도구를 개발하고 있습니다. 이전에는 PHP 코어에 libsodium을 도입 하고 JWT에 대한 더 안전한 대안인 <a href="https://github.com/paragonie/paseto">Paseto</a>를 만들고 <a href="https://github.com/paragonie">다른 도구</a>도 개발했습니다.</p><h2 id="Service-locator-an-anti-pattern"><a href="#Service-locator-an-anti-pattern" class="headerlink" title="Service locator: an anti-pattern."></a>Service locator: an anti-pattern.</h2><p><a href="https://stitcher.io/blog/service-locator-anti-pattern">https://stitcher.io/blog/service-locator-anti-pattern</a></p><p>라라벨의 파사드나 헬퍼 함수가 Service locator 패턴을 기반으로 만들어져있고, 여기에서 발생하는 문제를 설명합니다. 이런 문제는 의존성 주입이 해결한다고 결론을 냅니다. </p><p>(Brent가 2018년 stitcher에 쓴 글인데, 왜 지금 추천을 했는지는 모르겠네요.)</p><h2 id="📺-Xdebug-3-Debugging-Unit-Tests-with-PhpStorm"><a href="#📺-Xdebug-3-Debugging-Unit-Tests-with-PhpStorm" class="headerlink" title="📺 Xdebug 3: Debugging Unit Tests with PhpStorm."></a>📺 Xdebug 3: Debugging Unit Tests with PhpStorm.</h2><p><a href="https://www.youtube.com/watch?v=WMGYfgzoap0">https://www.youtube.com/watch?v=WMGYfgzoap0</a></p><p>Derick Rethans의 강의 영상입니다.</p><h2 id="📺-Learn-PHP-The-Right-Way-–-Full-PHP-course-in-88-videos-for-free"><a href="#📺-Learn-PHP-The-Right-Way-–-Full-PHP-course-in-88-videos-for-free" class="headerlink" title="📺 Learn PHP The Right Way – Full PHP course in 88 videos for free."></a>📺 Learn PHP The Right Way – Full PHP course in 88 videos for free.</h2><p><a href="https://www.youtube.com/playlist?list=PLr3d3QYzkw2xabQRUpcZ_IBk9W50M9pe-">https://www.youtube.com/playlist?list=PLr3d3QYzkw2xabQRUpcZ_IBk9W50M9pe-</a></p><p>88개 동영상이 포함된 전체 PHP 과정을 무료로 제공합니다.</p><h1 id="Generics"><a href="#Generics" class="headerlink" title="Generics"></a>Generics</h1><p>PHP는 최근에 제네릭 관련 활동을 많이 보였으므로 이 포스트에서 제네릭 관련 섹션을 제공합니다.</p><ul><li>📺 먼저 Brent의 Generics에 대한 비디오 시리즈 <a href="https://www.youtube.com/watch?v=c8hQ1fWU_mQ&list=PL0bgkxUS9EaKyOugEDffRzsvupBE2YEoD">Generics in PHP</a>를 확인하세요.</li><li>더 자세히 알아보려면 <a href="https://dev.to/mrsuh/generics-implementation-approaches-3bf0">Generics 구현 접근 방식</a>에 대한 게시물에 관심이 있을 수 있습니다 .</li><li>PHP로 구현하는 흥미로운 프로젝트를 시도해보세요 : <a href="https://github.com/mrsuh/php-generics">mrsuh&#x2F;php-generics</a>. 흥미롭게도 Reddit 에서는 성능을 위해 PHP에서 런타임 유형 검사를 삭제하는 것에 대한 <a href="https://www.reddit.com/r/PHP/comments/ta5d4u/php_perfomance_mode_yay_or_nay/">토론이 있었습니다</a>. 위의 도구는 <a href="https://github.com/mrsuh/php-generics#type-erasure">타입 제거 방식(Type erasure)을 구현</a>하므로 이론적으로는 다음과 같이 성능 관련 사례로 사용할 수 있습니다 : <code>composer dump-generics --type=type-erasure</code>.</li><li>제네릭의 주요 응용 프로그램 중 하나는 컬렉션입니다. <a href="https://dev.to/mrsuh/comparing-php-collections-5cca">Comparing PHP Collections</a>이라는 글을 확인하십시오.</li><li>그리고 마지막으로 <a href="https://github.com/SerafimArts">@SerafimArts</a>의 재미있는 작품을 소개합니다.</li></ul><p><img src="https://blog.jetbrains.com/wp-content/uploads/2022/05/generics.gif" alt="generics gif by SerafimArts"></p><h1 id="Community"><a href="#Community" class="headerlink" title="Community"></a>Community</h1><p>(PHP 뽕 주의)</p><h2 id="📺-PHP-isn’t-dead-featuring-the-Laravel-Origins-cast"><a href="#📺-PHP-isn’t-dead-featuring-the-Laravel-Origins-cast" class="headerlink" title="📺 PHP isn’t dead, featuring the Laravel Origins cast."></a>📺 PHP isn’t dead, featuring the Laravel Origins cast.</h2><p><a href="https://www.youtube.com/watch?v=PXx9_FFZi8A">https://www.youtube.com/watch?v=PXx9_FFZi8A</a></p><h2 id="PHP-is-definitely-the-best-array-oriented-programming-language"><a href="#PHP-is-definitely-the-best-array-oriented-programming-language" class="headerlink" title="PHP is definitely the best array-oriented programming language"></a>PHP is definitely the best array-oriented programming language</h2><p><a href="https://twitter.com/savant/status/1519785011381161984">https://twitter.com/savant/status/1519785011381161984</a></p><h2 id="“PHP-doeSNt-sCaLE”"><a href="#“PHP-doeSNt-sCaLE”" class="headerlink" title="“PHP doeSNt sCaLE”"></a>“PHP doeSNt sCaLE”</h2><p><a href="https://twitter.com/levelsio/status/1520354529421983745">https://twitter.com/levelsio/status/1520354529421983745</a></p>]]></content>
    
    
      
      
        
        
    <summary type="html">&lt;p&gt;&lt;img src=&quot;https://blog.jetbrains.com/wp-content/uploads/2020/01/phpstorm-PHP_Annotated_blog_1600x800.png&quot; alt=&quot;Php_annotated</summary>
        
      
    
    
    
    
    <category term="PHP" scheme="https://haah.kr/tags/PHP/"/>
    
    <category term="php-annotated" scheme="https://haah.kr/tags/php-annotated/"/>
    
    <category term="php-annotated-monthly" scheme="https://haah.kr/tags/php-annotated-monthly/"/>
    
  </entry>
  
  <entry>
    <title>PHP Annotated — January 2022</title>
    <link href="https://haah.kr/2022/01/28/php-annotated-january-2022/"/>
    <id>https://haah.kr/2022/01/28/php-annotated-january-2022/</id>
    <published>2022-01-28T14:37:13.000Z</published>
    <updated>2026-05-31T19:29:57.259Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://blog.jetbrains.com/wp-content/uploads/2020/01/phpstorm-PHP_Annotated_blog_1600x800.png" alt="Php_annotated 이미지"></p><p><a href="https://blog.jetbrains.com/author/rpronskiy">Roman Pronskiy</a>가 쓰고 JetBrains에서 제공하는 PHP Annotated <a href="https://blog.jetbrains.com/phpstorm/2022/01/php-annotated-january-2022/">2022년 1월호</a>의 번역&#x2F;해석본입니다.</p><p>이 중에서 몇 가지 제 취향껏 골라 그 안의 내용도 좀 뒤져보고 개발새발 번역해서 소개합니다.</p><hr><h1 id="News"><a href="#News" class="headerlink" title="News"></a>News</h1><h2 id="The-PHP-Foundation-Update-January-2022"><a href="#The-PHP-Foundation-Update-January-2022" class="headerlink" title="The PHP Foundation Update, January 2022"></a>The PHP Foundation Update, January 2022</h2><p><a href="https://opencollective.com/phpfoundation/updates/the-php-foundation-update">https://opencollective.com/phpfoundation/updates/the-php-foundation-update</a></p><p><a href="https://opencollective.com/phpfoundation">PHP 재단은</a>은 PHP 언어의 장수와 번영을 보장하는 것을 사명으로 하는 비영리 조직으로 11월 말에 작업을 시작했습니다.</p><p>우리는 이미 첫 번째 결과를 얻었습니다. 핵심 개발자들의 후원 신청이 접수되어 처리 중입니다.</p><p>재단 팀은 월간 업데이트를 게시할 예정이므로 Twitter <a href="https://twitter.com/thephpf">@thephpf</a>를 구독하면 최신 뉴스를 받아볼 수 있습니다.</p><p>PHP 재단에 대한 자세한 내용은 Joe Watkins, Sara Golemon 및 Sebastian Bergmann이 진행하는 <a href="https://voicesoftheelephpant.com/2021/12/17/interview-with-the-php-foundation/">Voices of the ElePHPant Ep 366</a> 팟캐스트를 확인하십시오.</p><h2 id="PHP-8-0-15-PHP-8-1-2-PHP-7-4-27"><a href="#PHP-8-0-15-PHP-8-1-2-PHP-7-4-27" class="headerlink" title="PHP 8.0.15, PHP 8.1.2, PHP 7.4.27"></a>PHP 8.0.15, PHP 8.1.2, PHP 7.4.27</h2><p><a href="https://www.php.net/ChangeLog-8.php#8.0.15">https://www.php.net/ChangeLog-8.php#8.0.15</a><br><a href="https://www.php.net/ChangeLog-8.php#8.1.2">https://www.php.net/ChangeLog-8.php#8.1.2</a><br><a href="https://www.php.net/ChangeLog-7.php#7.4.27">https://www.php.net/ChangeLog-7.php#7.4.27</a></p><p>최신 PHP branch의 버그 수정이 릴리스되었습니다. PHP 7.4의 경우 마지막 정기 릴리스이며, 이제부터는 PHP 7.4 branch는 보안 업데이트만 발행됩니다.</p><h2 id="PHP-version-stats-January-2022"><a href="#PHP-version-stats-January-2022" class="headerlink" title="PHP version stats: January, 2022"></a>PHP version stats: January, 2022</h2><p><a href="https://stitcher.io/blog/php-version-stats-january-2022">https://stitcher.io/blog/php-version-stats-january-2022</a></p><p>다음은 <a href="https://packagist.org/php-statistics">packagist.org</a>에 따른 PHP 버전에 대한 몇 가지 새로운 통계입니다. 버전 8.1이 나온 지 두 달밖에 안됐지만 이미 9.1%의 점유율을 기록했습니다. 그러나 여전히 PHP 7.4(44%)가 많이 있습니다.</p><p><img src="https://blog.jetbrains.com/wp-content/uploads/2022/01/php_versions.png" alt="Usage Statistics 이미지"></p><h2 id="RFC-User-Defined-Operator-Overloads"><a href="#RFC-User-Defined-Operator-Overloads" class="headerlink" title="[RFC] User Defined Operator Overloads"></a>[RFC] User Defined Operator Overloads</h2><p><a href="https://wiki.php.net/rfc/user_defined_operator_overloads#vote">https://wiki.php.net/rfc/user_defined_operator_overloads#vote</a></p><p>PHP에 연산자 오버로딩을 추가하자는 제안이 투표를 통과하지 못했습니다. 그러나 저자 Jordan LeDoux와 함께하는 <a href="https://phpinternals.news/96">PHP Internals News</a> 팟캐스트에서 자세한 내용을 들어볼 수 있습니다.<br>Jordan은 또한 <a href="https://www.reddit.com/r/PHP/comments/s0pv1e/how_to_make_an_rfc_for_php/">PHP용 RFC를 만드는 방법</a>에 대한 매우 철저한 지침을 발표했습니다.</p><p>그동안 <a href="https://github.com/lisachenko/z-engine">lisachenko&#x2F;z-engine</a> 및 FFI 덕분에 연산자 오버로딩을 이미 PHP에서 사용할 수 있습니다. 행렬에 대한 연산자 구현의 예는 <a href="https://github.com/lisachenko/native-php-matrix">lisachenko&#x2F;native-php-matrix</a>를 참조하십시오.</p><h1 id="Releases"><a href="#Releases" class="headerlink" title="Releases"></a>Releases</h1><h2 id="thephpleague-x2F-flysystem-3-0-0"><a href="#thephpleague-x2F-flysystem-3-0-0" class="headerlink" title="thephpleague&#x2F;flysystem 3.0.0"></a>thephpleague&#x2F;flysystem 3.0.0</h2><p><a href="https://github.com/thephpleague/flysystem">https://github.com/thephpleague/flysystem</a></p><p>파일 시스템 작업을 위한 인기 라이브러리의 메이저 업데이트입니다. 자세한 내용은 <a href="https://blog.frankdejonge.nl/flysystem-3-0-0-is-released/">블로그 게시물</a>을 확인하세요.</p><h2 id="Cycle-2-0"><a href="#Cycle-2-0" class="headerlink" title="Cycle 2.0"></a>Cycle 2.0</h2><p><a href="https://spiralscout.com/blog/meet-cycle-2-0">https://spiralscout.com/blog/meet-cycle-2-0</a></p><p>Cycle의 두 번째 메이저 릴리스 - 전통 방식 및 데몬화된 PHP 애플리케이션 모두에서 사용할 수 있는 PHP용 DataMapper 및 ORM입니다.</p><h2 id="ankitpokhrel-x2F-tus-php-1-0"><a href="#ankitpokhrel-x2F-tus-php-1-0" class="headerlink" title="ankitpokhrel&#x2F;tus-php 1.0"></a>ankitpokhrel&#x2F;tus-php 1.0</h2><p><a href="https://github.com/ankitpokhrel/tus-php">https://github.com/ankitpokhrel/tus-php</a></p><p>재개 가능한 파일 업로드를 위한 개방형 프로토콜인 <a href="https://tus.io/">tus.io</a>의 서버 및 클라이언트 구현. 이 프로토콜은 Vimeo 및 Cloudflare 등에서 사용됩니다.</p><h2 id="Infection-PHP-0-26-0"><a href="#Infection-PHP-0-26-0" class="headerlink" title="Infection PHP 0.26.0"></a>Infection PHP 0.26.0</h2><p><a href="https://infection.github.io/2022/01/10/whats-new-in-0.26.0/">https://infection.github.io/2022/01/10/whats-new-in-0.26.0/</a></p><p>PHP mutation 테스트 프레임워크에 대한 업데이트입니다. 새 버전은 HTML 보고서, 추가되거나 수정된 줄만 변형하는 등을 기능을 추가합니다.</p><h2 id="Doctrine-ORM-2-11"><a href="#Doctrine-ORM-2-11" class="headerlink" title="Doctrine ORM 2.11"></a>Doctrine ORM 2.11</h2><p><a href="https://www.doctrine-project.org/2022/01/11/orm-2.11.html">https://www.doctrine-project.org/2022/01/11/orm-2.11.html</a></p><p>이 업데이트는 열거형, 가상 컬럼, 읽기 전용 속성, 중첩 속성 등에 대한 지원을 제공합니다.</p><h2 id="Roave-x2F-BetterReflection-5-0"><a href="#Roave-x2F-BetterReflection-5-0" class="headerlink" title="Roave&#x2F;BetterReflection 5.0"></a>Roave&#x2F;BetterReflection 5.0</h2><p><a href="https://github.com/Roave/BetterReflection/releases/tag/5.0.0">https://github.com/Roave/BetterReflection/releases/tag/5.0.0</a></p><p>향상된 리플렉션 API: 클래스를 로드하지 않고도 클로저 등에서 정보를 얻을 수 있습니다.<br>새 버전은 PHP 8.1 지원을 추가하고 더 나은 성능을 제공합니다.</p><h1 id="Tools"><a href="#Tools" class="headerlink" title="Tools"></a>Tools</h1><h2 id="viewi-x2F-viewi"><a href="#viewi-x2F-viewi" class="headerlink" title="viewi&#x2F;viewi"></a>viewi&#x2F;viewi</h2><p><a href="https://github.com/viewi/viewi">https://github.com/viewi/viewi</a></p><p>PHP와 HTML만을 사용하여 반응형 애플리케이션을 만들기 위한 강력한 도구입니다. 본질적으로 이것은 서버 측 템플릿 엔진 + 프론트엔드 프레임워크입니다. 그러나 핵심은 모든 구성 요소와 논리를 PHP로 설명한 다음 도구가 이를 기본 JS로 변환한다는 것입니다.</p><p>프로젝트 웹사이트 <a href="https://viewi.net/">viewi.net</a>은 <a href="https://viewi.net/docs/introduction#whatisviewi">작동 메커니즘</a>을 자세히 설명하고 코드 예제를 제공합니다. <a href="https://github.com/ivanvoitovych/tour-of-heroes">단계별 자습서</a>를 따라할 수도 있고 <a href="https://viewi.net/docs/integrations-symfony">Symfony와 통합하는 방법</a>을 확인할 수도 있습니다.</p><h2 id="Roach-PHP"><a href="#Roach-PHP" class="headerlink" title="Roach PHP"></a>Roach PHP</h2><p><a href="https://roach-php.dev/">https://roach-php.dev/</a></p><p>인기 있는 Python 라이브러리인 Scrapy에서 영감을 받은 웹 스크래핑 도구입니다.</p><h2 id="symfony-x2F-html-sanitizer"><a href="#symfony-x2F-html-sanitizer" class="headerlink" title="symfony&#x2F;html-sanitizer"></a>symfony&#x2F;html-sanitizer</h2><p><a href="https://github.com/symfony/html-sanitizer">https://github.com/symfony/html-sanitizer</a></p><p>신뢰할 수 없는 HTML을 정리하고 XSS로부터 보호하는 새로운 컴포넌트입니다. <a href="https://github.com/ezyang/htmlpurifier">HTML Purifier</a>의 좋은 대안이 될 수 있습니다.</p><h2 id="EventSaucePHP-x2F-ObjectHydrator"><a href="#EventSaucePHP-x2F-ObjectHydrator" class="headerlink" title="EventSaucePHP&#x2F;ObjectHydrator"></a>EventSaucePHP&#x2F;ObjectHydrator</h2><p><a href="https://github.com/EventSaucePHP/ObjectHydrator">https://github.com/EventSaucePHP/ObjectHydrator</a></p><p>원시 데이터(예: JSON)를 객체로 변환해주는 라이브러리입니다.</p><h2 id="ajthinking-x2F-archetype"><a href="#ajthinking-x2F-archetype" class="headerlink" title="ajthinking&#x2F;archetype"></a>ajthinking&#x2F;archetype</h2><p><a href="https://github.com/ajthinking/archetype">https://github.com/ajthinking/archetype</a></p><p>PHP 파일&#x2F;클래스를 수정하기 위한 간단한 인터페이스입니다.</p><h2 id="framjet-x2F-php-enum-bitmask"><a href="#framjet-x2F-php-enum-bitmask" class="headerlink" title="framjet&#x2F;php-enum-bitmask"></a>framjet&#x2F;php-enum-bitmask</h2><p><a href="https://github.com/framjet/php-enum-bitmask">https://github.com/framjet/php-enum-bitmask</a></p><p>PHP 8.1의 열거형을 BitMask로 사용하기.</p><h2 id="beyondcode-x2F-httpdump"><a href="#beyondcode-x2F-httpdump" class="headerlink" title="beyondcode&#x2F;httpdump"></a>beyondcode&#x2F;httpdump</h2><p><a href="https://github.com/beyondcode/httpdump">https://github.com/beyondcode/httpdump</a></p><p>HTTP 요청을 디버깅하기 위한 Laravel 애플리케이션(web hook 디버깅 등). 임의의 URL을 만들고 그곳으로 가는 모든 요청을 훌륭하게 덤프합니다. <a href="https://httpdump.app/">httpdump.app</a>에서 작동하는 것을 볼 수 있습니다.</p><h2 id="spatie-x2F-ignition"><a href="#spatie-x2F-ignition" class="headerlink" title="spatie&#x2F;ignition"></a>spatie&#x2F;ignition</h2><p><a href="https://github.com/spatie/ignition">https://github.com/spatie/ignition</a></p><p>Laravel의 많은 사람들에게 친숙하지만 이제 프레임워크에 독립적인 디버깅 오류 페이지를 표시하기 위한 이 라이브러리가 업데이트되었으며 모든 애플리케이션에서 사용할 수 있습니다.</p><p>디버깅을 위한 오류 페이지를 만들 수 있는 이 라이브러리는 Laravel의 많은 것과 비슷하지만, 이제 프레임워크에 독립적이어서 어느 어플리케이션에서나 사용할 수 있습니다. <a href="https://freek.dev/2169-a-better-error-page-for-symfony-applications">Overview 블로그 게시물</a>을 확인하세요.</p><h2 id="chevere-x2F-xr"><a href="#chevere-x2F-xr" class="headerlink" title="chevere&#x2F;xr"></a>chevere&#x2F;xr</h2><p><a href="https://github.com/chevere/xr">https://github.com/chevere/xr</a></p><p><a href="https://github.com/spatie/ray">Spatie&#x2F;ray</a>에서 영감을 받은 ReactPHP의 디버그 서버이지만 데스크톱 애플리케이션 대신 CLI 명령으로 실행합니다. <a href="https://vimeo.com/662391948">비디오 데모</a>.</p><h2 id="JustSteveKing-x2F-php-sdk-Sammyjo20-x2F-Saloon"><a href="#JustSteveKing-x2F-php-sdk-Sammyjo20-x2F-Saloon" class="headerlink" title="JustSteveKing&#x2F;php-sdk, Sammyjo20&#x2F;Saloon"></a>JustSteveKing&#x2F;php-sdk, Sammyjo20&#x2F;Saloon</h2><p><a href="https://github.com/JustSteveKing/php-sdk">https://github.com/JustSteveKing/php-sdk</a><br><a href="https://github.com/Sammyjo20/Saloon">https://github.com/Sammyjo20/Saloon</a></p><p>동일한 아이디어를 가진 두 개의 유사한 라이브러리: 서비스용 SDK 생성을 단순화하거나 공통 스타일로 다른 API에 접근할 수 있게 구성합니다.</p><h2 id="AliSaleem27-x2F-wordle-cl"><a href="#AliSaleem27-x2F-wordle-cl" class="headerlink" title="AliSaleem27&#x2F;wordle-cl"></a>AliSaleem27&#x2F;wordle-cl</h2><p><a href="https://github.com/AliSaleem27/wordle-cli">https://github.com/AliSaleem27/wordle-cli</a></p><p>인기 있는 5글자 단어 추측 게임 Wordle의 CLI 버전입니다.</p><h2 id="staabm-x2F-phpstan-dba"><a href="#staabm-x2F-phpstan-dba" class="headerlink" title="staabm&#x2F;phpstan-dba"></a>staabm&#x2F;phpstan-dba</h2><p><a href="https://github.com/staabm/phpstan-dba">https://github.com/staabm/phpstan-dba</a></p><p>PDO, MySQLi 및 Doctrine&#x2F;DBAL에서 SQL 쿼리의 유효성을 확인하는 <a href="https://github.com/phpstan/phpstan">PHPStan</a>용 extension입니다. <a href="https://github.com/staabm/phpstan-dba/pull/61/files#diff-98a3c43049f6a0c859c0303037d9773534396533d7890bad187d465d390d634e">데모</a>.</p><h2 id="flow-php-x2F-etl"><a href="#flow-php-x2F-etl" class="headerlink" title="flow-php&#x2F;etl"></a>flow-php&#x2F;etl</h2><p><a href="https://github.com/flow-php/etl">https://github.com/flow-php/etl</a></p><p>PHP 애플리케이션에서 사용할 Extract Transform Load 패턴의 구현입니다. 자세한 내용은 <a href="https://twitter.com/norbert_tech/status/1484863793280786439">작성자의 스레드</a>를 확인하세요.</p><h1 id="Symfony"><a href="#Symfony" class="headerlink" title="Symfony"></a>Symfony</h1><h2 id="The-symfony-cli-tool-has-been-open-sourced"><a href="#The-symfony-cli-tool-has-been-open-sourced" class="headerlink" title="The symfony-cli tool has been open-sourced"></a>The symfony-cli tool has been open-sourced</h2><p><a href="https://github.com/symfony-cli/symfony-cli">https://github.com/symfony-cli/symfony-cli</a></p><p>Symfony 관련 작업 외에도 이 도구에는 MAMP&#x2F;WAMP의 최신 대안으로 사용할 수 있는 <a href="https://symfony.com/doc/current/setup/symfony_server.html">로컬 서버</a>가 포함되어 있습니다. 여러 버전의 PHP를 지원하고(각 프로젝트에서 자체적으로 지정할 수 있음) Docker, 로컬 도메인 및 자동화된 HTTPS와 통합됩니다. 이 도구는 Go로 구현되며 Linux, macOS 및 Windows에서 사용할 수 있습니다.</p><h2 id="A-better-way-to-quickly-start-Symfony-projects"><a href="#A-better-way-to-quickly-start-Symfony-projects" class="headerlink" title="A better way to quickly start Symfony projects"></a>A better way to quickly start Symfony projects</h2><p><a href="https://symfony.com/blog/a-better-way-to-quickly-start-symfony-projects">https://symfony.com/blog/a-better-way-to-quickly-start-symfony-projects</a></p><h2 id="Introducing-the-Symfony-6-Certification-–-90-minutes-for-75-questions-from-15-topics"><a href="#Introducing-the-Symfony-6-Certification-–-90-minutes-for-75-questions-from-15-topics" class="headerlink" title="Introducing the Symfony 6 Certification – 90 minutes for 75 questions from 15 topics."></a>Introducing the Symfony 6 Certification – 90 minutes for 75 questions from 15 topics.</h2><p><a href="https://symfony.com/blog/introducing-the-symfony-6-certification">https://symfony.com/blog/introducing-the-symfony-6-certification</a></p><p>15개 주제에서 75개 질문에 대해 90분 동안 시험을 치고 Symfony 6 인증서를 받아보세요.</p><h2 id="Organizing-your-Symfony-project-tests"><a href="#Organizing-your-Symfony-project-tests" class="headerlink" title="Organizing your Symfony project tests"></a>Organizing your Symfony project tests</h2><p><a href="https://www.strangebuzz.com/en/blog/organizing-your-symfony-project-tests">https://www.strangebuzz.com/en/blog/organizing-your-symfony-project-tests</a></p><p>테스트를 용도(+속도)에 맞게 아래와 같이 디렉토리를 구분하고 별도로 실행할 수 있게 구성했습니다.</p><ul><li>Unit tests</li><li>Integration tests</li><li>Api tests</li><li>Functional tests</li><li>End-to-end tests</li><li>External tests</li></ul><p></p><h2 id="The-key-concepts-of-Symfony’s-Security-package-in-5-minutes"><a href="#The-key-concepts-of-Symfony’s-Security-package-in-5-minutes" class="headerlink" title="The key concepts of Symfony’s Security package in 5 minutes"></a>The key concepts of Symfony’s Security package in 5 minutes</h2><p><a href="https://alex-daubois.medium.com/symfonys-security-key-concepts-in-5-minutes-e18033c26b35">https://alex-daubois.medium.com/symfonys-security-key-concepts-in-5-minutes-e18033c26b35</a></p><p>Symfony 6 Security component를 설명합니다.</p><ul><li>User, password and roles</li><li>User Providers</li><li>Firewalls</li><li>Voters and ACL</li><li>Authenticators, passports and badges</li></ul><h2 id="Symfony-Messenger-💛-systemd"><a href="#Symfony-Messenger-💛-systemd" class="headerlink" title="Symfony Messenger 💛 systemd"></a>Symfony Messenger 💛 systemd</h2><p><a href="https://jolicode.com/blog/symfony-messenger-systemd">https://jolicode.com/blog/symfony-messenger-systemd</a></p><h2 id="Use-PHP-Enums-as-Doctrine-type-in-Symfony"><a href="#Use-PHP-Enums-as-Doctrine-type-in-Symfony" class="headerlink" title="Use PHP Enums as Doctrine type in Symfony"></a>Use PHP Enums as Doctrine type in Symfony</h2><p><a href="https://smaine-milianni.medium.com/use-php-enums-as-doctrine-type-in-symfony-85909aa0a19a">https://smaine-milianni.medium.com/use-php-enums-as-doctrine-type-in-symfony-85909aa0a19a</a></p><h2 id="Build-Symfony-and-Doctrine-ORM-Applications-with-ease-using-Ecotone"><a href="#Build-Symfony-and-Doctrine-ORM-Applications-with-ease-using-Ecotone" class="headerlink" title="Build Symfony and Doctrine ORM Applications with ease using Ecotone"></a>Build Symfony and Doctrine ORM Applications with ease using Ecotone</h2><p><a href="https://blog.ecotone.tech/build-symfony-application-with-ease-using-ecotone/">https://blog.ecotone.tech/build-symfony-application-with-ease-using-ecotone/</a></p><h2 id="norberttech-x2F-static-content-generator-bundle"><a href="#norberttech-x2F-static-content-generator-bundle" class="headerlink" title="norberttech&#x2F;static-content-generator-bundle"></a>norberttech&#x2F;static-content-generator-bundle</h2><p><a href="https://github.com/norberttech/static-content-generator-bundle">https://github.com/norberttech/static-content-generator-bundle</a></p><p>Symfony 애플리케이션에서 정적 HTML 페이지를 생성합니다.</p><h2 id="Using-custom-PHP-attributes-for-registering-and-configuring-Symfony-Messenger-handlers"><a href="#Using-custom-PHP-attributes-for-registering-and-configuring-Symfony-Messenger-handlers" class="headerlink" title="Using custom PHP attributes for registering and configuring Symfony Messenger handlers"></a>Using custom PHP attributes for registering and configuring Symfony Messenger handlers</h2><p><a href="https://angelovdejan.me/2022/01/09/custom-php-attributes-for-symfony-messenger-handlers.html">https://angelovdejan.me/2022/01/09/custom-php-attributes-for-symfony-messenger-handlers.html</a></p><h2 id="JSON-Columns-and-Doctrine-DBAL-3-Upgrade"><a href="#JSON-Columns-and-Doctrine-DBAL-3-Upgrade" class="headerlink" title="JSON Columns and Doctrine DBAL 3 Upgrade"></a>JSON Columns and Doctrine DBAL 3 Upgrade</h2><p><a href="https://dunglas.fr/2022/01/json-columns-and-doctrine-dbal-3-upgrade/">https://dunglas.fr/2022/01/json-columns-and-doctrine-dbal-3-upgrade/</a></p><h1 id="Laravel"><a href="#Laravel" class="headerlink" title="Laravel"></a>Laravel</h1><h2 id="Laracon-Online-is-on-Feb-9-and-it’s-free"><a href="#Laracon-Online-is-on-Feb-9-and-it’s-free" class="headerlink" title="Laracon Online is on Feb 9, and it’s free"></a>Laracon Online is on Feb 9, and it’s free</h2><p><a href="https://laracon.net/">https://laracon.net/</a></p><p>컨퍼런스는 보통 유료지만 이번 Laracon Online Winter는 <a href="https://www.youtube.com/watch?v=5ubDLFKKk54">유튜브</a>에서 무료로 중계됩니다.</p><h2 id="Building-a-multi-room-chat-application-with-Laravel-and-Centrifugo"><a href="#Building-a-multi-room-chat-application-with-Laravel-and-Centrifugo" class="headerlink" title="Building a multi-room chat application with Laravel and Centrifugo"></a>Building a multi-room chat application with Laravel and Centrifugo</h2><p><a href="https://centrifugal.dev/blog/2021/12/14/laravel-multi-room-chat-tutorial">https://centrifugal.dev/blog/2021/12/14/laravel-multi-room-chat-tutorial</a></p><p>Laravel과 <a href="https://centrifugal.dev/">Centrifugo</a>로 멀티룸 채팅 애플리케이션 구축하기</p><p>Centrifugo : real-time messaging server).</p><h2 id="Managing-Laravel-services"><a href="#Managing-Laravel-services" class="headerlink" title="Managing Laravel services"></a>Managing Laravel services</h2><p><a href="https://downing.tech/posts/managing-laravel-services">https://downing.tech/posts/managing-laravel-services</a></p><p>Clean Integrations 시리즈 중 세 번째입니다.</p><ol><li>Automating Tweets when publishing a new post</li><li>Testing APIs and Services in Laravel</li><li>Managing Laravel services</li></ol><h2 id="Laravel-Pseudo-Daemons"><a href="#Laravel-Pseudo-Daemons" class="headerlink" title="Laravel Pseudo-Daemons"></a>Laravel Pseudo-Daemons</h2><p><a href="https://aaronfrancis.com/2020/laravel-pseudo-daemons">https://aaronfrancis.com/2020/laravel-pseudo-daemons</a></p><p>Laravel command의 한계를 극복하고자, Supervisor 구성 없이 코드에 의해 제어되는 유사-데몬을 만든 경험을 공유합니다. 2020년 글이네요.</p><h2 id="Primitive-Types-in-Controllers-and-Closure-Routes"><a href="#Primitive-Types-in-Controllers-and-Closure-Routes" class="headerlink" title="Primitive Types in Controllers and Closure Routes"></a>Primitive Types in Controllers and Closure Routes</h2><p><a href="https://laravel-news.com/primitive-types-in-controllers-and-closure-routes">https://laravel-news.com/primitive-types-in-controllers-and-closure-routes</a></p><h2 id="How-to-scale-Laravel-project-on-AWS-without-breaking-the-bank"><a href="#How-to-scale-Laravel-project-on-AWS-without-breaking-the-bank" class="headerlink" title="How to scale Laravel project on AWS without breaking the bank."></a>How to scale Laravel project on AWS without breaking the bank.</h2><p><a href="https://laravel-news.com/primitive-types-in-controllers-and-closure-routes">https://laravel-news.com/primitive-types-in-controllers-and-closure-routes</a></p><h2 id="LaravelDaily-x2F-Laravel-Roadmap-Learning-Path"><a href="#LaravelDaily-x2F-Laravel-Roadmap-Learning-Path" class="headerlink" title="LaravelDaily&#x2F;Laravel-Roadmap-Learning-Path"></a>LaravelDaily&#x2F;Laravel-Roadmap-Learning-Path</h2><p><a href="https://github.com/LaravelDaily/Laravel-Roadmap-Learning-Path">https://github.com/LaravelDaily/Laravel-Roadmap-Learning-Path</a></p><p>간단한 것부터 복잡한 것까지 라라벨을 배우기 위한 체계적인 자료 모음입니다.</p><h2 id="Building-an-API-using-TDD-in-Laravel"><a href="#Building-an-API-using-TDD-in-Laravel" class="headerlink" title="Building an API using TDD in Laravel"></a>Building an API using TDD in Laravel</h2><p><a href="https://laravel.io/articles/building-and-api-using-tdd-in-laravel">https://laravel.io/articles/building-and-api-using-tdd-in-laravel</a></p><h2 id="Efficient-Pagination-Using-Deferred-Joins"><a href="#Efficient-Pagination-Using-Deferred-Joins" class="headerlink" title="Efficient Pagination Using Deferred Joins"></a>Efficient Pagination Using Deferred Joins</h2><p><a href="https://aaronfrancis.com/2022/efficient-pagination-using-deferred-joins">https://aaronfrancis.com/2022/efficient-pagination-using-deferred-joins</a></p><figure class="highlight sql"><table><tr><td class="code"><pre><span class="line"><span class="comment">-- Page 3</span></span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span> <span class="keyword">from</span> users <span class="keyword">order</span> <span class="keyword">by</span> created_at <span class="keyword">desc</span> limit <span class="number">15</span> <span class="keyword">offset</span> <span class="number">30</span>;</span><br></pre></td></tr></table></figure><p>Pagination 구현 시 위와 같이 쿼리하곤 하는데, 이 경우 database에선 모든 row를 읽은 후 offset 이후의 값을 응답합니다. 이를 더 효율적으로 가져오려면 커서 기반으로 조회해야 하는데, </p><figure class="highlight sql"><table><tr><td class="code"><pre><span class="line"><span class="comment">-- Page 3 (Assuming the max ID from page two was 72.)</span></span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span> <span class="keyword">from</span> users <span class="keyword">where</span> id <span class="operator">&gt;</span> <span class="number">72</span> <span class="keyword">order</span> <span class="keyword">by</span> id limit <span class="number">15</span>;</span><br></pre></td></tr></table></figure><p>Laravel 문서에는 오프셋과 커서 사이의 절충점에 대한 몇 가지 좋은 컨텍스트가 있습니다.<br><a href="https://laravel.com/docs/8.x/pagination#cursor-vs-offset-pagination">https://laravel.com/docs/8.x/pagination#cursor-vs-offset-pagination</a></p><p>이 글에서는 지연된 조인으로 offset&#x2F;limit이 적용될 때까지 요청된 열에 대한 액세스를 연기하는 기술입니다.</p><figure class="highlight sql"><table><tr><td class="code"><pre><span class="line"><span class="keyword">select</span> <span class="operator">*</span> <span class="keyword">from</span> contacts          <span class="comment">-- The full data that you want to show your users.</span></span><br><span class="line">    <span class="keyword">inner</span> <span class="keyword">join</span> (                <span class="comment">-- The &quot;deferred join.&quot;</span></span><br><span class="line">        <span class="keyword">select</span> id <span class="keyword">from</span> contacts <span class="comment">-- The pagination using a fast index.</span></span><br><span class="line">            <span class="keyword">order</span> <span class="keyword">by</span> id</span><br><span class="line">            limit <span class="number">15</span> <span class="keyword">offset</span> <span class="number">150000</span></span><br><span class="line">    ) <span class="keyword">as</span> tmp <span class="keyword">using</span>(id)</span><br><span class="line"><span class="keyword">order</span> <span class="keyword">by</span> id                     <span class="comment">-- Order the single resulting page as well.</span></span><br></pre></td></tr></table></figure><p>이 글에서는 이 아이디어를 Laravel로 구현하는 예제와 더 나은 성능을 위한 MySQL 튜닝 아이디어 그리고 많은 이들의 성능 개선 간증이 이어집니다.</p><h2 id="45-New-Laravel-Tips-2022"><a href="#45-New-Laravel-Tips-2022" class="headerlink" title="45 New Laravel Tips 2022"></a>45 New Laravel Tips 2022</h2><p><a href="https://www.youtube.com/watch?v=YzBGmdnGtbY">https://www.youtube.com/watch?v=YzBGmdnGtbY</a></p><h1 id="Yii"><a href="#Yii" class="headerlink" title="Yii"></a>Yii</h1><h2 id="Yii-1-1-25"><a href="#Yii-1-1-25" class="headerlink" title="Yii 1.1.25"></a>Yii 1.1.25</h2><p><a href="https://www.yiiframework.com/news/419/yii-1-1-25-is-released">https://www.yiiframework.com/news/419/yii-1-1-25-is-released</a></p><p>Yii 프레임워크의 첫 번째 버전은 활발히 개발되지 않지만 호환성을 위한 수정은 계속 나오고 있습니다. 이 업데이트는 PHP 8.0에 대한 몇 가지를 수정합니다.</p><h2 id="The-first-stable-releases-for-some-Yii-3-components-have-also-been-released"><a href="#The-first-stable-releases-for-some-Yii-3-components-have-also-been-released" class="headerlink" title="The first stable releases for some Yii 3 components have also been released"></a>The first stable releases for some Yii 3 components have also been released</h2><ul><li><a href="https://github.com/yiisoft/user">yiisoft&#x2F;user</a></li><li><a href="https://github.com/yiisoft/translator-extractor">yiisoft&#x2F;translator-extractor</a></li><li><a href="https://github.com/yiisoft/config">yiisoft&#x2F;config</a></li><li><a href="https://github.com/yiisoft/yii-swagger">yiisoft&#x2F;yii-swagger</a></li><li><a href="https://github.com/yiisoft/widget">yiisoft&#x2F;widget</a></li><li><a href="https://github.com/yiisoft/router">yiisoft&#x2F;router</a></li></ul><h1 id="기타-읽을-만한-글"><a href="#기타-읽을-만한-글" class="headerlink" title="기타 읽을 만한 글"></a>기타 읽을 만한 글</h1><h2 id="Trying-out-PHP-after-7-years"><a href="#Trying-out-PHP-after-7-years" class="headerlink" title="Trying out PHP after 7 years"></a>Trying out PHP after 7 years</h2><p><a href="https://www.kode-krunch.com/2021/12/trying-out-php-after-7-years.html">https://www.kode-krunch.com/2021/12/trying-out-php-after-7-years.html</a></p><p>7년 전 Java에만 집중하기 위해 PHP를 떠났던(당시 PHP 사용하던 버전은 5.3) 개발자가 천지개벽한 PHP 생태계를 만나 이제 쓸만 하다고 생각한다는 내용.</p><p>자신의 경험을 토대로 Symfony Demo를 다시 만들어 본 경험을 2부작으로 게시하기도 했습니다.<br>PHP: Symfony Demo meets Modular, Microservice-ready Architecture - <a href="https://www.kode-krunch.com/2021/11/php-symfony-modular-architecture-demo-part-1.html">Part 1</a>, <a href="https://www.kode-krunch.com/2021/12/php-symfony-modular-architecture-demo-part-2.html">Part 2</a></p><blockquote><p>7년 전에 PHP 커뮤니티에 PHP 언어가 오늘날의 모든 기능을 가질 것이라고 말하면 그들은 당신이 미쳤다고 생각할 것입니다.</p></blockquote><h2 id="PHP-in-2022"><a href="#PHP-in-2022" class="headerlink" title="PHP in 2022"></a>PHP in 2022</h2><p><a href="https://stitcher.io/blog/php-in-2022">https://stitcher.io/blog/php-in-2022</a></p><p>Brent Roose가 쓰는 PHP 생태계 overview.</p><blockquote><p>매년 “PHP in 20XX” 포스트를 쓰는 것은 이번이 네 번째이며, 올해만큼 흥분한 적이 없었다는 것을 인정해야 합니다.</p></blockquote><h3 id="PHP-8-1"><a href="#PHP-8-1" class="headerlink" title="PHP 8.1"></a>PHP 8.1</h3><p><a href="https://stitcher.io/blog/php-enums">열거형</a><br><a href="https://stitcher.io/blog/php-81-new-in-initializers">생성자에서 new 사용</a><br><a href="https://stitcher.io/blog/php-81-readonly-properties">readonly properties</a></p><ul><li><a href="https://stitcher.io/blog/constructor-promotion-in-php-8">promoted properties</a>와 조합하면 훨씬 깔끔한 선언을 할 수 있습니다.</li></ul><p>PHP에 추가된 최신 기능을 확인하시려면 <a href="https://www.youtube.com/watch?v=W3p8BGeiTwQ">PHP 2021 3분 요약 비디오</a>를 보고 오셔도 좋습니다.</p><h3 id="Static-Analysis"><a href="#Static-Analysis" class="headerlink" title="Static Analysis"></a>Static Analysis</h3><p>PHP의 정적 분석이 크게 성장하고 있습니다.</p><ul><li>Laravel과 같은 프레임워크는 <a href="https://github.com/laravel/framework/pull/38538">정적 타이핑</a>을 점점 더 많이 수용하고 있습니다</li><li>PhpStorm은 제네릭 유형에 대한 <a href="https://blog.jetbrains.com/phpstorm/2021/07/phpstorm-2021-2-beta/">지원을 추가</a> 했습니다.</li><li><a href="https://packagist.org/packages/phpstan/phpstan/stats">PhpStan</a>과 <a href="https://packagist.org/packages/vimeo/psalm/stats">psalm</a> 은 성장 중입니다.</li></ul><p>PHP에서 정적 분석이 중요한 이유와 이에 대해 열광하는 이유에 대해 간단히 읽고 싶다면 <a href="https://stitcher.io/blog/we-dont-need-runtime-type-checks">우리는 런타임 유형 검사가 필요하지 않습니다</a>라는 블로그 게시물을 확인할 수 있습니다.</p><h3 id="The-PHP-foundation"><a href="#The-PHP-foundation" class="headerlink" title="The PHP foundation"></a>The PHP foundation</h3><p>2개월 전, PHP 세계는 2021년의 가장 큰 뉴스일 수도 있는 꽤 큰 뉴스를 받았습니다. 가장 활동적인 핵심 유지 관리자 중 한 명인 Nikita가 LLVM 작업을 위해 자리에서 물러나지만 동시에 PHP core 개발을 지원할 수 있게 몇몇 대기업이 지원하는 새로운 이니셔티브도 생겼습니다.</p><p>요컨대, PHP core 개발 자금을 지원하는 유일한 목표를 가진 비영리 <a href="https://opencollective.com/phpfoundation">PHP Foundation</a>이 있습니다. 이 이니셔티브는 이미 프로젝트에 10만 달러를 약속한 JetBrains가 주도합니다. 다른 많은 사람들과 함께 이제 $329,920.75를 모았습니다. 좋은 시작!</p><ul><li>이 글을 번역하는 시점에는 $386,384.93 USD, 연간 추정 예산은 $468,509.68 USD입니다.</li></ul><p><a href="https://blog.jetbrains.com/phpstorm/2021/11/the-php-foundation/">JetBrains의 블로그 게시물</a>에서 재단의 사명과 목표에 대해 자세히 알아볼 수 있습니다 .</p><h3 id="The-ecosystem"><a href="#The-ecosystem" class="headerlink" title="The ecosystem"></a>The ecosystem</h3><p>Packagist는 이제 300만 개 이상의 등록된 버전과 300,000개 이상의 패키지가 있습니다. 보시다시피 생태계는 계속 성장하고 성장하며 2022년에도 다르지 않을 것입니다.</p><p><img src="https://stitcher.io/resources/img/blog/php-in-2022/01-1804x712.png" alt="Packagist에 등록된 패키지 현황 그래프"></p><p>최근에 Packagist는 500억 회 이상의 설치(install)를 처리하는 이정표를 통과했습니다.<br>축하해요 Packagist!</p><h3 id="Async-PHP"><a href="#Async-PHP" class="headerlink" title="Async PHP"></a>Async PHP</h3><p>Async 커뮤니티의 흥미로운 개발 중 하나는 Amp와 ReactPHP의 개발자가 함께 모여 <a href="https://github.com/revoltphp/event-loop">Revolt PHP</a>라는 fiber 호환 이벤트 루프 구현을 만들었다는 것 입니다.</p><h3 id="Serverless-PHP"><a href="#Serverless-PHP" class="headerlink" title="Serverless PHP"></a>Serverless PHP</h3><p><a href="https://twitter.com/matthieunapoli">Matthieu Napoli</a>는 PHP 개발자에게 이 비교적 새로운 PHP 사용 방법에 대해 교육하는 것을 그의 사명으로 삼고 있으며 꽤 잘하고 있는 것 같습니다. 서버리스 PHP를 쉽게 만들기 위한 그의 오픈 소스 프로젝트인 <a href="https://bref.sh/">Bref</a>를 확인 하거나 2022년 서버리스 PHP에 대한 그의 <a href="https://gumroad.com/a/575280243">visual course</a>을 확인할 수 있습니다.</p><h2 id="Heaps-explained-in-PHP"><a href="#Heaps-explained-in-PHP" class="headerlink" title="Heaps explained in PHP"></a>Heaps explained in PHP</h2><p><a href="https://doeken.org/blog/heaps-explained-in-php">https://doeken.org/blog/heaps-explained-in-php</a></p><p>PHP에서 heap을 사용하는 방식을 보여줍니다.<br>🤷 힙은 언제 유용합니까?</p><ul><li>가장 높은(또는 가장 낮은) 값에 직접 액세스</li><li>많은 삽입 및 제거 작업</li><li>배열 정렬</li><li>우선 순위 대기열</li></ul><p>이를 훌륭하게 구현한 Real world example은 <a href="https://github.com/revoltphp/event-loop/blob/a928073cc74501c1852fd9d8c8b02e550cb56517/src/EventLoop/Internal/TimerQueue.php">revolt&#x2F;event-loop package에서 찾을 수 있습니다</a>.</p><p>이 글을 읽기 위해 Tree에 대한 약간의 지식은 유용하기 때문에 <a href="https://doeken.org/blog/tree-traversal-in-php">Trees and Tree Traversal in PHP</a>를 먼저 읽는 것이 좋습니다 .</p><h2 id="Implementation-of-Chain-of-Responsibility-Design-Pattern-in-PHP"><a href="#Implementation-of-Chain-of-Responsibility-Design-Pattern-in-PHP" class="headerlink" title="Implementation of Chain of Responsibility Design Pattern in PHP"></a>Implementation of Chain of Responsibility Design Pattern in PHP</h2><p><a href="https://orangesoft.co/blog/chain-of-responsibility-design-pattern-in-php">https://orangesoft.co/blog/chain-of-responsibility-design-pattern-in-php</a></p><p>PHP에서 Chain of Responsibility 디자인 패턴 구현</p><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">             Chain of Responsibility:</span><br><span class="line">             +-------------------------------------------+</span><br><span class="line">+-------+    | +---------+    +---------+    +---------+ |    +--------+</span><br><span class="line">| Input | -&gt; | | Handler | -&gt; | Handler | -&gt; | Handler | | -&gt; | Output |</span><br><span class="line">+-------+    | +---------+    +---------+    +---------+ |    +--------+</span><br><span class="line">             +-------------------------------------------+</span><br></pre></td></tr></table></figure><h2 id="async-amp-await-at-the-edge-with-ReactPHP"><a href="#async-amp-await-at-the-edge-with-ReactPHP" class="headerlink" title="async &amp; await at the edge with ReactPHP"></a>async &amp; await at the edge with ReactPHP</h2><p><a href="https://blog.wyrihaximus.net/2021/12/async-and-await-at-the-edge-with-reactphp/">https://blog.wyrihaximus.net/2021/12/async-and-await-at-the-edge-with-reactphp/</a></p><p>Fiber를 지원하는 PHP 8.1이 출시되었습니다! ReactPHP maintainer 중 한 명이 사용 방법에 대해 씁니다.</p><h2 id="PHP-Benchmark-include-vs-file-get-contents"><a href="#PHP-Benchmark-include-vs-file-get-contents" class="headerlink" title="PHP Benchmark: include() vs file_get_contents()"></a>PHP Benchmark: include() vs file_get_contents()</h2><p><a href="https://konstantin.blog/2021/php-benchmark-include-vs-file_get_contents/">https://konstantin.blog/2021/php-benchmark-include-vs-file_get_contents/</a></p><p>Opcache 설정을 조정하면 include()가 file_get_contents()보다 빠를 수 있습니다.</p><h2 id="Where-does-my-validation-live"><a href="#Where-does-my-validation-live" class="headerlink" title="Where does my validation live?"></a>Where does my validation live?</h2><p><a href="https://blog.frankdejonge.nl/where-does-validation-live/">https://blog.frankdejonge.nl/where-does-validation-live/</a></p><p>유효성 검증을 어느 레이어(Controller Layer, Service Layer, Domain Layer)에 넣어야 할지, 각각 어느 점이 좋은지 설명합니다.</p><ul><li>Controller validation: shapes and types</li><li>Service validation: from types to concepts concepts</li><li>Domain Layer: guarding invariants</li></ul><h2 id="How-to-build-maintainable-PHP-applications"><a href="#How-to-build-maintainable-PHP-applications" class="headerlink" title="How to build maintainable PHP applications"></a>How to build maintainable PHP applications</h2><p><a href="https://blog.ecotone.tech/how-to-build-maintainable-php-applications/">https://blog.ecotone.tech/how-to-build-maintainable-php-applications/</a></p><p>유지 관리 가능한 PHP 애플리케이션을 구축하고 프레임워크에서 비즈니스 로직을 분리하는 방법.</p><h2 id="Making-sense-of-the-8-log-levels-in-PHP"><a href="#Making-sense-of-the-8-log-levels-in-PHP" class="headerlink" title="Making sense of the 8 log levels in PHP"></a>Making sense of the 8 log levels in PHP</h2><p><a href="https://darkghosthunter.medium.com/php-making-sense-of-the-8-log-levels-ddd27c4719a">https://darkghosthunter.medium.com/php-making-sense-of-the-8-log-levels-ddd27c4719a</a></p><p>여덟 레벨을 모두 설명하는데 저자 자신은 4개만 쓴다고 합니다.</p><ul><li>Debug(디버그): 앱의 내부 작동을 보여주는 모든 것.</li><li>Error(오류): 발생해서는 안 되는 일이 발생했습니다.</li><li>Alert(경고): 단기적으로 앱 상태를 위험에 빠뜨리는 모든 것.</li><li>Emergency(긴급 상황): 응용 프로그램의 모든 부분이 작동을 멈췄습니다.</li></ul><h2 id="Overriding-vendor-classes"><a href="#Overriding-vendor-classes" class="headerlink" title="Overriding vendor classes"></a>Overriding vendor classes</h2><p><a href="https://downing.tech/posts/overriding-vendor-classes">https://downing.tech/posts/overriding-vendor-classes</a></p><p>포크를 생성하지 않으려면 composer.json에서 autoloading을 적절하게 구성할 수 있습니다. 또는 옵션으로 <a href="https://github.com/cweagans/composer-patches">cweagans&#x2F;composer-patches</a>와 함께 패치를 사용할 수도 있습니다.</p><h2 id="Accessing-private-properties-in-PHP"><a href="#Accessing-private-properties-in-PHP" class="headerlink" title="Accessing private properties in PHP"></a>Accessing private properties in PHP</h2><p><a href="https://www.lambda-out-loud.com/posts/accessing-private-properties-php/">https://www.lambda-out-loud.com/posts/accessing-private-properties-php/</a></p><p>Closure::bind를 통한 리플렉션 및 액세스 대신 객체를 배열로 캐스팅할 수 있습니다(하지만 그래야 할까요?).</p><h2 id="AllaertPatrick의-트윗"><a href="#AllaertPatrick의-트윗" class="headerlink" title="@AllaertPatrick의 트윗"></a>@AllaertPatrick의 트윗</h2><p><a href="https://twitter.com/AllaertPatrick/status/1478323931924860928">https://twitter.com/AllaertPatrick/status/1478323931924860928</a></p><p>때때로 코드에서 무슨 일이 일어나고 있는지 이해하기 위해 생성된 opcode를 살펴보는 것이 유용할 수 있습니다. <code>phpdbg -p* file.php</code> 명령이 도움이 될 것입니다.</p><p><img src="https://pbs.twimg.com/media/FIQONPpXIAMc8yd?format=jpg&name=small" alt="AllaertPatrick에서 공유된 이미지"></p><h1 id="Community"><a href="#Community" class="headerlink" title="Community"></a>Community</h1><h2 id="PHP-in-7-minutes"><a href="#PHP-in-7-minutes" class="headerlink" title="PHP in 7 minutes"></a>PHP in 7 minutes</h2><p><a href="https://www.youtube.com/watch?v=IfcFQxYPTxo">https://www.youtube.com/watch?v=IfcFQxYPTxo</a></p><p>Brent Roose의 영상.</p><blockquote><p>What kind of language is PHP in 2022? Find out in 7 minutes!</p></blockquote>]]></content>
    
    
      
      
        
        
    <summary type="html">&lt;p&gt;&lt;img src=&quot;https://blog.jetbrains.com/wp-content/uploads/2020/01/phpstorm-PHP_Annotated_blog_1600x800.png&quot; alt=&quot;Php_annotated</summary>
        
      
    
    
    
    
    <category term="PHP" scheme="https://haah.kr/tags/PHP/"/>
    
    <category term="php-annotated" scheme="https://haah.kr/tags/php-annotated/"/>
    
    <category term="php-annotated-monthly" scheme="https://haah.kr/tags/php-annotated-monthly/"/>
    
  </entry>
  
  <entry>
    <title>PHP Annotated — October 2021</title>
    <link href="https://haah.kr/2021/10/18/php-annotated-october-2021/"/>
    <id>https://haah.kr/2021/10/18/php-annotated-october-2021/</id>
    <published>2021-10-18T15:04:01.000Z</published>
    <updated>2026-05-31T19:29:57.263Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://blog.jetbrains.com/wp-content/uploads/2020/01/phpstorm-PHP_Annotated_blog_1600x800.png" alt="Php_annotated 이미지"></p><p><a href="https://blog.jetbrains.com/author/rpronskiy">Roman Pronskiy</a>가 쓰고 JetBrains에서 제공하는 PHP Annotated <a href="https://blog.jetbrains.com/phpstorm/2021/10/php-annotated-october-2021/">2021년 10월호</a>의 번역&#x2F;해석본입니다.</p><p>이 중에서 몇 가지 제 취향껏 골라 그 안의 내용도 좀 뒤져보고 개발새발 번역해서 소개합니다.</p><hr><p>PHP 8.1 RC3이 출시 되었습니다. 열거형(enumeration)을 사용하는 첫 패키지도 이미 사용할 수 있습니다.</p><p>Magento의 커뮤니티 포크가 발표되었습니다.</p><p>PSR 외에도 PER이라는 새로운 유형의 권장 사항이 있습니다.</p><p>Symfony 6은 가능한 모든 곳에 타입을 선언합니다. 업데이트 방법은 무엇입니까?</p><p>PHP 8.2에서는 최적화된 새로운 데이터 구조와 독립형(standalone) null 타입이 제안되었습니다.</p><p>실제로는 취약점이 아니긴 하지만, disable_functions과 관련된 PHP 취약점이 게시되었습니다.</p><h1 id="⚡️-News"><a href="#⚡️-News" class="headerlink" title="⚡️ News"></a>⚡️ News</h1><h2 id="PHP-8-1-RC-3"><a href="#PHP-8-1-RC-3" class="headerlink" title="PHP 8.1 RC 3"></a>PHP 8.1 RC 3</h2><p>세 번째 릴리스 후보가 <a href="https://wiki.php.net/todo/php81#timetable">예정대로</a> 발표되었습니다. PHP 8.1의 새로운 기능에 대한 개요는 <a href="https://stitcher.io/blog/new-in-php-81">What’s new in PHP 8.1</a> 그리고 <a href="https://stitcher.io/blog/php-81-before-and-after">PHP 8.1: before and after</a> 게시글을 참조하세요. 전체 변경 목록은 <a href="https://php.watch/versions/8.1">PHP.Watch</a>에서 확인할 수 있습니다.</p><p>이제 <a href="https://www.php.net/manual/en/migration81.php">PHP 8.1용 마이그레이션 가이드</a>도 나왔습니다.</p><p>Mac에서 <a href="https://nunomaduro.com/how-to-install-php-8-1-rc-on-mac/">homebrew를 통해</a> php:8.1-rc-cli와 같은 이미지를 <a href="https://hub.docker.com/_/php?tab=tags&name=8.1&page=1&ordering=last_updated">docker</a>로 시도해보거나 그냥 3v4l.org를 둘러볼 수도 있습니다.</p><p>열거형(enumeration)을 사용하는 첫 패키지도 이미 사용할 수 있습니다.<br><a href="https://github.com/alexanderpas/php-http-enum">alexanderpas&#x2F;php-http-enum</a>는 HTTP 응답 메시지의 상태 코드 및 텍스트가 포함된 열거형입니다.</p><h2 id="PHP-8-0-11-7-4-24-and-7-3-31"><a href="#PHP-8-0-11-7-4-24-and-7-3-31" class="headerlink" title="PHP 8.0.11, 7.4.24 and 7.3.31"></a>PHP 8.0.11, 7.4.24 and 7.3.31</h2><p><a href="https://www.php.net/ChangeLog-8.php#8.0.11">https://www.php.net/ChangeLog-8.php#8.0.11</a><br><a href="https://www.php.net/ChangeLog-7.php#7.4.24">https://www.php.net/ChangeLog-7.php#7.4.24</a><br><a href="https://www.php.net/ChangeLog-7.php#7.3.31">https://www.php.net/ChangeLog-7.php#7.3.31</a></p><p>보안 취약점 <a href="https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2021-21706">CVE-2021-21706</a> 수정을 지원하는 업데이트.</p><p>이 수정 사항은 ZipArchive::extractTo가 Windows에서 특정 파일 경로 이름으로 대상 디렉토리 외부에 zip 아카이브를 추출하게 하는 버그를 해결합니다.</p><h2 id="The-Future-of-Magento"><a href="#The-Future-of-Magento" class="headerlink" title="The Future of Magento"></a>The Future of Magento</h2><p><a href="https://www.mage-os.community/blog/the-future-of-magento">https://www.mage-os.community/blog/the-future-of-magento</a></p><p>Magento 커뮤니티 구성원의 이 편지는 커뮤니티 조직에서 운영하는 Magento 포크가 있을 것이라고 발표했습니다. 목표는 Magento의 장기적인 오픈 소스 수명을 보장하는 것입니다.</p><p>이전에 Adobe가 Magento를 마이크로서비스로 분해할 계획이라고 <a href="https://business.adobe.com/summit/2021/sessions/extending-magento-commerce-with-adobe-io-s604.html">발표했습니다</a>. 이것이 정확히 어떻게 일어날지는 불분명합니다. 이것이 포크가 생성되는 이유입니다. 후자가 열려 있는 한 Adobe의 Magento와 호환됩니다.</p><h2 id="PhpStorm-2021-3-Early-Access-Program-Is-Open"><a href="#PhpStorm-2021-3-Early-Access-Program-Is-Open" class="headerlink" title="PhpStorm 2021.3 Early Access Program Is Open"></a>PhpStorm 2021.3 Early Access Program Is Open</h2><p><a href="https://blog.jetbrains.com/phpstorm/2021/09/phpstorm-2021-3-early-access-program-is-open/">https://blog.jetbrains.com/phpstorm/2021/09/phpstorm-2021-3-early-access-program-is-open/</a></p><p>PhpStorm 2021.3 Early Access 프로그램이 한창 진행 중입니다. 매주 JetBrains에서는 공식 릴리스 전에 새로운 기능을 사용해 볼 수 있는 새로운 빌드를 게시합니다.</p><p>다가오는 주요 릴리스에는 PHP 8.1에 대한 완전한 지원, 제네릭에 대한 많은 개선 사항, 배포를 위한 새로운 옵션, 업데이트된 디버거 인터페이스 등이 포함될 것입니다.</p><h2 id="PER-Workflow-–-PHP-FIG"><a href="#PER-Workflow-–-PHP-FIG" class="headerlink" title="PER Workflow – PHP-FIG"></a>PER Workflow – PHP-FIG</h2><p><a href="https://www.php-fig.org/bylaws/per-workflow/">https://www.php-fig.org/bylaws/per-workflow/</a></p><p>PHP-FIG는 PHP Evolving Recommendations의 아이디어를 승인했습니다. PSR 표준 외에도 영구적으로 변경 및 보완할 수 있는 권장 사항인 PER이 있습니다.<br>예를 들어 코드 스타일의 경우 새로운 언어 기능을 반영하는 새로운 규칙을 추가할 수 있습니다.</p><h2 id="“Vulnerability”-not-in-PHP-to-bypass-disable-functions"><a href="#“Vulnerability”-not-in-PHP-to-bypass-disable-functions" class="headerlink" title="“Vulnerability” (not) in PHP to bypass disable_functions"></a>“Vulnerability” (not) in PHP to bypass disable_functions</h2><p>한 연구원이 최근 php.ini의 disable_functions 지시문에 의해 설정된 제약 조건을 우회하는 방법을 <a href="https://github.com/mm0r1/exploits/tree/master/php-filter-bypass">발표했습니다</a>.</p><p><a href="https://www.php.net/manual/en/ini.core.php#ini.disable-functions">disable_functions</a>를 사용하여 PHP 스크립트에서 특정 기능의 사용을 금지할 수 있습니다. 예를 들어 system, exec, proc_open 및 shell_exec가 외부 프로그램에 대한 호출을 차단하는 것을 금지할 수 있습니다.<br>(그건 그렇고, eval()은 함수가 아니라 언어 구조이기 때문에 금지할 수 없습니다.)</p><p>disable_functions는 보안 기능이 아니며 보안을 위해 그것에 의존하는 것은 나쁜 생각이기 때문에 우회 문제는 취약점이라고 할 수 없습니다.</p><p>이게 PHP의 보안 문제가 맞다고 하는 글에 Nikita Popov(aka nikic)가 <a href="https://www.reddit.com/r/PHP/comments/q2cvkb/yet_another_php_7080_disable_functions_bypass/hflmnfc/?context=3">reddit에 댓글을 남겼습니다</a>.<br>많은 스크립트 언어들처럼 PHP 구현이 임의의 공격자가 제어하는 코드를 안정적으로 샌드박싱하는 것이 주요 목표는 아니며, 보안 문제인지 여부는 위협 모델(threat model)에 따라 판단할 수 있는데 서버에 올라간 PHP 프로젝트에 관한 한 원격 공격자를 위협 모델로 상정한다고 합니다. 아래 내용에서 정확한 표현으로 확인하세요.</p><blockquote><p>Whether something is a security issue depends on your threat model. As far as the PHP upstream project is concerned, our threat model is a remote attacker. We consider the case where the attacker has ability to execute arbitrary PHP code on the server a lost cause.</p><p>Of course, for a shared hosting provider that does not use any OS-level separation between clients, this is a security issue. As far as the PHP project is concerned, this is a fundamentally insecure deployment method. You may use it at your own risk.</p><p>This is a matter of practicality, because the PHP implementation is very far removed from reliably sandboxing arbitrary attacker-controlled code. There are some languages that have this as a hard design constraint (the most important being JavaScript), but for other scripting languages this is not a primary goal (definitely not for PHP, and I would strongly suspect not for Python or Ruby either, though I’m not sure on that count).</p><p>If we wanted to move in that direction, the first step would be to promote all remaining engine notices&#x2F;warnings to exceptions, because there is a large class of interrupt vulnerabilities caused by them (to the point that addressing other issues would be somewhat “pointless” from a security perspective). One of my bigger regrets for PHP 8.0 is that we did not make undefined variables an exception.</p></blockquote><p>PHP에서 보안 문제로 간주되는 것과 그렇지 않은 것에 대해 자세히 알아보십시오: <a href="https://wiki.php.net/security">wiki.php.net&#x2F;security</a>.<br>이 문서에선 다음과 같은 문제가 보안 문제 버그로 분류됩니다.</p><ul><li>사용자가 승인되지 않은 작업을 실행할 수 있도록 허용하거나</li><li>보안 경계를 넘거나</li><li>액세스할 수 없는 데이터에 액세스하거나</li><li>시스템의 접근성 또는 성능에 심각한 영향을 미치는 경우</li></ul><p>그리고 문제를 더 자세히 이해하는 데 관심이 있다면 <a href="https://x-c3ll.github.io/posts/UAF-PHP-disable_functions/">disable_functions가 작동하는 방식</a>과 그렇게 악용하는 방식(메모리 손상을 통한 우회)에 대한 멋진 분석이 있습니다. 그리고 다른 하나는 <a href="https://x-c3ll.github.io//posts/find-bypass-disable_functions/">이러한 문제를 자동으로 검색</a>하는 방법을 설명합니다.</p><p>또한, 인기 있는 Laravel 프로젝트인 <a href="https://github.com/fiveai/Cachet">fiveai&#x2F;Cachet</a>에서 발견된 실제 RCE(Remote Code Execution) 취약점 분석을 확인하십시오: <a href="https://blog.sonarsource.com/cachet-code-execution-via-laravel-configuration-injection">Laravel Configuration Injection을 통한 코드 실행</a>.</p><h2 id="composer-x2F-composer-2-1-9"><a href="#composer-x2F-composer-2-1-9" class="headerlink" title="composer&#x2F;composer 2.1.9"></a>composer&#x2F;composer 2.1.9</h2><p><a href="https://github.com/composer/composer/releases/tag/2.1.9">https://github.com/composer/composer/releases/tag/2.1.9</a></p><p>이 업데이트는 Windows의 취약점을 수정합니다(CVE-2021-41116). Windows 사용자는 반드시 업데이트해야 합니다.</p><h2 id="PHPOpenDocs-com"><a href="#PHPOpenDocs-com" class="headerlink" title="PHPOpenDocs.com"></a>PHPOpenDocs.com</h2><p><a href="https://phpopendocs.com/about">https://phpopendocs.com/about</a></p><p>PHP 관련 콘텐츠를 위한 커뮤니티 사이트를 만드는 실험입니다.</p><p>PHP 버전별로 그룹화된 기여자 목록이 있는 유용한 <a href="https://phpopendocs.com/sponsoring">후원 페이지</a>와 PHP 코드 구조 및 PHP 코어에 기여를 시작하는 방법에 대한 리소스에 대한 많은 링크가 있는 <a href="https://phpopendocs.com/internals">Internals</a> 섹션이 이미 있습니다.</p><h1 id="🐘-PHP-Internals"><a href="#🐘-PHP-Internals" class="headerlink" title="🐘 PHP Internals"></a>🐘 PHP Internals</h1><h2 id="New-data-structures-in-PHP"><a href="#New-data-structures-in-PHP" class="headerlink" title="New data structures in PHP"></a>New data structures in PHP</h2><p>PHP는 list, 연관 배열, 큐, 스택 등으로 사용할 수 있는 범용 배열 데이터 구조를 가지고 있습니다.</p><p>이 다재다능함은 사실은 해시 테이블을 사용하여 달성됩니다. 그러나 이 다재다능함은 추가 메모리 사용량과 미묘한 성능 오버헤드를 대가로 합니다.</p><p>SPL(Standard PHP Library)은 보다 전문화된 데이터 구조를 가지고 있지만 그 자체로 무거운 감이 있습니다. </p><p>Tyson Andre는 PHP에 최적화된 새로운 데이터 구조를 추가할 것을 제안합니다.</p><p>이를 달성하기 위한 한 가지 옵션은 널리 사용되는 <a href="https://github.com/php-ds/ext-ds">php-ds&#x2F;ext-ds</a> 확장에서 구조를 추가하는 것이지만 작성자는 이 아이디어를 지지하지는 않습니다. <a href="https://github.com/php-ds/ext-ds/issues/156#issuecomment-926674138">GitHub의 이 스레드</a>는 토론의 세부 사항에 대한 정보를 제공합니다.</p><p>현재로서는 두 개의 RFC가 있습니다. 이러한 구조 및 기타 구조의 구현은 <a href="https://github.com/TysonAndre/pecl-teds">TysonAndre&#x2F;pecl-teds</a> 확장에서 사용할 수 있습니다.</p><h3 id="RFC-final-class-Vector"><a href="#RFC-final-class-Vector" class="headerlink" title="[RFC] final class Vector"></a>[RFC] final class Vector</h3><p><a href="https://wiki.php.net/rfc/vector">https://wiki.php.net/rfc/vector</a></p><p>벡터 구조 – 연속된 인덱스 0, 1, 2 등의 요소 집합입니다. 현재 배열보다 절반의 메모리가 필요하고 유사한 SPL 구조보다 빠르게 작동합니다.</p><p>API의 관점에서 보면, 이것은 ArrayAccess, IteratorAggregate 및 Countable 인터페이스를 가진 클래스입니다. RFC에는 아래와 같은 식의 final class를 추가하자는 내용이 나옵니다.</p><figure class="highlight php"><table><tr><td class="code"><pre><span class="line"><span class="keyword">final</span> <span class="class"><span class="keyword">class</span> <span class="title">Vector</span> <span class="keyword">implements</span> <span class="title">IteratorAggregate</span>, <span class="title">Countable</span>, <span class="title">JsonSerializable</span>, <span class="title">ArrayAccess</span></span></span><br><span class="line"><span class="class"></span>&#123;</span><br><span class="line">...</span><br></pre></td></tr></table></figure><p>ArrayAccess처럼 사용할 수도 있죠.</p><figure class="highlight php"><table><tr><td class="code"><pre><span class="line"><span class="variable">$values</span> = <span class="keyword">new</span> <span class="title class_">Vector</span>();</span><br><span class="line"><span class="keyword">for</span> (<span class="variable">$i</span> = <span class="number">0</span>; <span class="variable">$i</span> &lt; <span class="variable">$n</span>; <span class="variable">$i</span>++) &#123;</span><br><span class="line">    <span class="variable">$values</span>[] = <span class="variable">$i</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="RFC-final-class-Deque"><a href="#RFC-final-class-Deque" class="headerlink" title="[RFC] final class Deque"></a>[RFC] final class Deque</h3><p><a href="https://wiki.php.net/rfc/deque">https://wiki.php.net/rfc/deque</a></p><p>Deque는 양방향 큐(doubly-linked queue)입니다. 즉, 시작과 끝에서 요소를 추가 및 제거할 수 있습니다. SplQueueue 또는 SplDoublyLinkedList 대신 사용하면 성능 및 메모리 소비가 즉시 개선되는 것을 볼 수 있습니다.</p><p>Deque는 메모리 관리에 대한 알려진 문제로 인해 대형 어레이를 사용하는 장기 실행 애플리케이션에 사용하기에도 적절합니다.</p><h2 id="RFC-Allow-null-as-standalone-type"><a href="#RFC-Allow-null-as-standalone-type" class="headerlink" title="[RFC] Allow null as standalone type"></a>[RFC] Allow null as standalone type</h2><p><a href="https://wiki.php.net/rfc/null-standalone-type">https://wiki.php.net/rfc/null-standalone-type</a></p><p>George Peter Banyard는 타입 선언에서 null을 사용하는 기능을 추가할 것을 제안합니다.</p><p>첫째, 이것은 PHP의 타입 시스템의 완전성에 대한 누락된 부분입니다. mixed 타입과 never 타입이 추가됐고, union과 intersection이 있지만 <a href="https://en.wikipedia.org/wiki/Unit_type">unit 타입</a>은 누락되었습니다.</p><p>둘째, 이 타입은 타입 힌트에 대한 일부 엣지 케이스를 다루고 정적 분석을 개선합니다.<br>예를 들어 현재로서는 유사타입(pseudotype)인 false를 union에서 사용할 수 있지만 함수가 false|null을 반환하도록 지정할 수는 없으며 bool|null만 반환할 수 있습니다.</p><h2 id="How-opcache-works"><a href="#How-opcache-works" class="headerlink" title="How opcache works"></a>How opcache works</h2><p><a href="https://www.npopov.com/2021/10/13/How-opcache-works.html">https://www.npopov.com/2021/10/13/How-opcache-works.html</a></p><p>Nikita Popov는 항상 블로그 게시물을 작성하지는 않지만, 블로그 게시물을 작성할 때는 개념을 명확하고 자세하게 설명합니다.</p><h1 id="🛠-Tools"><a href="#🛠-Tools" class="headerlink" title="🛠 Tools"></a>🛠 Tools</h1><h2 id="Xdebug-3-1-0"><a href="#Xdebug-3-1-0" class="headerlink" title="Xdebug 3.1.0"></a>Xdebug 3.1.0</h2><p><a href="https://xdebug.org/announcements/2021-10-04">https://xdebug.org/announcements/2021-10-04</a></p><p>인기 있는 PHP 디버거가 업데이트되었습니다. PHP 8.1, 많은 수정 사항 및 약간의 사소한 기능에 대한 지원이 함께 제공됩니다. 이 확장 프로그램 개발자인 Derick Rethans의 <a href="https://www.youtube.com/playlist?list=PLg9Kjjye-m1g_eXpdaifUqLqALLqZqKd4">Xdebug 3에 대한 이 비디오 시리즈</a>를 놓치지 마십시오.</p><h2 id="spiral-x2F-roadrunner-2-4"><a href="#spiral-x2F-roadrunner-2-4" class="headerlink" title="spiral&#x2F;roadrunner 2.4"></a>spiral&#x2F;roadrunner 2.4</h2><p><a href="https://github.com/spiral/roadrunner">https://github.com/spiral/roadrunner</a></p><p>Golang으로 작성된 PHP 애플리케이션 서버의 대규모 업데이트입니다. 이 릴리스에는 대기열(queue), 키-값 저장소 및 Temporal(분산형 오케스트레이션 도구)과의 통합에 대한 지원이 포함됩니다. 더 자세히 보려면 <a href="https://spiralscout.com/blog/roadrunner-2-4-0">여기로</a>.</p><h2 id="brick-x2F-date-time"><a href="#brick-x2F-date-time" class="headerlink" title="brick&#x2F;date-time"></a>brick&#x2F;date-time</h2><p><a href="https://github.com/brick/date-time">https://github.com/brick/date-time</a></p><p>날짜 및 시간 작업을 위한 immutable 클래스 집합입니다.</p><h2 id="php-runtime-x2F-runtime"><a href="#php-runtime-x2F-runtime" class="headerlink" title="php-runtime&#x2F;runtime"></a>php-runtime&#x2F;runtime</h2><p><a href="https://github.com/php-runtime/runtime">https://github.com/php-runtime/runtime</a></p><p>Runtime 컴포넌트는 애플리케이션 부트스트랩 로직을 전역 상태와 분리하므로 PHP-FPM, ReactPHP, Swoole 등과 같은 환경에서 아무 변경 없이도 애플리케이션을 실행할 수 있습니다.</p><p>원래 Symfony의 구성 요소였으나, 이제는 GitHub에서 별도의 조직(organization)이 될 정도로 훌륭하다고 여겨집니다.</p><h2 id="rindow-x2F-rindow-neuralnetworks"><a href="#rindow-x2F-rindow-neuralnetworks" class="headerlink" title="rindow&#x2F;rindow-neuralnetworks"></a>rindow&#x2F;rindow-neuralnetworks</h2><p><a href="https://github.com/rindow/rindow-neuralnetworks">https://github.com/rindow/rindow-neuralnetworks</a></p><p><a href="https://keras.io/">Python Keras</a>를 기반으로 하는 신경망 교육 프레임워크입니다. 해당 <a href="https://rindow.github.io/neuralnetworks/index.html#hello-there">문서</a>에 따르면 GPU 지원은 실험 모드 및 Windows에서만 사용할 수 있습니다.</p><h2 id="piko-framework-x2F-router"><a href="#piko-framework-x2F-router" class="headerlink" title="piko-framework&#x2F;router"></a>piko-framework&#x2F;router</h2><p><a href="https://github.com/piko-framework/router">https://github.com/piko-framework/router</a></p><p>또 다른 PHP 라우터인 이 라우터는 <a href="https://en.wikipedia.org/wiki/Radix_tree">기수 트리(radix tree)</a>를 기반으로 하며 벤치마크에 따르면 Symfony 라우터보다 빠릅니다.</p><h2 id="nunomaduro-x2F-termwind"><a href="#nunomaduro-x2F-termwind" class="headerlink" title="nunomaduro&#x2F;termwind"></a>nunomaduro&#x2F;termwind</h2><p><a href="https://github.com/nunomaduro/termwind">https://github.com/nunomaduro/termwind</a></p><p>Tailwind CSS 스타일 구문으로 콘솔 프로그램의 출력 형식을 지정하기 위한 PHP 8+ 패키지입니다.</p><h2 id="icanhazstring-x2F-random-issue-picker"><a href="#icanhazstring-x2F-random-issue-picker" class="headerlink" title="icanhazstring&#x2F;random-issue-picker"></a>icanhazstring&#x2F;random-issue-picker</h2><p><a href="https://github.com/icanhazstring/random-issue-picker">https://github.com/icanhazstring/random-issue-picker</a></p><p>Hacktoberfest에 참여하고 싶지만 어디서부터 시작해야 할지 모르겠다면 GitHub 또는 GitLab에서 무작위 문제를 선택하는 도구가 있습니다.</p><h1 id="Symfony"><a href="#Symfony" class="headerlink" title="Symfony"></a>Symfony</h1><h2 id="Preparing-your-applications-and-bundles-for-Symfony-6"><a href="#Preparing-your-applications-and-bundles-for-Symfony-6" class="headerlink" title="Preparing your applications and bundles for Symfony 6"></a>Preparing your applications and bundles for Symfony 6</h2><p><a href="https://symfony.com/blog/preparing-your-apps-and-bundles-for-symfony-6">https://symfony.com/blog/preparing-your-apps-and-bundles-for-symfony-6</a></p><p>Symfony 5.4 및 6.0은 11월에 출시될 예정입니다. 차이점은 Symfony 5.4에는 더 이상 사용되지 않는 기능이 모두 포함되지만 Symfony 6.0에서는 모두 제거된다는 것입니다. 또한 Symfony 5.4 및 6.0 모두 가능한 경우 모든 메서드 속성, 인수 및 반환 값에 PHP 유형 선언이 추가됩니다.</p><p>Symfony 구성 요소를 사용하는 앱을 업데이트하는 방법을 알아보려면 Symfony Core 팀 구성원이 작성한 이 자세한 게시물을 확인하세요. <a href="https://wouterj.nl/2021/09/symfony-6-native-typing">Symfony 6: PHP 8 Native Types &amp; Why We Need YOU</a>.</p><h2 id="you-will-no-longer-need-flex-symfony-com"><a href="#you-will-no-longer-need-flex-symfony-com" class="headerlink" title="you will no longer need flex.symfony.com"></a>you will no longer need flex.symfony.com</h2><p><a href="https://symfony.com/blog/symfony-flex-is-going-serverless">https://symfony.com/blog/symfony-flex-is-going-serverless</a></p><p>Symfony Flex의 경우 더 이상 flex.symfony.com이 필요하지 않습니다. 모든 레시피는 이제 <a href="https://github.com/symfony/recipes/tree/flex/main">github.com&#x2F;symfony&#x2F;recipes</a>에 있습니다.</p><h2 id="A-week-of-Symfony-771-4-10-October-2021"><a href="#A-week-of-Symfony-771-4-10-October-2021" class="headerlink" title="A week of Symfony #771 (4-10 October 2021)"></a>A week of Symfony #771 (4-10 October 2021)</h2><p><a href="https://symfony.com/blog/a-week-of-symfony-771-4-10-october-2021">https://symfony.com/blog/a-week-of-symfony-771-4-10-october-2021</a></p><h1 id="Laravel"><a href="#Laravel" class="headerlink" title="Laravel"></a>Laravel</h1><h2 id="Working-with-fixture-data-in-your-tests"><a href="#Working-with-fixture-data-in-your-tests" class="headerlink" title="Working with fixture data in your tests."></a>Working with fixture data in your tests.</h2><p><a href="https://dyrynda.com.au/blog/working-with-test-fixtures">https://dyrynda.com.au/blog/working-with-test-fixtures</a></p><p>정적 테스트 <a href="https://en.wikipedia.org/wiki/Test_fixture#Software">fixture</a>를 다루는 방법을 이야기 합니다.</p><h2 id="Strategies-for-decreasing-the-number-of-queries-in-a-Laravel-app"><a href="#Strategies-for-decreasing-the-number-of-queries-in-a-Laravel-app" class="headerlink" title="Strategies for decreasing the number of queries in a Laravel app."></a>Strategies for decreasing the number of queries in a Laravel app.</h2><p><a href="https://freek.dev/2075-strategies-for-decreasing-the-number-of-queries-in-a-laravel-app">https://freek.dev/2075-strategies-for-decreasing-the-number-of-queries-in-a-laravel-app</a></p><p>Laravel 앱에서 쿼리 수를 줄이기 위한 전략을 소개합니다.</p><h2 id="📺-Laravel-Worldwide-Meetup-10"><a href="#📺-Laravel-Worldwide-Meetup-10" class="headerlink" title="📺 Laravel Worldwide Meetup #10:"></a>📺 Laravel Worldwide Meetup #10:</h2><p><a href="https://www.youtube.com/watch?v=2UyDBArGLDY&t=161s">A Little Bit of AWS Lambda</a>, and <a href="https://www.youtube.com/watch?v=2UyDBArGLDY&t=3211s">Pest to Perfection</a>.</p><h2 id="📺-Converting-a-PHPUnit-testsuite-to-Pest"><a href="#📺-Converting-a-PHPUnit-testsuite-to-Pest" class="headerlink" title="📺 Converting a PHPUnit testsuite to Pest"></a>📺 Converting a PHPUnit testsuite to Pest</h2><p><a href="https://www.youtube.com/watch?v=81-r9THrJhI">https://www.youtube.com/watch?v=81-r9THrJhI</a></p><h2 id="📺-Let’s-Build-an-Online-Store-–-A-nice-series-of-streams"><a href="#📺-Let’s-Build-an-Online-Store-–-A-nice-series-of-streams" class="headerlink" title="📺 Let’s Build an Online Store – A nice series of streams."></a>📺 Let’s Build an Online Store – A nice series of streams.</h2><p><a href="https://www.youtube.com/watch?v=-0C04evVV9A&list=PLKJBt7aeK3k8Ry6aNd4wUOvfXtlnQh5-O&index=1&t=5s">https://www.youtube.com/watch?v=-0C04evVV9A&amp;list=PLKJBt7aeK3k8Ry6aNd4wUOvfXtlnQh5-O&amp;index=1&amp;t=5s</a></p><h1 id="💡-기타-읽을-만한-글"><a href="#💡-기타-읽을-만한-글" class="headerlink" title="💡 기타 읽을 만한 글"></a>💡 기타 읽을 만한 글</h1><h2 id="The-Road-to-PHP-Static-Analysis"><a href="#The-Road-to-PHP-Static-Analysis" class="headerlink" title="The Road to PHP: Static Analysis"></a>The Road to PHP: Static Analysis</h2><p><a href="https://road-to-php.com/static">https://road-to-php.com/static</a></p><p>정적 분석에 대한 Brent Roose의 10일 뉴스레터입니다.</p><h2 id="Testing-tips-from-Matthias-Noback"><a href="#Testing-tips-from-Matthias-Noback" class="headerlink" title="Testing tips from Matthias Noback:"></a>Testing tips from Matthias Noback:</h2><h3 id="One-Class-One-Test"><a href="#One-Class-One-Test" class="headerlink" title="One Class, One Test?"></a>One Class, One Test?</h3><p><a href="https://matthiasnoback.nl/2021/09/quick-testing-tips-one-test-per-class/">https://matthiasnoback.nl/2021/09/quick-testing-tips-one-test-per-class/</a></p><p>테스트가 없던 시절로 돌아가는 건 싫고, 실행하기 쉬운 규칙을 만들어 생각없이 테스트를 추가하는 게 정말 도움이 되겠느냐는 글.</p><h3 id="Testing-Anything-Better-Than-Testing-Nothing"><a href="#Testing-Anything-Better-Than-Testing-Nothing" class="headerlink" title="Testing Anything; Better Than Testing Nothing?"></a>Testing Anything; Better Than Testing Nothing?</h3><p><a href="https://matthiasnoback.nl/2021/09/testing-anything-better-than-testing-nothing/">https://matthiasnoback.nl/2021/09/testing-anything-better-than-testing-nothing/</a></p><p>없는 것보다는 나으니 아무거나 테스트하려는 사람들을 말리며, 테스트를 작성하지 말고 좋은 테스트를 작성하라고 합니다. 그렇게 하는 동안 테스트 작성이 재미있고 쉽고 효과적인지 확인하라고 하네요. 켄트백은 “테스트는 두려움을 지루함으로 변화시켜주는 프로그래머의 돌이다.”라고 했는데 말이죠…</p><p>어쨌든 이를 위해 다음에 투자해야 한다고 합니다.</p><ul><li>특정 테스트를 매우 빠르게 실행하는 데 도움이 되는 테스트 도구</li><li>빠른 결과를 제공하는 테스트</li><li>다른 데이터가 제공될 때 코드가 어떻게 동작하는지 보여주기 위해 더 많은 테스트 케이스를 추가하는 것은 정말 저렴해야 합니다.</li></ul><p>이런 게 “클래스 하나에 테스트 하나” 규칙이나 request 날리고 DB 확인하는 테스트(make-request-then-look-in-DB)보다는 나을 거라고 합니다.</p><h3 id="Write-Unit-Tests-Like-Scenarios"><a href="#Write-Unit-Tests-Like-Scenarios" class="headerlink" title="Write Unit Tests Like Scenarios"></a>Write Unit Tests Like Scenarios</h3><p><a href="https://matthiasnoback.nl/2021/09/write-unit-tests-like-scenarios/">https://matthiasnoback.nl/2021/09/write-unit-tests-like-scenarios/</a></p><p>읽기 좋은 테스트를 위해 시나리오를 작성하듯 코드를 작성하라는 조언입니다.<br>예시로 저자는 Give&#x2F;When&#x2F;Then 스타일로 작성합니다. naming 규칙에도 신경써야 하며 더 높은 추상화 수준에서 “왜”에 집중하며(해당 동작의 이유) 테스트를 작성하길 원합니다.</p><h2 id="What-happens-when-we-clone-objects"><a href="#What-happens-when-we-clone-objects" class="headerlink" title="What happens when we clone objects?"></a>What happens when we clone objects?</h2><p><a href="https://doeken.org/blog/what-happens-when-we-clone">https://doeken.org/blog/what-happens-when-we-clone</a></p><p>clone을 사용하면 어떤 일이 벌어질까?</p><h2 id="Either-data-structure"><a href="#Either-data-structure" class="headerlink" title="Either data structure."></a><code>Either</code> data structure.</h2><p><a href="https://marcosh.github.io/post/2021/09/24/either-why-or-how.html">https://marcosh.github.io/post/2021/09/24/either-why-or-how.html</a></p><p>Either 단일 데이터 유형&#x2F;클래스에서 무언가가 두 가지 중 하나일 수 있다는 사실을 설명할 수 있는 데이터 구조입니다.<br>이를 구현하는 예제를 Haskell과 PHP로 구현합니다.</p><h2 id="creating-an-Option-type-in-PHP"><a href="#creating-an-Option-type-in-PHP" class="headerlink" title="creating an Option type in PHP"></a>creating an <code>Option</code> type in PHP</h2><p><a href="https://ryangjchandler.co.uk/posts/creating-an-option-type-in-php">https://ryangjchandler.co.uk/posts/creating-an-option-type-in-php</a></p><p>PHP에 Option 추가하기.</p><p>null이나 nil 개념이 없는 Rust의 Option에서 아이디어를 얻어 Option type을 만드는 과정을 보여줍니다. PHP 8.0 이상.</p><p>Generic 지원은 PHPStan의 지원을 받습니다.</p><p>현재 PHP의 enum으로는 구현이 완벽하진 않고, <a href="https://wiki.php.net/rfc/tagged_unions">RFC: Tagged Unions</a>가 도입된다면 좀 더 Rust의 Option에 가까운 구현을 할 수 있다고 합니다…만, PHP 8.1을 목표로 한 RFC는 이 글을 번역하는 시점에 Draft 상태로 남아있습니다. </p><h2 id="The-€13-000-Video-Course-Launch-That-Made-Me-Believe-In-Myself-Again"><a href="#The-€13-000-Video-Course-Launch-That-Made-Me-Believe-In-Myself-Again" class="headerlink" title="The €13.000 Video Course Launch That Made Me Believe In Myself Again"></a>The €13.000 Video Course Launch That Made Me Believe In Myself Again</h2><p><a href="https://christoph-rumpel.com/2021/9/the-video-course-launch-that-made-me-belive-in-myself-again">https://christoph-rumpel.com/2021/9/the-video-course-launch-that-made-me-belive-in-myself-again</a></p><p>Christoph Rumpel이 어떻게 <a href="https://masteringphpstorm.com/">masteringphpstorm.com</a> 코스를 시작했는지에 대한 몇 가지 세부 정보를 공유합니다.</p><h2 id="Generative-art-with-PHP"><a href="#Generative-art-with-PHP" class="headerlink" title="Generative art with PHP"></a>Generative art with PHP</h2><p><a href="https://www.binarymoon.co.uk/2021/09/creating-generative-art-with-php/">https://www.binarymoon.co.uk/2021/09/creating-generative-art-with-php/</a></p><p>Ben Gillbanks는 코드를 사용하여 간단한 아바타에서 픽셀 아트 도시에 이르기까지 이미지를 만드는 방법을 설명합니다.</p><p><img src="https://habrastorage.org/webt/gz/6o/zi/gz6ozixdzmffmpttyvekxb1qrnk.png" alt="픽셀 아트 도시 이미지"></p><h2 id="A-game-on-FFI-quasilyte-x2F-kphp-game"><a href="#A-game-on-FFI-quasilyte-x2F-kphp-game" class="headerlink" title="A game on FFI: quasilyte&#x2F;kphp-game"></a>A game on FFI: quasilyte&#x2F;kphp-game</h2><p><a href="https://github.com/quasilyte/kphp-game">https://github.com/quasilyte/kphp-game</a></p><p><a href="https://github.com/VKCOM/kphp">KPHP</a>는 PHP 컴파일러입니다. PHP의 제한된 하위 집합을 PHP보다 빠르게 실행되는 기본 바이너리로 컴파일합니다.</p><p>KPHP 팀의 사람들은 FFI에 대한 실험적 지원을 구현하고 데모로 FFI를 사용하여 작은 게임을 만들었습니다.</p><p>놀랍게도 KPHP-FFI는 기존 PHP의 FFI와 호환되므로 일반 PHP 7.4 이상에서도 게임을 실행할 수 있습니다.</p><p>이 <a href="https://thephp.website/en/issue/php-ffi/">PHP의 FFI에 대한 완전한 가이드(Complete guide to FFI in PHP)</a>에서 다른 FFI 응용 프로그램에 대해 자세히 읽어보십시오.</p>]]></content>
    
    
      
      
        
        
    <summary type="html">&lt;p&gt;&lt;img src=&quot;https://blog.jetbrains.com/wp-content/uploads/2020/01/phpstorm-PHP_Annotated_blog_1600x800.png&quot; alt=&quot;Php_annotated</summary>
        
      
    
    
    
    
    <category term="PHP" scheme="https://haah.kr/tags/PHP/"/>
    
    <category term="php-annotated" scheme="https://haah.kr/tags/php-annotated/"/>
    
    <category term="php-annotated-monthly" scheme="https://haah.kr/tags/php-annotated-monthly/"/>
    
  </entry>
  
</feed>
