분류 php

PHP는 $CURRENT_YEAR에 학습/사용할 가치가 있습니다.

컨텐츠 정보

  • 조회 348 (작성일 )

본문

PHP는 죽어가는 언어입니까? $CURRENT_YEAR에 PHP를 배우고/하거나 다음 앱을 빌드하는 데 사용해야 합니까? 이 게시물이 끝날 때까지 이러한 질문 등에 대한 답변을 얻으실 수 있기를 바랍니다.

언어에 대한 또 다른 일반적인 개요나 사람들이 말하는 것이 틀렸다는 점에 대한 논박이 아니라, 이 포스트가 무엇보다도 PHP에 대한 ✨좋은 점의 포괄적인 목록이 되었으면 합니다. ✨ (또는 적어도 내가 좋다고 생각하는 것들).


여기까지 온 방법 


PHP에 대한 선입견이 있다면 PHP 4 및 PHP 5일 동안 PHP를 둘러싼 담론이 어떠했는지에 따라 크게 달라질 것입니다. 이것은 Ruby on Rails 및 Node.js와 같은 멋진 새 프로젝트와 대조적으로 PHP가 점점 더 "레거시" 플랫폼으로 간주되는 시대였으며, 일반적인 통념은 PHP가 단순히 "나쁜" 언어이거나 적어도 하나의 언어라는 것이었습니다. 많은 사람들이 나쁜 코드를 작성하고 있었습니다.


PHP 7이 PHP의 큰 발전이라고 들었을 수도 있지만 이것은 사실입니다. PHP가 오늘날의 위치에 도달한 방법에 대한 이야기는 대부분 점진적인 개선 사항 중 하나이지만 많은 사람들은 2015년 PHP 7 릴리스가 "현대적인" PHP 시대의 시작이었다는 데 동의할 것입니다. PHP 7 포함:


  • 극적인 성능 향상
  • 크게 확장된 유형 시스템(스칼라 유형 및 반환 유형)
  • 익명 클래스
  • 널 병합 연산자(??)
  • 우주선 연산자(<=>)
  • 유니코드 코드포인트 이스케이프 구문(echo "\ u {2764}"; → ❤️)
  • 내장 CSPRNG API

오늘날 PHP 코드의 모습 


지난 몇 년 동안 PHP는 이 게시물과 같은 예제가 잘 보여주듯이 훨씬 더 인체공학적인 언어가 되었습니다. PHP가 수년에 걸쳐 얻은 가장 중요한 기능 중 일부는 다른 언어에서 인식할 수도 있고 인식하지 못할 수도 있습니다.


null 병합 연산자 


// equivalent to:
// $username = isset($_GET['user']) ? $_GET['user'] : 'anonymous';

$username = $_GET['user'] ?? 'anonymous';


nullsafe 연산자 


// equivalent to:
// $dateTime = $event->getDateTime();
// $timestamp = $dateTime ? $dateTime->getTimestamp() : null;

$timestamp = $event->getDateTime()?->getTimestamp();


생성자 속성 프로모션 


class WidgetManager
{
    public function __construct(
        public LoggerInterface $logger
    ) {}
}


이 코드는 다음과 같습니다.


class WidgetManager
{
    public LoggerInterface $logger;

    public function __construct(
        LoggerInterface $logger
    ) {
        $this->logger = $logger;
    }
}


일치 표현식 


$error = match ($code) {
    0 => null,
    1 => new SomeError(),
    2, 3, 4 => new OtherError(),
    default => new UnknownError(),
}


명명된 인수 


function testFunction(
    string $first,
    string $second,
    ?string $third = null,
    ?string $fourth = null
) { /* … */ }

testFunction(
    second: 'second value',
    first: 'first value',
    fourth: 'fourth value',
);


Arrow functions 


$collection = new ArrayCollection([1, 2, 3]);
$incremented = $collection->map(fn (int $i) => $i + 1);
// $incremented is [2, 3, 4]


Attributes 


#[Route('/greetings')]
class GreetingController
{
    #[Route('/hello')]
    public function hello(): string
    {
        return 'hello';
    }
}


The spaceship operator 


우주선 연산자는 약간 난해합니다(그리고 코드를 읽는 사람들이 조회하지 않고도 코드가 무엇을 하는지 알 수 있다는 확신에 따라 약간 논란이 될 수 있음). 그러나 매우 유용한 한 가지는 명확하고 간결한 비교를 작성하는 것입니다. /정렬 함수.


echo 1 <=> 1; // 0
echo 1 <=> 2; // -1
echo 2 <=> 1; // 1

echo "a" <=> "a"; // 0
echo "a" <=> "b"; // -1
echo "b" <=> "a"; // 1


The spread operator 


$first = ['a' => 1, 'b' => 2];
$second = ['c' => 3, 'd' => 4];

$merged = [...$first, ...$second];

// $merged is ['a' => 1, 'b' => 2, 'c' => 3, 'd' => 4]


The numeric literal separator 


$withoutSeparators = 1000000000;
$withSeparators = 1_000_000_000;

echo $withoutSeparators === $withSeparators; // true


Array destructuring 


$list = [1, 2]
[$first, $second] = $list

// $first is 1, $second is 2

$array = [
    'a' => 1,
    'b' => 2
];

['a' => $a, 'b' => $b] = $array;

// $a is 1, $b is 2


PHP's Type System 


가장 엄격한 유형 시스템은 아니지만(TypeScript와 마찬가지로 완전히 선택 사항인 것은 말할 것도 없음) 현대 PHP에는 인터페이스, 스칼라 및 객체 유형, nullable 유형, 공용체 및 교차 유형과 같은 기능을 포함하는 강력한 유형 시스템이 있습니다. 더.


코드는 말보다 더 큰 소리로 말하므로 다음은 PHP 8.1의 유형 시스템을 최대한 활용하는 코드의 예입니다.


<?php

declare(strict_types=1);

class MyClass
{
    public \DateTimeInterface $dateTime = new \DateTime();

    public function __construct(
        public readonly LoggerInterface $logger
    ) {}

    public function useUnionTypes(int|string $input): void
    {
        // $input is guaranteed to be either an int or a string
    }

    public function useIntersectionTypes(Traversable&Countable $input): void
    {
        // $input is guaranteed to satisfy the constraints
        // of both `Traversable` AND `Countable`
    }
}


Package Management 


Composer는 현대 PHP를 위한 사실상의 표준 패키지 관리자이며 약 10년 동안 사용되었습니다. JavaScript용 npm과 같은 다른 인기 있는 패키지 관리자에서 크게 영감을 얻었으므로 다른 언어로 최신 패키지 관리자를 사용한 적이 있다면 Composer와 함께 집처럼 편안하게 느낄 수 있습니다.


Packagist는 Composer의 주요 공개 패키지 저장소입니다. npm과 마찬가지로 Packagist를 사용하여 합리적인 월 사용료로 개인 패키지를 호스팅할 수도 있습니다.


Composer와 npm의 주요 차이점은 기술적인 차이가 아니라 실제로 문화의 하나라고 생각합니다. PHP 커뮤니티는 일반적으로 JavaScript 커뮤니티가 선호하는 마이크로패키지를 선호하지 않으므로 좋든 나쁘든 평균입니다. PHP 프로젝트는 수백 개의 작은 종속성보다 수십 개의 더 큰 종속성을 가질 가능성이 더 큽니다.


Frameworks 


현재 PHP 환경은 두 개의 웹 애플리케이션 프레임워크인 LaravelSymfony가 지배하고 있습니다. 이들 간의 차이점과 유사점에 대한 자세한 분석은 이 게시물의 범위를 벗어나지만, 둘 다 강력하고 빠르며 유지 관리 가능한 웹 애플리케이션을 더 쉽게 작성하는 동시에 가능한 한 상용구 코드를 작성해야 합니다.


프레임워크가 PHP로 수행하려는 작업에 대해 "과도한" 작업이 될 수 있다고 우려하는 경우 Symfony가 기본 제공되는 마이크로프레임워크라는 소식을 듣게 되어 기쁩니다(코어 프레임워크 외부의 모든 구성 요소는 100% 선택 사항임). , 그리고 Laravel에는 Lumen이라는 마이크로프레임워크 변형도 있습니다.


이러한 프레임워크 중 하나로 작성된 일반적인 최신 PHP 코드는 다음과 같습니다.


<?php

namespace App\Controller;

use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;

class ExampleController
{
    // the RandomNumberGenerator is automatically
    // injected by a service container

    public function __construct(
        private RandomNumberGenerator $randomNumberGenerator
    ) {}

    #[Route('/number')]
    public function number(): Response
    {
        $number = $this->randomNumberGenerator->generate(min: 1, max: 100)

        return new Response(
            "<html><body>Your lucky number is: $number</body></html>"
        );
    }
}


The Open-Source Ecosystem 


PHP는 믿을 수 없을 정도로 강력한 오픈 소스 생태계를 가지고 있으며 솔직히 말해서 훨씬 더 "존경받는" 언어도 부러워할 수 있습니다.


일반 PHP 애플리케이션이 필요로 하는 거의 모든 것에 사용할 수 있는 고품질의 잘 관리된 오픈 소스 라이브러리가 있으며, 생태계에서 가장 인기 있는 패키지 중 상당수는 개별 유지 관리자가 아닌 기존 공급업체 또는 프로젝트에서 유지 관리합니다. 물론 그것도 많다.


어쨌든 다음은 PHP 생태계에서 가장 중요한 패키지 중 일부에 대한 매우 표면적인 개요입니다.


`symfony/*` - 매우 인기 있는 PHP 패키지 세트이자 Symfony 프레임워크의 기반인 Symfony 구성 요소 

`League/*` - PHP 생태계 개선이라는 명시적 사명으로 개발된 최신 표준 호환 PHP 패키지 세트인 League of Extraordinary Packages 

`Doctrine/*` - Doctrine Project의 패키지로, 주로 데이터베이스 작업과 관련된 것은 아닙니다.

`phpoffice/*` - PHPOffice 프로젝트의 패키지, Microsoft Office 및 기타 Office 제품군에서 생성된 파일 형식 작업을 위한 라이브러리 세트

`guzzlehttp/guzzle` - PSR-7 기반 HTTP 클라이언트 라이브러리

`monolog/monolog` - PSR-3 기반의 매우 널리 사용되는 로깅 라이브러리

`phpunit/phpunit` - xUnit 아키텍처를 기반으로 하는 사실상의 표준 PHP 테스트 프레임워크

`pestphp/pest` - PHPUnit 위에 구축된 현대적인 테스트 프레임워크

`nesbot/carbon` - PHP DateTime API의 확장

`phpstan/phpstan` - 여러 활성 프로젝트 중 가장 인기 있는 정적 분석 도구

`twig/twig` - Python의 Jinja 템플릿 엔진에서 영감을 받은 최신 템플릿 엔진


PHP-FIG 


PHP-FIG("PHP Framework Interop Group"의 줄임말)는 PHP 커뮤니티의 영향력 있는 프로젝트 그룹으로, 모든 프로젝트가 자체적으로 수행하는 여러 작업을 표준화하여 PHP를 발전시키기 위해 노력하고 있습니다.


불행히도, PHP 생태계에서 가장 영향력 있는 프로젝트는 거의 모두 한때 PHP-FIG의 멤버였지만, 많은 사람들이 그 프로젝트가 작업보다는 "위원회별 프레임워크"를 구축하는 방향으로 향하고 있다는 우려를 남겼습니다. 모든 사람이 실제로 구현할 수 있는 비교적 간단한 표준에서. 어떤 것들은 절대 변하지 않는 것 같아요.

그렇긴 하지만 PHP-FIG는 솔직히 꽤 독특한 프로젝트이기 때문에 다른 곳에서 시도한 것을 본 적이 없고 여전히 믿을 수 없을 정도로 유용한 PSR을 많이 생산했기 때문에 이 포스트에 들어갈 가치가 있습니다. (PHP 표준 권장 사항). 여기에는 다음이 포함됩니다.

  • 자동 로딩 표준(PSR-4)
  • 공통 앱/프레임워크 구성 요소용 인터페이스(PSR-3, PSR-6, PSR-11, PSR-14, PSR-16)
  • HTTP 요청/응답 개체 및 이를 처리하는 코드에 대한 표준(PSR-7, PSR-18)
  • 스타일 가이드(PSR-1, PSR-12)

No Compiling/Transpiling 


많은 비교 가능한 언어와 비교하여 PHP에 대해 새롭게 알게 될 한 가지는 빌드 단계가 필요하지 않다는 것입니다(적어도 생각해야 하는 단계는 아님). 실제로 PHP의 일반적인 실행 모델(나중에 자세히 설명)로 인해 빌드 단계가 없을 뿐만 아니라 코드를 변경할 때 웹 서버를 다시 시작할 필요도 없습니다. 저장을 누르고 요청을 다시 보내고 방금 저장한 코드에서 응답을 받습니다.


(어쨌든 나에게) 이것의 주요 이점 중 하나는 Composer를 통해 패키지를 설치할 때 게시하기 전에 컴파일된 아티팩트나 일부 빌드 도구에 의해 망가진 코드가 아니라 패키지의 소스 코드를 단순히 다운로드한다는 것입니다. 이것이 의미하는 바는 예를 들어 타사 패키지에서 제공하는 기능을 클릭할 때마다 형식 지정, 주석 등의 실제 소스 코드를 보게 된다는 것입니다.


PHP is Fast 


프로그래밍 언어 간에 성능 비교를 하는 것은 어렵지만, 어쨌든 언어 런타임 성능에 대해서는 크게 걱정하지 않아도 됩니다. 현대 PHP는 합성 벤치마크에서 Ruby와 같은 "느린" 언어를 쉽게 능가하며 매우 빠르기 때문에 지적할 가치가 있습니다.


무엇보다도 이것은 PHP 8에 도입된 JIT 컴파일러와 같은 완전히 새로운 기능을 추가하는 것을 포함하여 PHP 팀이 수년에 걸쳐 성능을 개선하기 위해 많은 노력을 기울인 덕분입니다.


PHP 고유 실행 모델의 기복 


사람들이 PHP가 "서버리스가 존재하기 전에 서버리스를 수행하고 있다"고 말하는 것을 들었을 것입니다. 이것은 일종의 사실입니다.


사람들이 PHP를 작성하는 데 사용하는 방식은 각 파일이 페이지 또는 경로(예: 홈페이지의 경우 index.php, 다른 페이지의 경우 item.php 등)에 해당하는 많은 PHP 파일을 갖고 일부 HTML을 출력하는 것이었습니다. . 그런 다음 그들은 이 코드를 서버에 업로드했습니다. 공유 호스팅 제공업체에서 개발자가 해야 할 일은 파일을 서버까지 FTP로 전송하는 것뿐이었습니다. 그러면 제대로 작동했습니다. 웹 서버는 요청에 대한 PHP 프로세스를 시작하고 경로를 기반으로 올바른 스크립트를 제공하는 것과 같이 코드 외부의 모든 부분을 처리합니다.


인터넷에는 여전히 이런 방식으로 작동하는 사이트가 많이 있으며 PHP는 이후 이 접근 방식의 일부를 지나 발전했지만 파일 시스템 기반 라우팅 및 서버리스 기능.


오늘날 가장 관련성이 높은 부분은 모든 요청에 ​​대해 앱이 초기화되고 삭제된다는 아이디어입니다. 설정한 모든 변수, 앱의 개체에 수행하는 모든 작업, 요청이 끝나면 모든 것이 지워집니다. 데이터베이스와 같은 일종의 외부 리소스에 의존하지 않고 요청 간에 데이터를 유지할 수 있는 방법은 없습니다.


이 설정에는 자연스럽게 몇 가지 단점이 있습니다. 그 중 가장 중요한 것은 일부 데이터를 메모리에 넣어 잠시 동안 유지하는 것이 Node.js와 같은 것보다 PHP에서 덜 간단하다는 것입니다. 반면에 이 설정은 응용 프로그램 수준에서 전체 버그 클래스를 불가능하게 만들고(의미 있는 메모리 누수와 같은), 아마도 더 중요한 것은 다른 언어만큼 비동기 코드를 작성하는 것에 대해 걱정할 필요가 없다는 것을 의미합니다. 어쨌든 프로세스당 하나의 요청만 처리하게 됩니다.


예를 들어 HTTP 요청을 만드는 것은 HTTP 클라이언트에 대한 차단 호출을 작성하는 것만큼 간단합니다.


use Symfony\Component\HttpClient\HttpClient;

$client = HttpClient::create();
$response = $client->request('GET', 'https://example.com');

$statusCode = $response->getStatusCode();
$content = $response->getContent();


대부분의 다른 언어에서 이와 같은 코드는 HttpClient::request()에 대한 호출이 완료될 때까지 기다리는 동안 런타임이 다른 요청을 처리하지 못하도록 차단하기 때문에 큰 문제가 되지 않습니다. 그러나 PHP에서는 "자신에 대한" 프로세스가 언어에 내장되어 있기 때문에 이와 같은 차단 코드를 안전하게 작성할 수 있으며 비동기 코드가 때때로 수반할 수 있는 정신적 오버헤드를 피할 수 있습니다.


최근 몇 년 동안 PHP에서 비동기 코드를 실행 가능하게 하려는 노력이 있었고 Amp와 같은 프레임워크가 이 영역에서 상당한 진전을 이루었다는 점을 언급하면서 이 섹션을 마무리해야 할 것입니다. 즉, 대다수의 PHP 코드는 여전히 동기식이며 가까운 장래에 있을 것입니다.


결론 


PHP가 레거시 언어라는 마음가짐으로 이 게시물에 왔다면 제정신이 아닌 사람이 오늘 코드를 작성하고 싶어하지 않을 것입니다.


물론 PHP는 여전히 사마귀의 몫을 가지고 있지만 무엇보다도 이 게시물을 통해 전달하고 싶은 것은 PHP로 귀하 및/또는 귀하의 팀이 될 수 있는 안정적이고 깨끗하며 유지 관리 가능한 코드를 작성하는 것이 절대적으로 가능하다는 것입니다. 로 행복한. 뿐만 아니라 PHP에는 익숙한 다른 언어에서 작동하는 방식보다 선호할 수 있는 부분이 있습니다.


출처 : https://bulletproofphp.dev/yes-php-is-worth-using