php 全局变量:PHP源码分析-弱类型变量实现
PHP是弱类型,动态的语言脚本。在申明一个变量的时候,并不需要指明它保存的数据类型。
例如:
$var = 1;
$var = "variable";
$var = 1.00;
$var = array();
$var = new Object();
动态变量,在运行期间是可以改变的,并且在使用前无需声明变量类型。
那么,问题一、Zend引擎是如何用C实现这种弱类型的呢?
实际上,在PHP中声明的变量,在ZE中都是用结构体zval来保存的。
首先我们打开Zend/zend.h来看zval的定义:
typedef struct _zval_struct zval;
struct _zval_struct {
/* Variable information */
zvalue_value value; /* value */
zend_uint refcount__gc;
zend_uchar type; /* active type */
zend_uchar is_ref__gc;
};
typedef union _zvalue_value {
long lval; /* long value */
double dval; /* double value */
struct {
char *val;
int len;
} str;
HashTable *ht; /* hash table value */
zend_object_value obj;
} zvalue_value;
Zend/zend_types.h:
typedef unsigned char zend_bool;
typedef unsigned char zend_uchar;
typedef unsigned int zend_uint;
typedef unsigned long zend_ulong;
typedef unsigned short zend_ushort;
从上述代码中,可以看到_zvalue_value是真正保存数据的关键部分。通过共用体实现的弱类型变量声明
问题二、Zend引擎是如何判别、存储PHP中的多种数据类型的呢?
_zval_struct.type中存储着一个变量的真正类型,根据type来选择如何获取zvalue_value的值。
type值列表(Zend/zend.h):
#define IS_NULL 0
#define IS_LONG 1
#define IS_DOUBLE 2
#define IS_BOOL 3
#define IS_ARRAY 4
#define IS_OBJECT 5
#define IS_STRING 6
#define IS_RESOURCE 7
#define IS_CONSTANT 8
#define IS_CONSTANT_ARRAY 9
来看一个简单的例子:
$a = 1;
//此时zval.type = IS_LONG,那么zval.value就去取lval.
$a = array();
//此时zval.type = IS_ARRAY,那么zval.value就去取ht.
这其中最复杂的,并且在开发第三方扩展中经常需要用到的是"资源类型".
在PHP中,任何不属于PHP的内建的变量类型的变量,都会被看作资源来进行保存。 本文链接http://www.cxybl.com/html/wlbc/Php/20121213/34971.html

핫 AI 도구

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

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

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

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

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

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

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

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

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

뜨거운 주제











typedef struct는 C 언어에서 구조 사용을 단순화하기 위해 구조 유형 별칭을 만드는 데 사용됩니다. 구조 별칭을 지정하여 기존 구조에 새 데이터 유형의 별칭을 지정합니다. 향상된 가독성, 코드 재사용 및 유형 확인 등의 이점이 있습니다. 참고: 별칭을 사용하기 전에 구조를 정의해야 합니다. 별칭은 프로그램에서 고유해야 하며 선언된 범위 내에서만 유효해야 합니다.

typedef를 사용하면 기존 데이터 유형에 대한 새 별칭을 만들 수 있습니다. typedef를 사용하면 특히 복잡한 데이터 유형을 처리할 때 코드의 가독성과 유지 관리 용이성을 높일 수 있습니다. 정수, 부동 소수점 숫자 또는 문자와 같은 간단한 데이터 유형의 경우 별칭 사용의 이점이 명확하지 않습니다. 그러나 포인터, 구조, 배열 및 함수와 같은 복잡한 데이터 유형의 경우 별칭을 사용하면 이점이 분명합니다. typedef는 변수나 함수 정의 이전에 사용할 수 없으며 일반적으로 프로그램 파일 상단이나 구조 정의 뒤에 생성됩니다.

C++에서 함수 포인터를 사용할 때 함정을 피하기 위해 메모리 관리를 신중하게 고려해야 합니다. 이러한 트랩에는 매달린 포인터(해당 범위 외부의 함수를 가리키는)와 와일드 포인터(초기화되지 않거나 nullptr로 설정되지 않는 함수 포인터)가 포함됩니다. 이러한 함정을 피하려면 항상 함수 포인터를 초기화하고, 메모리를 신중하게 관리하고, 스마트 포인터를 사용하는 모범 사례를 따르십시오. 이렇게 하면 함수 포인터를 안전하게 사용할 수 있고 포인터 트랩에 빠지는 것을 피할 수 있습니다.

Linux 커널 타이머와 지연 작업은 예약된 작업과 지연된 실행 작업을 구현하는 데 일반적으로 사용되는 두 가지 메커니즘입니다. 이를 통해 드라이버는 하드웨어 장치의 요구 사항과 특성에 맞게 적절한 시점에 특정 기능을 실행할 수 있습니다. 그러나 지연 작업을 위해 Linux 커널 타이머를 어떻게 적절하게 사용합니까? 이 기사에서는 Linux 커널 타이머 및 지연 작업 드라이버 개발에 대한 기본 지식과 기술을 이론적, 실무적 측면뿐만 아니라 몇 가지 일반적인 문제와 솔루션을 통해 소개합니다. 커널 타이머 소프트웨어의 타이머는 궁극적으로 하드웨어 시계에 의존합니다. 간단히 말해서 커널은 시계 인터럽트가 발생한 후 커널에 등록된 각 타이머가 만료되었는지 여부를 감지하고 해당 등록 기능을 다시 호출합니다. 이것은 하반부에 대한 인터럽트입니다. 현실

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

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

C로 간단한 불꽃놀이 코드를 작성하려면 다음 단계를 따라야 합니다. 헤더 파일과 라이브러리를 포함합니다. 상수와 매크로를 정의합니다. 입자 데이터 구조를 만듭니다. 전역 변수를 선언합니다. main() 함수에서 불꽃놀이 입자를 초기화합니다. 게임 루프에서 입자의 위치와 속도를 업데이트하고 그립니다. 수명이 다한 입자를 확인하고 파괴하십시오.

typedef struct와 struct의 차이점: typedef struct는 구조 유형의 별칭을 생성하는 반면 struct는 새로운 구조 유형을 정의합니다. typedef struct로 생성된 별칭은 선언된 후에 사용할 수 있고, struct로 정의된 구조체는 정의된 후에 사용할 수 있습니다. typedef 구조체나 구조체 모두 추가 저장 공간을 생성하지 않습니다.
