PHP 원리 및 변수에 대한 심층적인 이해(PHP 내부 변수)

angryTom
풀어 주다: 2023-04-07 16:24:01
앞으로
1924명이 탐색했습니다.

PHP 원리 및 변수에 대한 심층적인 이해(PHP 내부 변수)

PHP는 약한 유형의 동적 스크립팅 언어라는 사실을 알고 계실 수도 있고 모르실 수도 있습니다. 약한 타입이라 불리는 것은 PHP가 변수 타입을 엄격하게 검증하지 않는다는 뜻입니다(엄밀히 말하면 PHP는 중간 정도의 강력한 타입의 언어입니다. 이 부분은 다음 글에서 설명하겠습니다). 필수 디스플레이는 저장하는 데이터 유형을 나타냅니다.

<?php
  $var = 1; //int
  $var = "laruence"; //string
  $var = 1.0002; //float
  $var = array(); // array
  $var = new Exception(&#39;error&#39;); //object;
로그인 후 복사

동적 언어, 즉, PHP의 언어 구조는 런타임 중에 변경될 수 있습니다. 예를 들어 런타임 중에 함수 정의 파일이 필요합니다. 언어의 동적 함수 테이블이 변경됩니다.

소위 스크립팅 언어는 PHP가 독립적으로 실행되지 않는다는 것을 의미합니다. PHP를 실행하려면 PHP 파서가 필요합니다.

/usr/bin/php -f example.php
로그인 후 복사

이전 기사에서 PHP는 Zend 엔진(ZE, Zend 엔진)을 통해 실행된다고 이미 언급했습니다. , ZE는 C로 작성되었습니다. C가 강력한 유형의 언어라는 것은 누구나 알고 있습니다. 즉, C의 모든 변수는 선언된 시점부터 최종적으로 소멸될 때까지 한 가지 유형의 데이터만 보유할 수 있습니다. 그렇다면 PHP는 ZE를 기반으로 약한 유형을 어떻게 구현합니까?

PHP에서는 모든 변수가 zval이라는 구조를 사용하여 저장됩니다. Zend/zend.h에서 zval의 정의를 볼 수 있습니다.

typedef struct _zval_struct {
    zvalue_value value;
    zend_uint refcount;
    zend_uchar type;
    zend_uchar is_ref;
  } zval;
로그인 후 복사

그중 zvalue_value는 실제로 데이터를 저장하는 핵심 부분입니다. 답을 밝힐 시간입니다. PHP는 ZE를 기반으로 약한 유형을 어떻게 구현합니까? zvalue_value는 공용체이기 때문에

typedef union _zvalue_value {
    long lval;
    double dval;
    struct {
        char *val;
        int len;
    } str;
    HashTable *ht;
    zend_object_value obj;
} zvalue_value;
로그인 후 복사

이 구조는 어떻게 PHP에서 여러 유형을 저장합니까?

PHP의 일반적인 변수 유형은 다음과 같습니다.

  • 1. 정수/부동 소수점/긴 정수/부울 값 등

  • 2. 배열/연관 배열

  • 4. 객체

  • 5. 리소스

  • PHP는 zval의 유형 필드를 기반으로 변수의 실제 유형을 저장한 다음 정수 및 유형을 기반으로 zvalue_value의 값을 얻는 방법을 선택합니다. bool 값:

       zval.type = IS_LONG;//整形
       zval.type = IS_BOOL;//布尔值
    로그인 후 복사
  • 부울 값 lval∈(0|1);

배정밀도 또는 부동 소수점인 경우 zval.value.lval을 가져오면 zval.value의 dval을 가져옵니다.

문자열인 경우:

   zval.type = IS_STRING
로그인 후 복사

이번에는 다음이 필요합니다.

zval.value.str

이 또한 C 형식으로 문자열과 길이를 저장하는 구조입니다. 끈. 배열과 객체의 경우 유형은 각각

IS_ARRAY, IS_OBJECT

에 해당하고 해당 유형은 각각

zval.value.ht 및 obj입니다.

더 특별한 점은 PHP에서 리소스는 매우 특별한 변수입니다. , PHP 내장 변수 유형에 속하지 않는 모든 변수는 데이터베이스 핸들, 열린 파일 핸들 등과 같은 저장용 리소스로 처리됩니다. 리소스의 경우:

   type = IS_RESOURCE
로그인 후 복사
이때

zval.value.lval

을 가져옵니다. 이때 lval은 정수 표시기입니다. 그러면 PHP는 다음을 기반으로 PHP에 내장된 리소스 목록에서 관련 리소스 목록을 쿼리합니다. 해당 리소스(이 부분은 추후 별도의 글로 소개하겠습니다), 지금은 lval이 리소스 연결 리스트에 해당하는 오프셋 값인 것으로 보인다는 것만 알아두면 됩니다.

 ZEND_FETCH_RESOURCE(con, type, zval *, default, resource_name, resource_type);
로그인 후 복사

이 메커니즘을 빌려 PHP는 약한 유형을 구현합니다. ZE의 경우 항상 동일한 유형, 즉 zval에 직면하기 때문입니다. 더 많은 PHP 관련 지식을 알고 싶다면

PHP 중국어 웹사이트

를 방문하세요!

위 내용은 PHP 원리 및 변수에 대한 심층적인 이해(PHP 내부 변수)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:www.laruence.com
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!