목차
1. 요약
2. 세부사항
3. 예:
四、背景和理论基础
백엔드 개발 PHP7 PHP7 스칼라 유형 선언 RFC 자세한 설명

PHP7 스칼라 유형 선언 RFC 자세한 설명

Jun 22, 2020 pm 05:54 PM
api php rust 후방

PHP7 스칼라 유형 선언 RFC 자세한 설명

1. 요약

이 RFC는 int, float, string 및 bool의 4가지 새로운 스칼라 유형 선언을 추가할 것을 제안합니다. 이러한 유형 선언은 PHP의 원래 메커니즘과 일관되게 사용됩니다. RFC는 또한 동일한 PHP 파일의 모든 함수 호출 및 명령문 반환이 "엄격히 제한된" 스칼라 유형을 갖도록 각 PHP 파일에 새로운 선택적 명령(declare(strict_type=1);)을 추가할 것을 권장합니다. 또한 엄격한 유형 제약 조건을 켠 후 매개변수 구문 분석에 실패하면 확장 기능이나 PHP 내장 함수를 호출하면 E_RECOVERABLE_ERROR 수준 오류가 생성됩니다. RFC는 이 두 가지 기능을 통해 PHP 작성이 더욱 정확해지고 문서화되기를 바라고 있습니다.

추천 튜토리얼: "PHP Tutorial"

2. 세부사항

스칼라 유형 선언:

새 예약어가 추가되지 않았습니다. Int, float, string 및 bool은 유형 선언으로 인식되며 클래스/인터페이스/특성 등의 이름으로 사용이 금지됩니다. 내부 Fast Parameter Parsing API를 통해 구현된 새로운 사용자 스칼라 유형 선언입니다.

strict_types/declare() 지시어

기본적으로 모든 PHP 파일은 약한 유형 검사 모드에 있습니다. 새로운 선언 지시문은 strict_types(1 또는 0)의 값을 지정합니다. 1은 함수 호출 및 return 문에 적용되는 엄격한 유형 검사 모드를 나타내고, 0은 약한 유형 검사 모드를 나타냅니다.

declare(strict_types=1)은 파일의 첫 번째 문이어야 합니다. 이 명령문이 파일의 다른 곳에 나타나면 컴파일 오류가 발생하고 블록 모드가 명시적으로 금지됩니다.

인코딩 지시어와 유사하지만 틱 지시어와는 다릅니다. strict_types 지시어는 지정된 파일에만 영향을 미치며 포함된 다른 파일에는 영향을 미치지 않습니다(include 등을 통해). 이 지시문은 런타임에 컴파일되며 수정할 수 없습니다. 작동 방식은 함수 호출과 반환 유형 검사가 유형 제약 조건을 준수하도록 opcode에 플래그를 설정하는 것입니다.

매개변수 유형 선언

이 명령어는 모든 함수 호출에 영향을 미칩니다. 예를 들어(엄격한 확인 모드):

<?php
declare(strict_types=1);
 
foo(); // strictly type-checked function call
 
function foobar() {
    foo(); // strictly type-checked function call
}
 
class baz {
    function foobar() {
        foo(); // strictly type-checked function call
    }
}
로그인 후 복사

대비(약한 확인 모드)

<?php
foo(); // weakly type-checked function call
 
function foobar() {
    foo(); // weakly type-checked function call
}
 
class baz {
    function foobar() {
        foo(); // weakly type-checked function call
    }
}
로그인 후 복사

반환 유형 선언:

이 명령어는 동일한 파일에 영향을 미칩니다. 예를 들어(엄격한 확인 모드):

<?php
declare(strict_types=1);
 
function foobar(): int {
    return 1.0; // strictly type-checked return
}
 
class baz {
    function foobar(): int {
        return 1.0; // strictly type-checked return
    }
}
로그인 후 복사

<?php
 
function foobar(): int {
    return 1.0; // weakly type-checked return
}
 
class baz {
    function foobar(): int {
        return 1.0; // weakly type-checked return
    }
}
로그인 후 복사

약한 유형 검사 동작:

약한 유형 검사를 사용하는 함수 호출은 PHP7 이전 버전(확장 및 PHP 내장 포함)과 일치합니다. 기능). 일반적으로 약한 유형 검사 규칙은 새로운 스칼라 유형 선언과 동일하지만 유일한 예외는 NULL 처리입니다. 기존 클래스, 호출 및 배열 유형 선언과 일관성을 유지하기 위해 NULL은 매개변수로 전달되고 명시적으로 NULL에 할당되지 않는 한 기본값이 아닙니다.

약한 스칼라 매개변수 유형에 대한 PHP의 기존 규칙에 익숙하지 않은 독자를 위해 간략한 요약을 제공합니다. 표에는 다양한 유형이 허용하고 변환할 수 있는 스칼라 유형 선언이 나와 있습니다. NULL, 배열 및 리소스는 스칼라 유형 선언을 허용할 수 없으므로 표에 포함되지 않습니다.

*PHP_INT_MIN 및 PHP_INT_MAX 범위에서 NaN이 아닌 부동 소수점 유형만 허용됩니다. (PHP7의 새로운 기능, 오버플로 RFC의 ZPP 실패 참조)
?숫자가 아닌 문자열은 허용되지 않습니다. 문자열 뒤에 오는 숫자 문자열도 허용되지만 알림이 생성됩니다.

? __toString 메소드가 있는 경우에만 가능합니다.

엄격한 유형 검사 동작:

엄격한 유형 검사는 zend_parse_parameters의 동작을 변경하는 확장 프로그램 또는 PHP 내장 함수를 호출합니다. 실패하면 E_WARNING 대신 E_RECOVERABLE_ERROR가 생성됩니다. 전통적인 약한 유형 검사 규칙 대신 엄격한 유형 검사 규칙을 따릅니다. 엄격한 유형 검사의 규칙은 매우 간단합니다. 유형이 지정된 유형 선언과 일치하는 경우에만 허용되고 그렇지 않으면 거부됩니다.

한 가지 예외는 와이드 유형 변환을 통해 int를 float로 변경할 수 있다는 것입니다. 즉, 매개변수가 float 유형으로 선언된 경우 int 매개변수를 계속 허용할 수 있습니다.

<?php
declare(strict_types=1);
 
function add(float $a, float $b): float {
    return $a + $b;
}
 
add(1, 2); // float(3)
로그인 후 복사

이 시나리오에서는 float를 허용하도록 정의된 함수에 int 매개변수를 전달하고 이 매개변수는 float로 변환됩니다. 이외의 변환은 허용되지 않습니다.

3. 예:

숫자 2개를 더하는 함수를 만들어 보겠습니다.

add.php

<?php
function add(int $a, int $b): int {
    return $a + $b;
}
로그인 후 복사

별도의 파일이라면 약한 타이핑을 통해 add 함수를 호출할 수 있습니다.

<?php
require "add.php";
 
var_dump(add(1, 2)); // int(3)
// floats are truncated by default
var_dump(add(1.5, 2.5)); // int(3)
 
//strings convert if there's a number part
var_dump(add("1", "2")); // int(3)
로그인 후 복사

기본적으로 약한 타입 선언은 변환을 허용하며, 전달된 값이 변환됩니다.

<?php
require "add.php";
 
var_dump(add("1 foo", "2")); // int(3)
// Notice: A non well formed numeric value encountered
로그인 후 복사

그러나 선택적 선언 지시문을 통해 엄격한 유형 검사를 활성화한 후에는 이 시나리오에서 동일한 호출이 실패합니다.

<?php
declare(strict_types=1);
 
require "add.php";
 
var_dump(add(1, 2)); // int(3)
 
var_dump(add(1.5, 2.5)); // int(3)
// Catchable fatal error: Argument 1 passed to add() must be of the type integer, float given
로그인 후 복사

지시어는 동일한 파일의 모든 함수 호출에 영향을 미칩니다. 호출된 함수가 이 파일에 정의되어 있는지 여부에 관계없이 엄격한 유형 검사 모드가 사용됩니다.

<?php
declare(strict_types=1);
 
$foo = substr(52, 1);
// Catchable fatal error: substr() expects parameter 1 to be string, integer given
로그인 후 복사

스칼라 유형 선언은 반환 값의 엄격한 유형 검사에도 사용할 수 있습니다.

<?php
 
function foobar(): int {
    return 1.0;
}
 
var_dump(foobar()); // int(1)
로그인 후 복사

在弱类型模式下,float被转为integer。

<?php
declare(strict_types=1);
 
function foobar(): int {
    return 1.0;
}
 
var_dump(foobar());
// Catchable fatal error: Return value of foobar() must be of the type integer, float returned
로그인 후 복사

四、背景和理论基础

历史

PHP从PHP5.0开始已经有对支持class和interface参数类型声明,PHP5.1支持array以及PHP5.4支持callable。这些类型声明让PHP在执行的时候传入正确的参数,让函数签名具有更多的信息。

先前曾经想添加标量类型声明,例如Scalar Type Hints with Casts RFC,因为各种原因失败了:

(1)类型转换和校验机制,对于拓展和PHP内置函数不匹配。

(2)它遵循一个弱类型方法。

(3)它的“严格”弱类型修改尝试,既没有满足严格类型的粉丝期望,也没有满足弱类型的粉丝。

这个RFC尝试解决全部问题。

 

弱类型和强类型

在现代编程语言的实际应用中,有三种主要的方法去检查参数和返回值的类型:

(1)全严格类型检查(也就是不会有类型转换发生)。例如F#、GO、Haskell、Rust和Facebook的Hack的用法。

(2)广泛原始类型检查(“安全”的类型转换会发生)。例如Java、D和Pascal。他们允许广泛原始类型转换(隐式转换),也就是说,一个8-bit的integer可以根据函数参数需要,被隐形转换为一个16-bit的integer,而且int也可以被转换为float的浮点数。其他类型的隐式转换则不被允许。

(3)弱类型检查(允许所有类型转换,可能会引起警告),它被有限制地使用在C、C#、C++和Visual Basic中。它们尝试尽可能“不失败”,完成一次转换。

PHP在zend_parse_parameters的标量内部处理机制是采用了弱类型模式。PHP的对象处理机制采用了广泛类型检查方式,并不追求精确匹配和转换。

每个方法各有其优缺点。

这个提案中,默认采用弱类型校验机制,同时追加一个开关,允许转换为广泛类型校验机制(也就是严格类型校验机制)。

 

为什么两者都支持?

目前为止,大部分的标量类型声明的拥护者都要求同时支持严格类型校验和弱类型校验,并非仅仅支持其中一种。这份RFC,使得弱类型校验为默认行为,同时,添加一个可选的指令来使用严格类型校验(同一个文件中)。在这个选择的背后,有很多个原因。

PHP社区很大一部分人看起来很喜欢全静态类型。但是,添加严格类型校验的标量类型声明将会引起一些问题:

(1)引起明显的不一致性:拓展和PHP内置函数对标量类型参数使用弱类型校验,但是,用户的PHP函数将会使用严格类型校验。

(2)相当一部分人更喜欢弱类型校验,并不赞同这个提案,他们可能会阻止它的实施。

(3)已经存在的代码使用了PHP的弱类型,它会受到影响。如果要求函数添加标量类型声明到参数上,对于现有的代码库,这将大大增加复杂性,特别是对于库文件。

 

这里仍然有相当于一部分人是喜欢弱类型校验的,但是,添加严格类型校验声明和添加弱类型校验声明都会引起一些问题:

(1)大部分倾向于严格类型校验的人将不会喜欢这个提案,然后阻止它的实施。

(2)限制静态解析的机会。(可能是说,优化的机会)

(3)它会隐藏一些在类型自动转换中数据丢失的bug。

 

第三种方案被提出来了,就是添加区分弱类型和严格类型声明的语法。它也会带来一些问题:

(1)不喜欢弱类型和严格类型校验的人,会被强迫分别处理被定义为严格类型或者弱类型校验的库。

(2)像添加严格声明一样,这个也将和原来弱类型实现的拓展和PHP内置函数无法保持一致。

 

为了解决这三种方案带来的问题,这个RFC提出了第四种方案:每个文件各自定义严格或者弱类型校验。它带来了以下好处:

(1)人们可以选择适合他们的类型校验,也就是说,这个方案希望同时满足严格和弱类型校验两个阵营。

(2)API不会被强制适应某个类型声明模式。

(3)因为文件默认使用弱类型校验方案,已经存在的代码库,可以在不破坏代码结构的情况下,添加标量类型声明。也可以让代码库逐步添加类型声明,或者仅部分模块添加。

(4)只需要一个单一语法,就可以定义标量类型声明。

(5)更喜欢严格类型校验的人,通常,不仅将这个特性使用在用户定义的函数,同时也使用在拓展和PHP内置函数中。也就是说,PHP使用者会得到一个统一机制,而不会产生严格标量声明的矛盾。

(6) 엄격한 유형 확인 모드에서 확장 및 PHP 내장 함수에 의해 생성된 유형 확인 실패의 오류 수준은 사용자 정의 함수(둘 다 E_RECOVERABLE_ERROR)에 의해 생성된 수준과 일치합니다.

(7) 엄격한 유형의 코드와 약한 유형의 코드를 단일 코드 베이스에 원활하게 통합할 수 있습니다.

위 내용은 PHP7 스칼라 유형 선언 RFC 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
1 몇 달 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
1 몇 달 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
1 몇 달 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 채팅 명령 및 사용 방법
1 몇 달 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

Ubuntu 및 Debian용 PHP 8.4 설치 및 업그레이드 가이드 Ubuntu 및 Debian용 PHP 8.4 설치 및 업그레이드 가이드 Dec 24, 2024 pm 04:42 PM

PHP 8.4는 상당한 양의 기능 중단 및 제거를 통해 몇 가지 새로운 기능, 보안 개선 및 성능 개선을 제공합니다. 이 가이드에서는 Ubuntu, Debian 또는 해당 파생 제품에서 PHP 8.4를 설치하거나 PHP 8.4로 업그레이드하는 방법을 설명합니다.

PHP 개발을 위해 Visual Studio Code(VS Code)를 설정하는 방법 PHP 개발을 위해 Visual Studio Code(VS Code)를 설정하는 방법 Dec 20, 2024 am 11:31 AM

VS Code라고도 알려진 Visual Studio Code는 모든 주요 운영 체제에서 사용할 수 있는 무료 소스 코드 편집기 또는 통합 개발 환경(IDE)입니다. 다양한 프로그래밍 언어에 대한 대규모 확장 모음을 통해 VS Code는

이전에 몰랐던 후회되는 PHP 함수 7가지 이전에 몰랐던 후회되는 PHP 함수 7가지 Nov 13, 2024 am 09:42 AM

숙련된 PHP 개발자라면 이미 그런 일을 해왔다는 느낌을 받을 것입니다. 귀하는 상당한 수의 애플리케이션을 개발하고, 수백만 줄의 코드를 디버깅하고, 여러 스크립트를 수정하여 작업을 수행했습니다.

PHP에서 HTML/XML을 어떻게 구문 분석하고 처리합니까? PHP에서 HTML/XML을 어떻게 구문 분석하고 처리합니까? Feb 07, 2025 am 11:57 AM

이 튜토리얼은 PHP를 사용하여 XML 문서를 효율적으로 처리하는 방법을 보여줍니다. XML (Extensible Markup Language)은 인간의 가독성과 기계 구문 분석을 위해 설계된 다목적 텍스트 기반 마크 업 언어입니다. 일반적으로 데이터 저장 AN에 사용됩니다

JWT (JSON Web Tokens) 및 PHP API의 사용 사례를 설명하십시오. JWT (JSON Web Tokens) 및 PHP API의 사용 사례를 설명하십시오. Apr 05, 2025 am 12:04 AM

JWT는 주로 신분증 인증 및 정보 교환을 위해 당사자간에 정보를 안전하게 전송하는 데 사용되는 JSON을 기반으로 한 개방형 표준입니다. 1. JWT는 헤더, 페이로드 및 서명의 세 부분으로 구성됩니다. 2. JWT의 작업 원칙에는 세 가지 단계가 포함됩니다. JWT 생성, JWT 확인 및 Parsing Payload. 3. PHP에서 인증에 JWT를 사용하면 JWT를 생성하고 확인할 수 있으며 사용자 역할 및 권한 정보가 고급 사용에 포함될 수 있습니다. 4. 일반적인 오류에는 서명 검증 실패, 토큰 만료 및 대형 페이로드가 포함됩니다. 디버깅 기술에는 디버깅 도구 및 로깅 사용이 포함됩니다. 5. 성능 최적화 및 모범 사례에는 적절한 시그니처 알고리즘 사용, 타당성 기간 설정 합리적,

문자열로 모음을 계산하는 PHP 프로그램 문자열로 모음을 계산하는 PHP 프로그램 Feb 07, 2025 pm 12:12 PM

문자열은 문자, 숫자 및 기호를 포함하여 일련의 문자입니다. 이 튜토리얼은 다른 방법을 사용하여 PHP의 주어진 문자열의 모음 수를 계산하는 방법을 배웁니다. 영어의 모음은 A, E, I, O, U이며 대문자 또는 소문자 일 수 있습니다. 모음이란 무엇입니까? 모음은 특정 발음을 나타내는 알파벳 문자입니다. 대문자와 소문자를 포함하여 영어에는 5 개의 모음이 있습니다. a, e, i, o, u 예 1 입력 : String = "Tutorialspoint" 출력 : 6 설명하다 문자열의 "Tutorialspoint"의 모음은 u, o, i, a, o, i입니다. 총 6 개의 위안이 있습니다

PHP에서 늦은 정적 결합을 설명하십시오 (정적 : :). PHP에서 늦은 정적 결합을 설명하십시오 (정적 : :). Apr 03, 2025 am 12:04 AM

정적 바인딩 (정적 : :)는 PHP에서 늦은 정적 바인딩 (LSB)을 구현하여 클래스를 정의하는 대신 정적 컨텍스트에서 호출 클래스를 참조 할 수 있습니다. 1) 구문 분석 프로세스는 런타임에 수행됩니다. 2) 상속 관계에서 통화 클래스를 찾아보십시오. 3) 성능 오버 헤드를 가져올 수 있습니다.

php magic 방법 (__construct, __destruct, __call, __get, __set 등)이란 무엇이며 사용 사례를 제공합니까? php magic 방법 (__construct, __destruct, __call, __get, __set 등)이란 무엇이며 사용 사례를 제공합니까? Apr 03, 2025 am 12:03 AM

PHP의 마법 방법은 무엇입니까? PHP의 마법 방법은 다음과 같습니다. 1. \ _ \ _ Construct, 객체를 초기화하는 데 사용됩니다. 2. \ _ \ _ 파괴, 자원을 정리하는 데 사용됩니다. 3. \ _ \ _ 호출, 존재하지 않는 메소드 호출을 처리하십시오. 4. \ _ \ _ get, 동적 속성 액세스를 구현하십시오. 5. \ _ \ _ Set, 동적 속성 설정을 구현하십시오. 이러한 방법은 특정 상황에서 자동으로 호출되어 코드 유연성과 효율성을 향상시킵니다.

See all articles