이 PHP는 템플릿 엔진이야 너무 신중해 (중편)

12144 단어 PHP

이 보도에 관하여


다들 여기까지 왔나?이 글은 이 PHP는 템플릿 엔진이야 너무 신중해 (전편)의 후속 내용입니다. 먼저 읽고 가능하면 실제로 준비해 주십시오.
후편은 단숨에 쓰고 싶었는데 지난번 밤을 새워 썼기 때문에 오늘 너무 졸려서 "Psalm의 계속", "형선언", "Phan"을 쓰면 잤어요.

Psalm/Psalter(마지막 계속)


그러면 Psalter는 Psalm에 첨부된 수정 도구입니다../vendor/bin/psalter --issues=all가 실행되면 프로젝트 내의 파일이 개작됩니다.
Psalter뿐만 아니라 앞으로 소스 코드를 자동으로 바꾸는 도구도 있으니 실행하기 전에 Giit로 제출하세요.
diff --git a/src/Hello.php b/src/Hello.php
index 4b825af..5a0aced 100644
--- a/src/Hello.php
+++ b/src/Hello.php
@@ -4,7 +4,7 @@ namespace Bag2\Hello;

 final class Hello
 {
-    public function to($name)
+    public function to($name): string
     {
         return "Hello, {$name}!";
     }
이 코드를 봤는데 return "Hello, {$name}!"라고 쓰여 있어서 이 Hello::to()는 절대 문자열을 되돌려야 한다는 것을 알았어요.따라서 부족한 반환값을 부가하는 유형 성명: string은 확실히 안전하다.그럼 매개 변수에 형 선언string $name을 덧붙이는 게 어때요?이 조작은 실제로는 그다지 안전하지 않다.
다음 테스트를 시도해 보세요.
diff --git a/tests/HelloTest.php b/tests/HelloTest.php
index a1e489f..fb9baa9 100644
--- a/tests/HelloTest.php
+++ b/tests/HelloTest.php
@@ -12,5 +12,9 @@ final class HelloTest extends TestCase

         $this->assertSame('Hello, World!', $subject->to('World'));
         $this->assertSame('Hello, Miku!', $subject->to('Miku'));
+        $this->assertSame('Hello, 1!', $subject->to(1));
+        $this->assertSame('Hello, 1.0!', $subject->to(1.0));
+        $this->assertSame('Hello, true!', $subject->to(true));
+        $this->assertSame('Hello, Array!', $subject->to([]));
     }
 }
이 예는 매우 난잡하여 아무렇게나 많이 썼다.
따라서 PHPUnit을 실행하려고 하면 당연히 실패할 것이다.

이 오류 출력에서 읽은 것은 $subject->to(1.0) === 'Hello, 1.0!' 이고, 결과는 'Hello, 1!' 이다.배열 결단 순서를 바꾸면 다음과 같은 출력도 확인할 수 있다.

진위값true을 문자열로 묻으면 1.
여기서 우리는 어쩔 수 없이 결정을 내렸다.bool(true)string("true")로 바꾸거나 float(1.0)string("1.0")로 바꾸는 처리를 추가로 "Hello, {$name}!"에 삽입할 필요가 있습니까?
물론 유용한 자리도 있다. "영어로 인사하면 기운이 난다!"이 반의 책임에 대해 말하자면, 임의의 유형을 문자열로 바꾸는 기능은 불필요하다.그러니 우리는 그것을 제거하자string $name.Hello::to() 방법은 추가string $name의 유형 성명을 통해'파라미터가 숫자라면...','파라미터가 수조라면...','파라미터가 대상이라면...'의 가능성을 버리고'$name이 문자열'이라는 전제로 작성할 수 있다.이것은 자동 수정이 아니라 인류 스스로 결정하는 것이다.
그래서 틀을 만들어 보세요.
diff --git a/src/Hello.php b/src/Hello.php
index 5a0aced..4caeb43 100644
--- a/src/Hello.php
+++ b/src/Hello.php
@@ -1,10 +1,12 @@
 <?php

+declare(strict_types=1);
+
 namespace Bag2\Hello;

 final class Hello
 {
-    public function to($name): string
+    public function to(string $name): string
     {
         return "Hello, {$name}!";
     }
PHP7에 declare(strict_types=1);를 설치한 후'강형'이 적용됩니다.이 상태에서 오류 유형의 값을 매개 변수에 맡기면 TypeError 발생합니다.예상치 못한 상태에서 활동을 이어가는 것을 막을 수 있다는 것이다.
여기서 주의해야 할 것은'declare(strict_types=1);는 파일 단위로 작용한다','방법(함수)형 선언의 유형의 강약은 호출자의 설정에 달려 있다'는 것이다.
어떻게 된 거야?방금Hello::to() 방법에 숫자를 넘기는 테스트가 남았으니 PHPUnit으로 이동해 확인해보자.int(1) 다시 배열하여 실행하여 맨 위에 이르게 한다.
diff --git a/tests/HelloTest.php b/tests/HelloTest.php
index a1e489f..875388d 100644
--- a/tests/HelloTest.php
+++ b/tests/HelloTest.php
@@ -12,5 +12,9 @@ final class HelloTest extends TestCase

         $this->assertSame('Hello, World!', $subject->to('World'));
         $this->assertSame('Hello, Miku!', $subject->to('Miku'));
+        $this->assertSame('Hello, 1!', $subject->to(1));
+        $this->assertSame('Hello, 1.0!', $subject->to(1.0));
+        $this->assertSame('Hello, true!', $subject->to(true));
+        $this->assertSame('Hello, Array!', $subject->to([]));
     }
 }
어떻게 될까요?

이 줄의 결단 실패 보고서$this->assertSame('Hello, 1!', $subject->to(1))는 이미 통과되었다.강형은 효과가 없다는 얘기다.강한 모델을 효과적으로 하려면 방법의 호출자도 설정해야 한다declare(strict_types=1);.
diff --git a/tests/HelloTest.php b/tests/HelloTest.php
index a1e489f..4bb05f9 100644
--- a/tests/HelloTest.php
+++ b/tests/HelloTest.php
@@ -1,5 +1,7 @@
 <?php

+declare(strict_types=1);
+
 namespace Bag2\Hello;

 use Bag2\Hello\TestCase;
다시 실행./vendor/bin/phpunit.
TypeError.이렇게 하면 방지할 수 있다$subject->to(1).PHPUnit도'방법 호출이 발생하면TypeError 발생할 것'을 테스트할 수 있지만, 유형 선언이 설정된 모든 곳에서'(문자열 이외의 유형을) 상대방에게 건네주면TypeError 발생할 것'을 테스트할 수 있어 취소할 수 있다.
이에 따라 $subject->to(true)$subject->to(1.0) 등의 테스트는 모두 취소할 수 있다.결국 이렇게 됐어.
tests/HelloTest.php
<?php

declare(strict_types=1);

namespace Bag2\Hello;

use Bag2\Hello\TestCase;

final class HelloTest extends TestCase
{
    public function test()
    {
        $subject = new Hello();

        $this->assertSame('Hello, World!', $subject->to('World'));
        $this->assertSame('Hello, Miku!', $subject->to('Miku'));
    }
}

Phan을 설치해 주세요.


Phan도 강력한 정적 분석 도구 중의 하나이다.PHP 최초 개발자였던 래스머스 레르도르프 소속 에티시가 개발한 것으로, 지금은 핀의 개발 커뮤니티로 이관됐다.
설치할 때 이전과 같이composier-bin-pluggin을 사용합니다.
$ composer bin phan require phan/phan
실행 방법은 이전과 같음./vendor/bin/phan --init 설정 파일을 생성할 수 있습니다.생성.phan/config.php이니까 이것도 지트로 제출하세요.여기까지 익숙해졌네.
만약 잘못이 없다면, 나는 아마 어떤 경고도 하지 않을 것이라고 생각한다.

Phan은 앞서 소개한 PHPStan·Psalm과 무엇이 다를까.왜 세 가지를 설치했을까?자세히 말하면 분석 방식도 다르다. 솔직히 이렇게 작은 규모의 포장을 할 수 있는 것은 대개 같다.
극단적으로 말하면 하나만 넣어도 충분하다.그러나 이 일련의 보도는'지나치게 신중하다'는 취지로 마치 돌다리를 두드리며 다리를 건너는 것처럼 세 가지를 모두 사용해야 한다.
이것은 특별히 요구되는 것이 아니다. 이곳에 소개된 세 가지 정적 분석 도구(Phan, PHPStan, Psalm)는 모두 정력적으로 개발된 것으로 매주 새로운 버전을 발표한다.세부적인 부분에서는 세 가지 방식으로 검사를 하기 때문에 하나만 검사하는 문제도 있다.
품질을 높이려면 처음 쓴 프로그램 라이브러리에서 세 가지 정적 분석의 전부를 분석해 봤자 별 비용이 들지 않았을 것이다.다만, 실장 행수가 늘어났다고 판단되면 단순히 해결할 수 없는 문제가 지적되거나 무익한 항목만 지적된다고 판단되면 저감 도구도 판단할 수 있다.
여기서 주의해야 할 것은'세 가지를 모두 넣는다'는 것이 새로 쓰기 시작한 프로젝트라면 기존 프로젝트에서 정적 분석으로 지적한 항목을 의욕적으로 모두 망가뜨리지 않으면 힘들다는 점이다.게다가 세 가지 공구가 모두 통과되면 추가 비용이 들 수도 있다.과유불급.정적 분석에 적합하게 수정하려고 했지만 오류가 삽입될 가능성이 높다.
정적 분석은'실행 코드는 없지만 위험한 것 같다'는 기술로, 단원 테스트와 같은 수단이라도'실행 코드는 의도대로 실행된다'는 사실이 항상 우선적으로 고려된다.(하지만 테스트 코드는 의도를 표현할 수 없습니다. 잘못된 것일 수도 있습니다)

여러 시간 동안 인사해주세요!


지금까지 실시된 것은 단지 Hello라고 말할 수 있는 단세포 나쁜 놈이다.실제로 일본어는 시간대마다 인사말 표현이 풍부하다.따라서 시간대마다 다른 인사를 할 수 있도록 프로그래밍을 해주세요.
저는 전문 프로그래머입니다. 인사만 하면 쉽게 이길 수 있습니다!
src/Aisatsu.php
<?php

declare(strict_types=1);

namespace Bag2\Hello;

final class Aisatsu
{
    public function byHour(int $hour): string
    {
        if (5 < $hour && $hour < 10) {
            return "おはようございま!";
        }

        if (10 < $hour && $hour < 16) {
            return "こんにちはこんにちは!";
        }

        return "こんばんは!";
    }
}
홀가분하네.

총결산


에서는 다음 도구를 설명합니다.
  • Psalm/Psalter(전번 계속)
  • Phan
  • 지난번보다 내용이 좀 싱겁네.. 계속해야 돼.

    감상


    밤에 자.
    PHPerKaigi 2020표는 아직 판매 중입니다.
    그리고 Laravel JP Conference 2020 3월에도 하니까 놀러와요.

    좋은 웹페이지 즐겨찾기