찾다
백엔드 개발PHP 튜토리얼PHP7의 새로운 기능 중 추상 구문 트리(AST)에 대한 일부 소개

이 기사에서는 PHP7의 새로운 기능인 추상 구문 트리(AST)에 대해 소개합니다. 내용이 매우 좋습니다. 도움이 필요한 모든 사람에게 도움이 되기를 바랍니다.

이 글에서는 PHP7의 새로운 기능인 AST(Abstract Syntax Tree)로 인한 변화를 분석합니다. 참조를 위해 모든 사람과 공유하세요. 세부 사항은 다음과 같습니다:

여기에 있는 대부분의 콘텐츠는 AST의 RFC 문서인 https://wiki.php.net/rfc/abstractsyntaxtree를 참조합니다. 이해를 돕기 위해 원본 문서에서 다음과 같은 내용을 발췌하여 소개합니다.

이 기사에서는 추상 구문 트리가 무엇인지 설명하지 않습니다. 이 기사에서는 AST가 PHP에 가져오는 몇 가지 변경 사항만 설명합니다.

새로운 실행 프로세스

PHP7 커널의 중요한 변화는 AST의 추가입니다. PHP5에서 PHP 스크립트에서 opcode까지의 실행 프로세스는 다음과 같습니다.

  1. Lexing: 어휘 스캐닝 분석, 소스 파일을 토큰 스트림으로 변환

    # 🎜🎜#
  2. 파싱: 구문 분석, 연산 배열이 이 단계에서 생성됩니다.

PHP7은 더 이상 구문 분석 단계에서 연산 배열을 직접 생성하지 않지만 AST를 먼저 생성하므로 프로세스에 한 단계가 더 있습니다:

#🎜 🎜## 🎜🎜#

Lexing: 어휘 스캐닝 분석, 소스 파일을 토큰 스트림으로 변환
  1. Parsing: 구문 분석, 토큰에서 추상 구문 트리 생성 스트림;
  2. Compilation: 추상 구문 트리에서 연산 배열을 생성합니다.
  3. 실행 시간 및 메모리 소모
위 단계에서 이전 과정보다 한 단계 더 진행되었으므로 상식을 따르세요. 이는 프로그램의 실행 시간과 메모리 사용량을 증가시킬 것이라고 말했습니다. 하지만 실제로는 메모리 사용량이 늘어난 것은 사실이지만 실행 시간은 줄어들었습니다.

소형(코드 약 100줄), 중형(약 700줄), 대형(약 2800줄)의 세 가지 스크립트를 테스트하여 얻은 결과는 다음과 같습니다. 테스트 스크립트: https://gist .github.com/nikic/289b0c7538b46c2220bc.

각 파일을 100번 컴파일하는 실행 시간(기사의 테스트 결과는 PHP7이 여전히 PHP-NG로 불렸던 14년 전이라는 점에 유의하세요): # 🎜🎜 #

php-ng# ㅋㅋㅋ 🎜# - 12.5% ​​MEDIUM1.492s1.268s-1 7.7% 에디토리얼 #🎜 🎜# 단일 편집의 메모리 최고치: # 🎜 🎜#378kB414kB+9.5%MEDIUM

php-ast
php-ng php-ast diff
SMALL#🎜🎜 #
# 🎜🎜 # 507 kB 4kB#🎜🎜 #

1857kB

+71.3%단일 테스트 결과 컴파일이 실제 사용을 나타내지 않을 수 있습니다. 이 경우 다음은 PhpParser를 사용한 전체 프로젝트 테스트의 결과입니다: 🎜🎜#TIMEMEMORY2360kB

php-ast diff
25.5ms 22.8ms -11.8% #🎜 🎜#
# 🎜🎜 #2482kB +5.1% #🎜 🎜##🎜 🎜#

테스트 결과, AST를 사용한 후 프로그램의 전체 실행 시간이 약 10%~15% 향상되었지만 메모리 소비도 증가하는 것으로 나타났습니다. 대용량 파일을 한 번 컴파일할 때 그 증가는 명백하지만 그렇습니다. 전체 프로젝트 실행 과정에서 증가하지 않습니다. 심각한 문제는 아닙니다.

또한 위의 결과는 모두 Opcache를 사용하지 않은 결과이므로 프로덕션 환경에서 Opcache를 켜면 메모리 소비 증가는 큰 문제가 되지 않습니다.

의미적 변경

단순한 시간 최적화라면 AST를 사용할 이유가 충분하지 않은 것 같습니다. 실제로 AST 구현은 시간 최적화 고려사항이 아니라 구문 문제를 해결하기 위한 것입니다. 의미론의 몇 가지 변화를 살펴보겠습니다.

yield에는 대괄호가 필요하지 않습니다.

PHP5 구현에서 yield에서는 <code>yield 선언의 양쪽에 대괄호를 사용해야 합니다: yield,你必须在 yield 申明两边使用括号:

<?php
$result = yield fn(); // 不合法的
$result = (yield fn()); // 合法的

这种行为仅仅是因为 PHP5 的实现方式的限制,在 PHP7 中,括号不再是必须的了。所以下面这些写法也都是合法的:

<?php
$result = yield;
$result = yield $v;
$result = yield $k => $v;

当然了,还得遵循 yield 的应用场景才行。

括号不影响行为

在 PHP5 中,($foo)['bar'] = 'baz'$foo['bar'] = 'baz' 两个语句的含义不一样。事实上前一种写法是不合法的,你会得到下面这样的错误:

<?php
($foo)[&#39;bar&#39;] = &#39;baz&#39;;
# PHP Parse error: Syntax error, unexpected &#39;[&#39; on line 1

但是在 PHP7 中,两种写法表示同样的意思。

同样,如果函数的参数被括号包裹,类型检查存在问题,在 PHP7 中这个问题也得到了解决:

<?php
function func() {
 return [];
}
function byRef(array &$a) {
}
byRef((func()));

以上代码在 PHP5 中不会告警,除非使用 byRef(func()) 的方式调用,但是在 PHP7 中,不管 func() 两边有没有括号都会产生以下错误:

PHP Strict standards:  Only variables should be passed by reference ...

list() 的变化

list 关键字的行为改变了很多。list 给变量赋值的顺序(等号左右同时的顺序)以前是从右至左,现在是从左到右:

<?php
list($array[], $array[], $array[]) = [1, 2, 3];
var_dump($array);
// PHP5: $array = [3, 2, 1]
// PHP7: $array = [1, 2, 3]
# 注意这里的左右的顺序指的是等号左右同时的顺序,
# list($a, $b) = [1, 2] 这种使用中 $a == 1, $b == 2 是没有疑问的。

产生上面变化的原因正是因为在 PHP5 的赋值过程中,3 会最先被填入数组,1 最后,但是现在顺序改变了。

同样的变化还有:

<?php
$a = [1, 2];
list($a, $b) = $a;
// PHP5: $a = 1, $b = 2
// PHP7: $a = 1, $b = null + "Undefined index 1"

这是因为在以前的赋值过程中 $b 先得到 2,然后 $a 的值才变成 1,但是现在 $a 先变成了 1,不再是数组,所以 $b 就成了 null。

list 现在只会访问每个偏移量一次:

<?php
list(list($a, $b)) = $array;
// PHP5:
$b = $array[0][1];
$a = $array[0][0];
// PHP7:
// 会产生一个中间变量,得到 $array[0] 的值
$_tmp = $array[0];
$a = $_tmp[0];
$b = $_tmp[1];

空的 list 成员现在是全部禁止的,以前只是在某些情况下:

<?php
list() = $a;   // 不合法
list($b, list()) = $a; // 不合法
foreach ($a as list()) // 不合法 (PHP5 中也不合法)

引用赋值的顺序

引用赋值的顺序在 PHP5 中是从右到左的,现在时从左到右:

<?php
$obj = new stdClass;
$obj->a = &$obj->b;
$obj->b = 1;
var_dump($obj);
// PHP5:
object(stdClass)#1 (2) {
 ["b"] => &int(1)
 ["a"] => &int(1)
}
// PHP7:
object(stdClass)#1 (2) {
 ["a"] => &int(1)
 ["b"] => &int(1)
}

__clone 方法可以直接调用

现在可以直接使用 $obj->__clone() 的写法去调用 __clone 方法。__clonerrreee

이 동작은 PHP5에서 대괄호 구현의 제한 때문입니다. 더 이상 필수가 아닙니다. 따라서 다음 작성 방법도 적법합니다.

rrreee

물론 yield의 적용 시나리오를 따라야 합니다.

괄호는 동작에 영향을 주지 않습니다

PHP5에서는 ($foo)['bar'] = 'baz'$foo ['bar'] = 'baz' 두 문은 서로 다른 의미를 갖습니다. 사실, 이전 작성 방법은 불법이며 다음과 같은 오류가 발생합니다:

rrreee

그러나 PHP7에서는 두 가지 작성 방법이 동일한 의미를 갖습니다. 마찬가지로 함수의 매개변수가 괄호 안에 있으면 유형 검사에 문제가 있습니다. 이 문제는 PHP7에서도 해결되었습니다. rrreee# 🎜🎜#PHP 엄격한 표준: 변수만 참조로 전달되어야 합니다... changes in list() list 동작 키워드가 많이 바뀌었어요. 목록이 변수에 값을 할당하는 순서(동시에 등호 주위의 순서)는 오른쪽에서 왼쪽이었지만 이제는 왼쪽에서 오른쪽입니다: rrreeeThe 위의 변경 이유는 정확히 PHP5의 할당 프로세스 때문입니다. 배열에 3이 먼저 채워지고 1이 마지막에 채워지지만 이제 순서가 변경되었습니다. 동일한 변경 사항은 다음과 같습니다. 이전 할당 과정에서 $b가 먼저 2를 얻은 후 $a의 값이 1이 되었지만 지금은 $ a 첫 번째는 1이 되고 더 이상 배열이 아니므로 $b는 null이 됩니다. list는 이제 각 오프셋에 한 번만 액세스합니다. rrreee 이전에는 특정 상황에서만 빈 목록 구성원이 모두 금지되었습니다. #🎜🎜 #rrreeerrreee이제 $obj->__clone()의 쓰기 메서드를 직접 사용하여 __clone 메서드를 호출할 수 있습니다. __clone은 이전에 직접 호출이 금지된 유일한 매직 메서드입니다. 이전에는 다음과 같은 오류가 발생했습니다. 새 구현에서는 이전 문법 표현의 의미가 현재와 다소 다릅니다. 자세한 내용은 아래 표를 참조하세요. #🎜 🎜#PHP7
위 코드 byRef(func())를 사용하여 호출하지 않는 한 PHP5에서는 경보가 발생하지 않지만 PHP7에서는 func()의 양쪽에 괄호가 있는지 여부에 관계없이 다음 오류가 발생합니다. code>:
rrreee
The 참조 할당 순서 참조 할당 순서는 PHP5에서 오른쪽에서 왼쪽으로, 현재 시제는 왼쪽에서 오른쪽으로: __clone 메서드를 호출할 수 있습니다. 직접
치명적인 오류: 개체에 대해 __clone() 메서드를 호출할 수 없습니다. - ...에서 대신 'clone $obj'를 사용하세요. Variable 구문 일관성 AST는 또한 다른 RFC에서 해결된 일부 구문 일관성 문제도 해결합니다. 제안: https:// wiki.php.net/rfc/uniform_variable_syntax.
Expression PHP5
# 🎜 🎜## 🎜🎜#$$foo['bar']['baz']

${$foo['bar']['baz']}

($$ foo)['bar']['baz']


$foo->$bar['baz']

#🎜🎜 #$foo ->{$bar['baz']}

($foo->$bar)['baz']

# 🎜🎜# $foo->$bar['baz']()$foo->{$bar['baz']}()

#🎜🎜#( $foo- >$bar)['baz']()#🎜🎜##🎜🎜##🎜🎜##🎜🎜#Foo::$bar['baz']()#🎜🎜##🎜🎜 #Foo: :{$bar['baz']}()#🎜🎜##🎜🎜#(Foo::$bar)['baz']()#🎜🎜##🎜🎜##🎜🎜## 🎜🎜# #🎜🎜# 전체적으로 이전 순서는 오른쪽에서 왼쪽이었지만 이제는 왼쪽에서 오른쪽이며 괄호가 동작에 영향을 주지 않는다는 원칙도 따릅니다. 이러한 복잡한 변수 작성 방식은 실제 개발 시 주의가 필요합니다. #🎜🎜##🎜🎜#관련 권장 사항: #🎜🎜##🎜🎜##🎜🎜#PHP 오류 에코 정보를 끄는 방법을 가르치는 5가지 방법#🎜🎜##🎜🎜##🎜🎜##🎜 🎜 ##🎜🎜#PHP 소스 코드의 FastCGI 프로토콜 분석#🎜🎜##🎜🎜##🎜🎜##🎜🎜##🎜🎜##🎜🎜#

위 내용은 PHP7의 새로운 기능 중 추상 구문 트리(AST)에 대한 일부 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
과대 광고 : 오늘 PHP의 역할을 평가합니다과대 광고 : 오늘 PHP의 역할을 평가합니다Apr 12, 2025 am 12:17 AM

PHP는 현대적인 프로그래밍, 특히 웹 개발 분야에서 강력하고 널리 사용되는 도구로 남아 있습니다. 1) PHP는 사용하기 쉽고 데이터베이스와 완벽하게 통합되며 많은 개발자에게 가장 먼저 선택됩니다. 2) 동적 컨텐츠 생성 및 객체 지향 프로그래밍을 지원하여 웹 사이트를 신속하게 작성하고 유지 관리하는 데 적합합니다. 3) 데이터베이스 쿼리를 캐싱하고 최적화함으로써 PHP의 성능을 향상시킬 수 있으며, 광범위한 커뮤니티와 풍부한 생태계는 오늘날의 기술 스택에 여전히 중요합니다.

PHP의 약한 참고 자료는 무엇이며 언제 유용합니까?PHP의 약한 참고 자료는 무엇이며 언제 유용합니까?Apr 12, 2025 am 12:13 AM

PHP에서는 약한 참조가 약한 회의 클래스를 통해 구현되며 쓰레기 수집가가 물체를 되 찾는 것을 방해하지 않습니다. 약한 참조는 캐싱 시스템 및 이벤트 리스너와 같은 시나리오에 적합합니다. 물체의 생존을 보장 할 수 없으며 쓰레기 수집이 지연 될 수 있음에 주목해야합니다.

PHP의 __invoke 마법 방법을 설명하십시오.PHP의 __invoke 마법 방법을 설명하십시오.Apr 12, 2025 am 12:07 AM

\ _ \ _ 호출 메소드를 사용하면 객체를 함수처럼 호출 할 수 있습니다. 1. 객체를 호출 할 수 있도록 메소드를 호출하는 \ _ \ _ 정의하십시오. 2. $ obj (...) 구문을 사용할 때 PHP는 \ _ \ _ invoke 메소드를 실행합니다. 3. 로깅 및 계산기, 코드 유연성 및 가독성 향상과 같은 시나리오에 적합합니다.

동시성에 대해 PHP 8.1의 섬유를 설명하십시오.동시성에 대해 PHP 8.1의 섬유를 설명하십시오.Apr 12, 2025 am 12:05 AM

섬유는 PHP8.1에 도입되어 동시 처리 기능을 향상시켰다. 1) 섬유는 코 루틴과 유사한 가벼운 동시성 모델입니다. 2) 개발자는 작업의 실행 흐름을 수동으로 제어 할 수 있으며 I/O 집약적 작업을 처리하는 데 적합합니다. 3) 섬유를 사용하면보다 효율적이고 반응이 좋은 코드를 작성할 수 있습니다.

PHP 커뮤니티 : 자원, 지원 및 개발PHP 커뮤니티 : 자원, 지원 및 개발Apr 12, 2025 am 12:04 AM

PHP 커뮤니티는 개발자 성장을 돕기 위해 풍부한 자원과 지원을 제공합니다. 1) 자료에는 공식 문서, 튜토리얼, 블로그 및 Laravel 및 Symfony와 같은 오픈 소스 프로젝트가 포함됩니다. 2) 지원은 StackoverFlow, Reddit 및 Slack 채널을 통해 얻을 수 있습니다. 3) RFC에 따라 개발 동향을 배울 수 있습니다. 4) 적극적인 참여, 코드에 대한 기여 및 학습 공유를 통해 커뮤니티에 통합 될 수 있습니다.

PHP vs. Python : 차이점 이해PHP vs. Python : 차이점 이해Apr 11, 2025 am 12:15 AM

PHP와 Python은 각각 고유 한 장점이 있으며 선택은 프로젝트 요구 사항을 기반으로해야합니다. 1.PHP는 간단한 구문과 높은 실행 효율로 웹 개발에 적합합니다. 2. Python은 간결한 구문 및 풍부한 라이브러리를 갖춘 데이터 과학 및 기계 학습에 적합합니다.

PHP : 죽어 가거나 단순히 적응하고 있습니까?PHP : 죽어 가거나 단순히 적응하고 있습니까?Apr 11, 2025 am 12:13 AM

PHP는 죽지 않고 끊임없이 적응하고 진화합니다. 1) PHP는 1994 년부터 새로운 기술 트렌드에 적응하기 위해 여러 버전 반복을 겪었습니다. 2) 현재 전자 상거래, 컨텐츠 관리 시스템 및 기타 분야에서 널리 사용됩니다. 3) PHP8은 성능과 현대화를 개선하기 위해 JIT 컴파일러 및 기타 기능을 소개합니다. 4) Opcache를 사용하고 PSR-12 표준을 따라 성능 및 코드 품질을 최적화하십시오.

PHP의 미래 : 적응 및 혁신PHP의 미래 : 적응 및 혁신Apr 11, 2025 am 12:01 AM

PHP의 미래는 새로운 기술 트렌드에 적응하고 혁신적인 기능을 도입함으로써 달성 될 것입니다. 1) 클라우드 컴퓨팅, 컨테이너화 및 마이크로 서비스 아키텍처에 적응, Docker 및 Kubernetes 지원; 2) 성능 및 데이터 처리 효율을 향상시키기 위해 JIT 컴파일러 및 열거 유형을 도입합니다. 3) 지속적으로 성능을 최적화하고 모범 사례를 홍보합니다.

See all articles

핫 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. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25 : Myrise에서 모든 것을 잠금 해제하는 방법
3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

Dreamweaver Mac版

Dreamweaver Mac版

시각적 웹 개발 도구

맨티스BT

맨티스BT

Mantis는 제품 결함 추적을 돕기 위해 설계된 배포하기 쉬운 웹 기반 결함 추적 도구입니다. PHP, MySQL 및 웹 서버가 필요합니다. 데모 및 호스팅 서비스를 확인해 보세요.

Eclipse용 SAP NetWeaver 서버 어댑터

Eclipse용 SAP NetWeaver 서버 어댑터

Eclipse를 SAP NetWeaver 애플리케이션 서버와 통합합니다.

VSCode Windows 64비트 다운로드

VSCode Windows 64비트 다운로드

Microsoft에서 출시한 강력한 무료 IDE 편집기

PhpStorm 맥 버전

PhpStorm 맥 버전

최신(2018.2.1) 전문 PHP 통합 개발 도구