>  기사  >  백엔드 개발  >  PHP 원리 및 변수에 대한 심층적인 이해(PHP 내부 변수)

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

angryTom
angryTom앞으로
2019-10-15 13:35:131944검색

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으로 문의하시기 바랍니다. 삭제