PHP 7.4에 따른 모든 변화
24067 단어 php
본 문서에서, 우리는 버전의 모든 변경 사항을 한 번에 RFC로 되돌아볼 것이다.
화려한 첨가물
기대했던 기능들이 마침내 7.4에 등장했다.다음은 내가 언어에 더 큰 영향을 미친다고 생각하는 요소이다.
Typed properties
클래스 속성을 입력할 수 있습니다.
이곳은 쾌속 유람이다.
class Color {}
class Profession {}
class Guy {
public string $name;
private int $id;
public static int $age;
public Color $hairColor;
public ?Profession $profession;
public string $address = 'Discworld';
public string $phone;
}
class InheritingGuy extends Guy{
public int $name; //Error, types are invariant
public string $id; //Unless the visibility changes from private to a less restrictive one
}
$guy = new Guy();
$guy->name = 'Sherlok'; //Good!
$guy::$age = 42; //Static properties are typed too
$guy::$age = '42'; //If strict_types is enabled this assigment throws a TypeError, if not PHP will try to convert fom string to int
$guy->hairColor = new \DateTimeImmutable(); //Throws TypeError, we can only assign a Color
$guy->profession = null; //Possible because it is nullable
echo $guy->address; //This is ok because it has a value
echo $guy->phone; //Throws an error because value was not initialized
언어 유형 시스템을 개선하는 다음 자연스러운 절차위의 예제에서는 유형 속성을 사용할 때 몇 가지 시나리오를 설명하지만 RFC를 통해 유형 속성의 모든 세부 사항을 완전히 이해하는 것을 권장합니다.Arrow functions
익명 함수를 위해 더 간단한 문법을 사용합니다.
이 문법은
use
키워드가 함수 범위 내에서 변수를 가져오는 수요를 없애고 간단한 함수의 크기를 크게 줄였다.특히 array_map
, 여과 및 복원 방법에 적합하다.$template = ', I choose you!'.PHP_EOL;
$oldStyle = function($who) use ($template) {
return $who.$template;
};
$withArrowFunctions = fn($who) => $who.$template;
$name = 'Pikachu';
echo $oldStyle($name);
echo $withArrowFunctions($name);
//Both calls print "Pikachu, I choose you!"
Covariant returns and contravariant parameters
다시 쓸 때 더 구체적인 되돌아오는 형식을 정의할 수도 있고, 그다지 구체적인 매개 변수 형식을 정의하지 않을 수도 있다.
협방차와 역방차는 해석하기 어렵지만 실제로는 그렇게 어렵지 않다.지금까지 PHP에는 변경되지 않은 매개변수와 반환 유형이 있습니다.PHP 7.4가 이를 변경합니다.예를 들어 다음과 같이 설명합니다.
class MarioEnemy {}
class Koopa extends MarioEnemy {}
class EnemyType {}
class Turtle extends EnemyType {}
class Mushroom extends EnemyType {}
interface MarioEnemyGrabber {
public function grabEnemyOfType(Turtle $type): MarioEnemy;
}
7.4 이전에는 매개 변수와 되돌아오는 형식이 변하지 않기 때문에 변경 방법 서명 인터페이스를 확장할 수 없습니다.7.4를 사용하면 보다 구체적인 반환 유형과 그다지 구체적인 매개 변수 유형을 가질 수 있다.//Overriding return type with a more specific one
interface OneKoopaGrabber extends MarioEnemyGrabber {
public function grabEnemyOfType(Turtle $type): Koopa;
}
//Overridign parameter type with a less specific one
interface AnotherKoopaGrabber extends MarioEnemyGrabber {
public function grabEnemyOfType(EnemyType $type): MarioEnemy;
}
이 글이 발표될 때, 협동 매개 변수의 예가 있는데, 이것은 다시 쓸 때 매개 변수에 더욱 구체적인 유형을 제공할 수 있음을 나타낸다.이것은 정확하지 않다. 나는 이미 이 예를 삭제했다.평론에서 이 점을 지적해 주셔서 감사합니다. 당신은 그곳에서 유사한 예를 보고 무엇을 할 수 없는지 설명할 수 있습니다.Null coalescing assignment operator
빈 병합 대입 연산자
??=
를 사용할 수 있습니다.//Keeps $discount if it is not null, assigns 20 otherwise
$discount ??= 20;
//Before we had to do
$discount = $discount ?? 20;
존재하지 않을 수 있는 값을 분배할 때 소음을 줄이기 위해 한 걸음 더 나아갔다.Spread operator in arrays
한 어레이(또는 한 어레이
Traversable
는 다른 어레이에 분포할 수 있습니다.$blueGreen = ['blue', 'green'];
$andAlsoRed = ['red', ...$blueGreen];
//result is ['red', 'blue', 'green']
주의: 이것은 array_merge
의 대체품이 아닙니다.그것은 어떤 상황에서는 더욱 편리하지만, 다른 상황에서는 사용할 수 없다.Preloading
모든 요청에서 코드를 다시 컴파일하는 비용을 없애기 위해 프로그램 코드를 미리 불러올 수 있습니다.평균 10% ~ 15% 성능 향상
OpCache를 사용하면 PHP가 실행할 때 컴파일한 거의 모든 비용이 완화되었지만 일부 부분은 더욱 최적화될 수 있다.이것이 바로 프리로드의 의미입니다. 서버를 다시 시작해야 코드의 변경 사항을 감지할 수 있는 상황에서 모든 클래스가 배제될 수 없기 때문에 프리로드에서 제외해야 하는 클래스를 정의하는 파일이 필요합니다.
이것은 저급한 특성이기 때문에 간단한 방식으로 설명하기 어렵다. 적어도 나의 이해로는 (시스템원이나 PHP 핵심 구성원이 아니다).RFC를 읽고 과거 PHP 바르셀로나 회의에서 니키타 포포프(Nikita Popov)가 보여준 퍼포먼스를 보면서 OpCache와 다른 많은 재미있는 것들에 비해 어떤 장점이 있는지 알기 쉬운 방식으로 설명하는 것이 아니라 미리 불러오는 것들만 설명하는 것이 좋다고 제안합니다.
기타
다음은 7.4의 불명예스러운 첨가들입니다.
Foreign Function Interface
PHP에서 C 코드를 실행할 수 있습니다.
$ffi = FFI::cdef("here we declare C structs and methods");
//Creating a struct from the C code in the PHP code
$myStruct = new $ffi->new ('struct my_struct');
echo $myStruct->some_property;
//Calling functions from the C code in the PHP code
echo $ffi->some_method();
이것은 복잡한 것으로 목표는 빠른 원형이다.일부 인터넷 글은 PCL 설치를 통해 확장되지 않고 Composer를 사용하여 확장을 불러올 수 있다고 말한다.RFC 에서 설명하는 이 작업은 향후 이러한 일이 허용되거나 허용되지 않을 수 있는 첫 번째 단계와 같습니다.Numeric literal separator
밑줄은 숫자 구분자로 지원됩니다.
그래서 우리는
1_000.50
대신 1000.50
를 쓸 수 있다.1000만 위안은 큰 숫자의 가독성을 높이는 데 매우 유용하기 때문에 식별10_000_000
이 식별10000000
보다 좋다.Weak references
WeakReference는 언어의 핵심에서 실현될 것이다.확장이 이루어지기 전에 PHP7.3 이후에 문제가 발생하거나 사용할 수 없습니다.
솔직히 약한 인용의 개념은 나에게 있어서 새로운 개념이다. 한동안 검색하고 읽은 후에도 나는 여전히 그것들의 유용한 것을 얻지 못했다.내가 찾을 수 있는 모든 예는 기본적으로 PHP 문서의 예와 같다. 나는 이것이 나와 무관하다고 생각한다.실제 용례를 알고 있다면 댓글로 공유해 주세요.
Allow to throw exception inside __toString() method
매우 자명하다.PHP 내부가 이상하기 때문에 불가능합니다.
Notice for non valid array container
그룹 형식으로 접근할 수 없습니다. 이런 식으로 접근할 수 없는 내용은 경고를 받을 수 있습니다.
7.4까지 우리가 이렇게 할 때 우리는
NULL
을 얻었다. 바로 이렇다.$notArrayAccessible = 123;
$notArrayAccessible[0]; //throws a warning, integer cannot be accessed as arrays
Warning when providing invalid input to base_convert()
base_convert
와 유사한 함수의 잘못된 입력은 경고를 일으켜 마이너스 값을 지원합니다.base_convert
방법은 기수(10진법, 16진법, 이진 등) 사이에서 숫자를 바꾸고 decbin
등 구체적인 표현 방법을 변경한다.그러나 이러한 방법은 묵묵히 무효한 입력을 무시할 것이다. 예를 들어 42
를 2진법으로 전달하는 것이다.Include hash extension in the language core
해시 확장은 항상 활성화됩니다.
Improve openssl_random_pseudo_bytes()
함수
openssl_random_pseudo_bytes()
와 일치하지 않는 문제를 복구합니다.때때로 이 함수를 호출하면 사용자가 오류를 검사하도록 강요할 수 있습니다.이제 이상하고 곤혹스러운 두 번째 파라미터가 버려진 것으로 표시되고 PHP8에서 삭제됩니다.
str_split() supporting multibyte
이 방법
mb_str_split
은 여러 바이트가 문자열 분할을 지원할 수 있도록 합니다.Reflection for references
클래스
RefelctionReference
는 변수 간의 인용을 검사할 수 있습니다.이런 정보를 필요로 하는 도구는 반드시 해커 기술을 사용해야 한다.더 이상은 아니야.
New custom object serialization mechanism
대상의 서열화에 사용되는 두 가지 새로운 마술 방법
__serialize()
과 __unserialize
.이전에
Serializable
인터페이스와__sleep()
및__wakeup()
마술 방법의 서열화 메커니즘을 사용했기 때문에 새로운 마술 방법으로 해결된 복잡한 대상도에 많은 문제점이 존재했다.RFC에서 잘 설명된 불만 사항이므로 자세한 내용을 알아보십시오.
Password Hash Registry
함수
password_algos()
는 사용 가능한 암호 해시 알고리즘을 검색할 수 있도록 합니다.Support for argon2i and argon2id hashing when no ext/sodium installed
7.4에 암호 등록표 해시가 도입되었기 때문에 ext/Nasdium이 활성화되지 않았을 때
argon2i
와 argon2id
로 해시 연산을 할 수 있습니다.Escape PDO "?" parameter placeholder
PDO의
?
문자??
를 이스케이프할 수 있습니다.일부 PostgreSQL 기능은 PDO 확장과 함께 사용할 수 없습니다. 왜냐하면 그들은
?
문법의 일부분으로 사용하기 때문입니다.현재 PDO는 ??
를 단일?
으로 해석하여 PostgreSQL 작업과 물음표를 사용하는 다른 작업을 허용합니다.비난
이 언어의 몇 부분은 추천하지 않는 것으로 표시되었고, 일부 확장자는 옮겨졌습니다.
Small deprecations
많은 언어 구조와 방법이 추천하지 않음으로 표시되어 있으며, 사용 시 E 추천하지 않음 경고를 보냅니다.
대다수의 반대는 불일치와 정리에 기초를 두고 있기 때문에 특별히 주의할 만한 것은 없다.반대 의견 목록:
Deprecate curly braces array access
중괄호를 사용하여 배열에 액세스하면 PHP8에서 삭제할 수 있는 버림 경고가 표시됩니다.
흥미로운 것은 괄호를 사용하여 그룹 요소에 접근할 수 있다는 것이다
그것은 거의 알려지지 않아서 야외에서는 거의 쓸모가 없다.
$myArray = [1,2,3];
echo $myArray{1}; //Will trigger a deprecation warning
Enforce parentheses for chained ternary operators
삼원표를 끼워 넣으려면 괄호가 필요할 것이다. 왜냐하면 그것은 왼쪽이 아닌 오른쪽으로 연결되기 때문이다.만약 이렇게 하지 않는다면, 반대 경고를 보낼 것이다.
1 ? 2 : 3 ? 4 : 5; // deprecated
(1 ? 2 : 3) ? 4 : 5; // ok
1 ? 2 : (3 ? 4 : 5); // ok
끼워 넣은 삼원 연산자는 어쨌든 읽기가 어려우므로 직접 사용하지 않아도 된다: PChange the precedence of the concatenation operator
연산자
.
와 +
또는 -
가 있고 괄호가 없는 표현식을 사용하면 버림 오류가 발생합니다.PHP8에서
.
의 우선 순위는 +
또는 -
보다 작습니다.echo "result: " . $a + $b;
PHP7.3에서 이것은 ("result: " . $a) + $b;
의 구화와 연결된다.PHP 7.4에서 괄호가 없으면 폐기 경고가 표시됩니다.
PHP8에서 이것은 화합을 구한 다음에 연결됩니다
("result: " . $a) + $b;
.이상한 사실: 테스트 스크립트에서 이런 행동을 재현할 수 없습니다 "\(ツ)/¯
삭제된 확장
많은 확장이 언어에서 분리되었습니다.
ext/interbase
: 이 지원InterBase 데이터베이스 확장에 심각한 실현 문제가 존재하여 PECLRFC로 옮겨졌습니다.ext/wddx
: 데이터를 교환하는 데 사용되는 이 데이터 형식은 자체적으로 확장되어 현재 사용되지 않고 PECLRFC로 옮겨졌습니다.ext/recode
: 문자 세트 간 변환의 확장입니다.그것은 매우 낡아서 이미 생산이 중단되었다. iconv와mbstring은 PHPRFC에서 같은 일을 하고 있다.Reference
이 문제에 관하여(PHP 7.4에 따른 모든 변화), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/xoubaman/all-the-changes-that-come-with-php-7-4-4h34텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)