PHP变量在zend内核中的储存方式
PHP变量在zend内核中的存储方式
PHP中的变量可以保存任何的数据类型,这是因为它是弱类型语言。但php是用C语言编写的,C语言是强类型语言,每个变量都有固定的类型,不能随意改变变量的类型(可以通过强制类型转变,不过有可能出现问题),在zend引擎中是怎样可以做到一个变量保存任何类型的呢?
在zend/zend.h头文件中,会发现下面的结构体:
<code>typedef struct _zval_struct zval;typedef union _zvalue_value { long lval; double dval; struct { char *val; int len; }str; HashTable *ht; zend_object_value obj;} zvalue_value ;struct _zval_struct { zvalue_value value; zend_uint refcount; zend_uchar type; zend_uchar is_ref;};</code>
zval结构体就是通常用到的PHP变量在内核中的表达方式。在zval结构体中,可以看到4个成员变量,分别是:
<code>zvalue_value value; //变量的值,PHP变量的值就保存在这里zend_uint refcount; //变量引用数,变量引用计算器zend_uchar type; //变量的类型zend_uchar is_ref; //变量是否被引用</code>
zval结构体的value成员变量是一个zvalue_value联合体,PHP能够保持任何的结构类型就是因为这个联合体 。从zvalue_value联合体的成员变量中可以看到,不同类型会保存到不同的成员变量中,这样就实现了PHP变量可以存储任何数据类型。例如,当变量是整数类型时,会保存到value的lval成员变量中;当变量的类型是字符串时,又会保存到value的str成员变量中。
还有一个问题,就是zend引擎是怎么知道这个变量保存的是什么类型呢?我们注意到,zval结构体中有个type成员变量,这个成员变量就是要保存一个php变量的类型。
zend引擎定义了8中变量类型:
<code>#define IS_NULL 0#define IS_LONG 1#define IS_DOUBLE 2#define IS_STRING 3#define IS_ARRAY 4#define IS_OBJECT 5#define IS_BOOL 6#define IS_RESOURCE 7</code>
每一个宏定义对应php语言层的一种类型,例如当zval的type成员变量等于IS_STRING时(zval.type==IS_STRING
),说明这个变量的类型是字符串类型。
版权声明:本文为博主原创文章,未经博主允许不得转载。

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











정의는 `\`를 사용하여 정의를 위해 `do { \ printf("%d\n", x) while (0)`을 여러 줄로 나누어 여러 줄 매크로를 정의합니다. 매크로 정의에서 백슬래시 '\'는 매크로 정의의 마지막 문자여야 하며 뒤에 공백이나 주석이 올 수 없습니다. 줄 연속을 위해 `\`를 사용할 때는 코드를 읽을 수 있도록 주의하고 각 줄 끝에 `\`가 있는지 확인하세요.

PHP에서 정의 함수의 중요성과 역할 1. 정의 함수에 대한 기본 소개 PHP에서 정의 함수는 상수를 정의하는 데 사용되는 핵심 함수입니다. 상수는 프로그램 실행 중에 값을 변경하지 않습니다. 정의 함수를 사용하여 정의된 상수는 스크립트 전체에서 액세스할 수 있으며 전역적입니다. 2. 정의 함수의 구문 정의 함수의 기본 구문은 다음과 같습니다: Define("상수 이름","상수 값&qu

PHP 구현 프레임워크: ZendFramework 입문 튜토리얼 ZendFramework는 PHP에서 개발하고 현재 ZendTechnologies에서 유지 관리하는 오픈 소스 웹 사이트 프레임워크입니다. ZendFramework는 MVC 디자인 패턴을 채택하고 Web2.0 애플리케이션 및 Web Serve 구현을 지원하기 위한 재사용 가능한 코드 라이브러리 시리즈를 제공합니다. ZendFramework는 PHP 개발자들에게 매우 인기 있고 존경받고 있으며 다양한 기능을 갖추고 있습니다.

Zend Framework에서 권한 제어를 위해 ACL(AccessControlList)을 사용하는 방법 소개: 웹 애플리케이션에서 권한 제어는 중요한 기능입니다. 이는 사용자가 액세스 권한이 있는 페이지와 기능에만 액세스할 수 있도록 하고 무단 액세스를 방지합니다. Zend 프레임워크는 ACL(AccessControlList) 구성 요소를 사용하여 권한 제어를 구현하는 편리한 방법을 제공합니다. 이 기사에서는 Zend Framework에서 ACL을 사용하는 방법을 소개합니다.

PHP에서 변수를 정의할 때 유형을 선언할 필요가 없습니다. 처음에는 변수 $a에 정수 값을 할당하고 나중에 다른 유형으로 쉽게 변경할 수 있습니다. 그렇다면 이 변수 $a는 PHP 소스 코드에 어떻게 저장됩니까? 이 질문을 염두에 두고 PHP의 소스 코드를 살펴보겠습니다.

정의 조건부 컴파일은 `#ifdef`, `#ifndef`, `#if`, `#elif`, `#else` 및 `#endif` 전처리 지시문을 사용하여 수행할 수 있습니다.

함수 매크로 정의 사용법: 1. 간단한 계산 매크로 "#define SQUARE(x) ((x) * (x))"를 정의합니다. 2. 여러 매개변수가 있는 매크로 정의 "#define MAX(a , b) ) ((a) > (b) ? (a) : (b))"; 3. 복잡한 표현식으로 매크로를 정의합니다. "#define ABS(x) ((x) < 0 ? -(x ) : (x) )”.

typedef와 정의의 차이점은 유형 검사, 범위, 가독성, 오류 처리, 메모리 사용량 등에 있습니다. 자세한 소개: 1. 유형 검사, typedef에 의해 정의된 유형 별칭은 실제 유형이므로 유형 검사가 수행되는 반면, 정의에 의해 정의된 매크로는 단순한 텍스트 교체일 뿐이며 유형 검사는 수행되지 않습니다. , typedef에 의해 정의된 유형 별칭의 범위는 로컬이며 현재 범위 내에서만 유효한 반면, 정의에 의해 정의된 매크로는 전역이며 어디에서나 사용할 수 있습니다. 3. 가독성 등.
