>  기사  >  백엔드 개발  >  PHP 변수의 구성과 유형

PHP 변수의 구성과 유형

墨辰丷
墨辰丷원래의
2018-06-05 16:44:271936검색

이 글은 주로 PHP 변수의 구성과 종류를 소개합니다. 관심있는 친구들이 참고하시면 좋을 것 같습니다.

PHP 변수 구성 요소:

변수 이름: PHP 언어의 변수 이름은 $ + 영어/밑줄로 시작하고 숫자, 밑줄, 문자를 포함할 수 있으며 대소문자를 구분합니다. 동시에 PHP는 $$A 형태의 복합 변수도 지원하여 PHP의 역동성을 향상시킵니다.

유형: PHP는 약한 유형의 언어이며 모든 유형의 값을 할당할 수 있습니다.

콘텐츠: 동시에 하나의 값만 있을 수 있습니다.

PHP 언어에는 8가지 주요 범주가 있습니다:

1. 스칼라 유형: 부울, 정수, 부동 소수점, 문자열

2. 3. 특수 유형: NULL, 리소스

php는 구현 내에서 모든 변수는 변수 값뿐만 아니라 변수 유형도 포함하는 zval 구조를 통해 데이터를 저장합니다. 는 PHP의 약한 유형의 핵심입니다.

zval 데이터 구조:

struct _zval_struct{
  zvalue_value value;    //存储变量的值
  zend_unint  refcount_gc; //引用计数
  zend_char  is_ref_gc;  // 是否为引用
  zend_char  type;     //存储变量的类型
}

그 중 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 내부의 많은 구현은 변수 범위, 함수 테이블, 클래스 속성, 메서드 등 해시 테이블을 기반으로 합니다. Zend 엔진 내부의 많은 데이터는 테이블의 해시에 저장됩니다.

PHP 배열은 해시 테이블을 사용하여 관련 데이터를 저장합니다. 해시 테이블 구현은 HashTable과 Bucket의 두 가지 데이터 구조를 사용합니다.

HashTable:

typedef struct _hashtable { 
  uint nTableSize;    // hash Bucket的大小,最小为8,以2x增长。
  uint nTableMask;    // nTableSize-1 , 索引取值的优化
  uint nNumOfElements;  // hash Bucket中当前存在的元素个数,count()函数会直接返回此值 
  ulong nNextFreeElement; // 下一个数字索引的位置
  Bucket *pInternalPointer;  // 当前遍历的指针(foreach比for快的原因之一)
  Bucket *pListHead;     // 存储数组头元素指针
  Bucket *pListTail;     // 存储数组尾元素指针
  Bucket **arBuckets;     // 存储hash数组
  dtor_func_t pDestructor;  // 在删除元素时执行的回调函数,用于资源的释放
  zend_bool persistent;    // 指出了Bucket内存分配的方式。如果persisient为TRUE,
                  则使用操作系统本身的内存分配函数为Bucket分配内存,否则使用
                  PHP的内存分配函数。
  unsigned char nApplyCount; // 标记当前hash Bucket被递归访问的次数(防止多次递归)
  zend_bool bApplyProtection;// 标记当前hash桶允许不允许多次访问,不允许时,最多只能递归3次
#if ZEND_DEBUG
  int inconsistent;
#endif
} HashTable;
HashTable의 용량 확장은 항상 초기 크기에 가깝게 조정됩니다. 2의 정수제곱. 이유:

슬롯을 선택할 때 모듈로 연산 대신 & 연산이 사용됩니다. 이는 모듈로 연산이 비트 AND 연산보다 상대적으로 더 비싸기 때문입니다. 마스크의 기능은 해시 값을 슬롯이 저장할 수 있는 인덱스 범위에 매핑하는 것입니다. 예를 들어 특정 키의 인덱스 값은 21이고 해시 테이블의 크기는 8이며 마스크는 7이고 합계의 이진수 표현은 10101 & 111 = 101이며 십진수로는 5입니다. 2의 정수 -1 거듭제곱이 특별하기 때문에 다음 N 비트의 값은 모두 1이므로 일반 숫자이고 이진수로 결합된 경우 값을 매핑하기가 더 쉽습니다. , 해시 값 결과에 영향을 미칩니다. 그러면 해시 함수로 계산된 값의 평균 분포가 영향을 받을 수 있습니다.

bucket:

typedef struct bucket {
  ulong h;      // 对char *key进行hash后的值,或者是用户指定的数字索引值
  uint nKeyLength;  // hash关键字的长度,如果数组索引为数字,此值为0
  void *pData;    // 指向value,一般是用户数据的副本,如果是指针数据,则指向pDataPtr
  void *pDataPtr;   //如果是指针数据,此值会指向真正的value,同时上面pData会指向此值
  struct bucket *pListNext;  // 整个hash表的下一元素
  struct bucket *pListLast;  // 整个哈希表该元素的上一个元素
  struct bucket *pNext;    // 存放在同一个hash Bucket内的下一个元素
  struct bucket *pLast;    // 同一个哈希bucket的上一个元素
// 保存当前值所对于的key字符串,这个字段只能定义在最后,实现变长结构体
  char arKey[1];       
} Bucket;
해시 값은 해시 인덱스 대신 버킷에 저장됩니다.

위 구조의 마지막 필드는 키 문자열을 저장하는 데 사용되지만 이 필드는 실제로 하나의 문자로만 구성된 배열로 선언되며 이는 일반적인 가변 길이 구조이며 주요 목적은 유연성을 높이는 것입니다. . 다음은 해시 테이블에 새로운 요소를 삽입할 때 공간을 적용하는 코드입니다

p = (Bucket *) pemalloc(sizeof(Bucket) - 1 + nKeyLength, ht->persistent);
if (!p) {
  return FAILURE;
}
memcpy(p->arKey, arKey, nKeyLength);

삽입 과정 다이어그램

해시 알고리즘

PHP의 해시 함수는 DJBX33A 알고리즘을 사용하여 구현됩니다.

객체:

PHP 객체는 zend_object_value 데이터 구조를 사용하여 저장됩니다.

요약: 위 내용은 이 기사의 전체 내용입니다. 모든 사람의 학습에 도움이 되기를 바랍니다.

관련 권장사항:

PHP의 데이터 전송 CURL 예제 분석

XML 파일에 데이터를 추가하는 PHP의 간단한 공유 예제

PHP 기반 웹사이트 디렉토리 검색 색인 도구의 예제

위 내용은 PHP 변수의 구성과 유형의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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