PHP도 유형 선언에 참여하기 시작했습니다. PHP7+에는 유형 선언 기능이 추가되었습니다. 다음 문서에서는 PHP 유형 선언의 기능을 이해하고 반환 유형 선언의 함정을 공유하는 데 도움이 되기를 바랍니다. 모든 사람!
최근 PHP7의 새로운 기능을 조사하면서 PHP에서도 유형 선언을 사용하기 시작했다는 사실을 발견했습니다. 그렇게 하면 프로그램의 실행 속도가 향상된다는 이점이 있습니다.
이 새로운 기능의 소개부터 시작해 보겠습니다.
기본적으로 모든 PHP 파일은 약한 유형 검사 모드에 있습니다.
PHP7+에는 유형 선언 기능이 추가되었습니다. 유형 선언에는 두 가지 모드가 있습니다.
스칼라 유형 선언 구문 형식:
declare(strict_types=1);
값 strict_types:
사용할 수 있는 유형 매개변수는 다음과 같습니다:
Force 모드(기본 모드)
<?php function sum(int ...$ints) { return array_sum($ints); } print(sum(1, '2', 3.1)); ?>
위 프로그램의 실행 출력은 다음과 같습니다. 6
6
分析一下即:将字符串类型的'2'转换成整型的2,将float类型的3.1转换为整型的3后再相加,得出结果6。
严格模式
<?php declare(strict_types=1); function sum(int ...$ints) { return array_sum($ints); } print(sum(1, '2', 3.1)); ?>
以上程序因为采用了严格模式,因为第二个参数不是int类型,执行结果报错如下:
PHP Fatal error: Uncaught TypeError: Argument 2 passed to sum() must be of the type integer, string given, called in……
返回类型声明
PHP7+ 增加了对返回类型声明的支持,返回类型声明指明了函数返回值的类型。
可以声明的返回类型有:
我踩的坑
这里我还真趟过坑,在新版本的phpstorm中会根据返回值类型出现提示代码,引导添加返回类型声明,我就加上了。但是后面因为业务的变化或者代码优化只修改了返回值(比如之前返回的是array,修改后返回了int),却忘记了修改返回类型声明(毕竟习惯了PHP弱语言类型这么多年了...),这样是会抛出异常导致报错的,这就是我踩到的坑,小伙们们在使用过程中要注意。
思考
GO语言是不会出现我上面说的问题的, 因为如果返回值类型和返回类型声明是编译不通过的,编译的时候就会报错。
而PHP作为弱类型语言,虽然做了返回类型声明这种优化,但是语言执行前不需要我们编译,直接发布运行,也就不能做到go语言的“编译报警”了,PHP会在执行的时候直接抛出异常。
<?php declare(strict_types=1); function returnIntValue(int $value): int { return $value; } print(returnIntValue(5)); ?>
以上程序执行输出结果为:5
返回类型声明错误示例
<?php declare(strict_types=1); function returnIntValue(int $value): int { return $value + 3.0; } print(returnIntValue(1)); ?>
以上程序由于采用了严格模式,返回值必须是 int,但是计算结果是float,导致报错,执行输出结果为:Fatal error: Uncaught TypeError: Return value of returnIntValue() must be of the type integer, float returned...
void 函数
注意:定义返回类型为 void 的函数不能有返回值,即使返回 null 也不行。
返回值声明为 void 类型的方法要么干脆省去 return 语句,要么使用一个空的 return 语句。
实例
<?php function exchange(&$left, &$right) : void { if ($left === $right) { return; } $tmp = $left; $left = $right; $right = $tmp; } $a = 1; $b = 2; var_dump(exchange($a, $b), $a, $b);
以上实例输出结果:
null int(2) int(1)
Strict mode
rrreee위 프로그램은 strict 모드를 사용하기 때문에 두 번째 매개변수가 int형이 아니기 때문에 실행 결과는 다음과 같습니다.
PHP 치명적 오류: Uncaught TypeError: Argument 2 sum()에 전달된 것은 정수, 주어진 문자열, 호출된 유형이어야 합니다...
🎜🎜🎜🎜반환 유형 선언🎜🎜🎜🎜PHP7+는 함수 반환 값 유형을 지정하는 반환 유형 선언에 대한 지원을 추가합니다. . 🎜🎜선언할 수 있는 반환 유형은 다음과 같습니다. 🎜🎜🎜string🎜🎜int🎜🎜float🎜🎜bool🎜🎜interfaces🎜🎜array🎜🎜callable🎜🎜🎜🎜🎜밟았습니다🎜 🎜 🎜🎜저는 실제로 그랬어요 여기 Pitfalls 이전 버전의 phpstorm에서는 반환 값 유형에 따라 프롬프트 코드가 나타나 반환 유형 문을 추가하도록 안내하므로 추가했습니다. 그런데 나중에 비즈니스 변경이나 코드 최적화로 인해 반환 값만 수정했는데(예를 들어 이전에는 배열을 반환했는데 수정 후에는 int를 반환했습니다.) 반환 유형 선언을 수정하는 것을 잊어버렸습니다(결국 오랫동안 PHP의 약한 언어 유형에 익숙해져 있었습니다... ) 이것은 예외를 발생시키고 오류를 발생시킬 것입니다. 여러분, 사용할 때 주의하시기 바랍니다. 🎜🎜🎜🎜Thinking🎜🎜🎜🎜🎜GO 언어에는 위에서 언급한 문제가 없습니다. 반환 값 유형과 반환 유형 선언이 컴파일에 실패하면 컴파일 중에 오류가 보고되기 때문입니다. 🎜🎜🎜🎜약한 유형의 언어로서 PHP는 반환 유형 선언과 같은 최적화를 수행했지만 언어가 실행되기 전에 컴파일할 필요가 없으며 직접 릴리스하고 실행할 수 있으므로 "컴파일 알람"을 달성할 수 없습니다. " Go 언어의 PHP는 실행 중에 직접 예외를 발생시킵니다. 🎜🎜rrreee🎜위 프로그램 실행의 출력 결과는 다음과 같습니다. 5
🎜🎜🎜🎜반환 유형 선언 오류의 예🎜🎜🎜rrreee🎜위 프로그램의 엄격 모드로 인해, 반환 값은 int여야 하지만 계산 결과는 float이므로 오류가 발생합니다. Fatal error: Uncaught TypeError: return IntValue()의 반환 값은 정수 유형이어야 하며 float가 반환됩니다. ..
🎜🎜🎜🎜void function🎜🎜 🎜🎜🎜참고: 반환 유형이 void로 정의된 함수는 null을 반환하더라도 반환 값을 가질 수 없습니다. 🎜🎜🎜반환 값이 void 유형으로 선언된 메서드는 return 문을 모두 생략하거나 빈 return 문을 사용해야 합니다. 🎜🎜🎜Example🎜🎜rrreee🎜위 예제의 출력 결과: 🎜🎜null int(2) int(1)
🎜🎜🎜원본 주소: https://juejin.cn/post/ 7062942459247984648🎜🎜 저자: Wang Zhongyang Go🎜🎜🎜추천 학습: "🎜PHP 비디오 튜토리얼🎜"🎜위 내용은 PHP7+에서는 유형 선언도 지원합니다. 이 기능에 대해 이야기해 보겠습니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!