PHP 원리의 변수 분석(Variables inside PHP)

2620 단어 PHP변수
혹시 아시겠지만, 혹시 모르시겠지만, PHP는 약한 유형의 동적 스크립트 언어입니다.약한 유형이란 PHP가 변수 유형을 엄격하게 검증하지 않는다는 것이다(엄격하게 말하면 PHP는 중강 유형 언어로 이 부분은 이후의 글에서 서술할 것이다). 변수를 설명할 때 저장된 데이터의 유형을 표시할 필요가 없다.동적 언어, 즉 PHP의 언어 구조는 운행 기간에 바뀔 수 있다. 예를 들어 우리가 운행 기간에require에서 함수 정의 파일을 정의하여 언어의 함수표 동적 변화를 초래한다.
스크립트 언어란 PHP가 독립적으로 실행되는 것이 아니라 PHP를 실행하려면 PHP 해상도가 필요합니다

<?php
  $var = 1; //int
  $var = "laruence"; //string
  $var = 1.0002; //float
  $var = array(); // array
  $var = new Exception('error'); //object;
제 앞의 글에서 말했듯이 PHP의 실행은 Zendengine(ZE,Zend 엔진)를 통해서ZE는 C로 작성되었습니다. 여러분은 C가 강한 유형의 언어라는 것을 알고 있습니다. 즉, C에서 모든 변수가 최종적으로 소각될 때까지 하나의 유형의 데이터만 저장할 수 있습니다.그러면 PHP는 어떻게 ZE를 바탕으로 약한 유형을 실현합니까?
PHP에서 모든 변수는 하나의 구조-zval로 저장됩니다. Zend/zend.h에서 우리는 zval의 정의를 볼 수 있다

  /usr/bin/php -f example.ph
그중 zvalue_value는 진정으로 데이터를 저장하는 관건적인 부분이다. 이제 수수께끼를 풀 때가 되었다. PHP는 어떻게 ZE를 바탕으로 약한 유형을 실현할 수 있을까?왜냐하면 zvalue_value는 연합체(union)입니다

  typedef struct _zval_struct {
    zvalue_value value;
    zend_uint refcount;
    zend_uchar type;
    zend_uchar is_ref;
  } zval;
그러면 이 구조는 어떻게 PHP의 다양한 유형을 저장합니까?
PHP에서 흔히 볼 수 있는 변수 유형은 다음과 같습니다. 1.정형/부동점/장정형/bool값 등등 2.문자열 3.배열/연관 배열 4.대상리소스
PHP는 zval의 type 필드에 따라 변수의 진정한 형식을 저장하고 type에 따라 zvalue_를 가져오는 방법을 선택합니다value의 값, 예를 들어 정형과 bool 값:

typedef union _zvalue_value {
    long lval;
    double dval;
    struct {
        char *val;
        int len;
    } str;
    HashTable *ht;
    zend_object_value obj;
} zvalue_value;
zval을 찾으러 갑니다.value.lval,bool값에 대해 lval∈(0|1);만약 이중 정밀도이나float는 zval을 찾으러 갈 것이다.value의 dval입니다.문자열이라면:

   zval.type = IS_LONG;//
   zval.type = IS_BOOL;//
이럴 때:zval.value.str 이것도 구조입니다. C 칸의 문자열과 문자열의 길이가 저장되어 있습니다.반면 그룹과 대상의 경우 type은 각각 IS_ARRAY, IS_OBJECT, 그에 상응하는 것은 각각 zval을 취한다.value.ht와obj는 비교적 특별한 것이 자원이다. PHP에서 자원은 매우 특별한 변수이다. PHP에 내장된 변수 유형에 속하지 않는 모든 변수는 자원으로 간주되어 저장된다. 예를 들어 데이터베이스 핸들, 열린 파일 핸들 등이다.리소스의 경우:

   zval.type = IS_STRIN
이럴 때 zval을 찾으러 갑니다.value.lval, 이때의 lval은 정형적인 지시기입니다. 그리고 PHP는 이 지시기에 따라 PHP에 만들어진 자원 목록에서 대응하는 자원을 조회합니다. (이 부분의 내용은 제가 나중에 단독으로 글을 하나 열어 소개할 것입니다.) 현재, 당신은 이때의 lval이 마치 자원 체인표에 대응하는 편이값이라는 것을 알기만 하면 됩니다

   type = IS_RESOURC
이런 메커니즘을 빌려 PHP는 약한 유형을 실현했다. 왜냐하면 ZE에 대해 말하자면 그것이 직면하는 것은 영원히 같은 유형이고 그것이 바로 zval이기 때문이다.

좋은 웹페이지 즐겨찾기