PHP7 커널 분석 8 등

不言
풀어 주다: 2023-03-23 18:10:01
원래의
1582명이 탐색했습니다.

이 글의 내용은 PHP7 커널 분석 8 등에 관한 내용입니다. 이제 필요한 친구들이 참고할 수 있습니다.

클래스는 컴파일 단계의 산물입니다. 컴파일이 완료되었습니다. 우리가 정의한 각 클래스는 클래스의 모든 정보를 저장하는 zend_class_entry를 생성합니다. 실행 단계 중 모든 클래스 관련 작업은 이 구조를 사용합니다

struct _zend_class_entry {
    char type;          //类的类型:内部类ZEND_INTERNAL_CLASS(1)、用户自定义类ZEND_USER_CLASS(2)
    zend_string *name;  //类名,PHP类不区分大小写,统一为小写
    struct _zend_class_entry *parent; //父类
    int refcount;
    uint32_t ce_flags;  //类掩码,如普通类、抽象类、接口,

    int default_properties_count;        //普通属性数,包括public、private
    int default_static_members_count;    //静态属性数,static
    zval *default_properties_table;      //普通属性值数组
    zval *default_static_members_table;  //静态属性值数组
    zval *static_members_table;
    HashTable function_table;  //成员方法哈希表
    HashTable properties_info; //成员属性基本信息哈希表,key为成员名,value为zend_property_info
    HashTable constants_table; //常量哈希表,通过constant定义的

    //以下是构造函授、析构函数、魔术方法的指针
    union _zend_function *constructor;
    union _zend_function *destructor;
    union _zend_function *clone;
    union _zend_function *__get;
    union _zend_function *__set;
    union _zend_function *__unset;
    union _zend_function *__isset;
    union _zend_function *__call;
    union _zend_function *__callstatic;
    union _zend_function *__tostring;
    union _zend_function *__debugInfo;
    union _zend_function *serialize_func;
    union _zend_function *unserialize_func;
}
로그인 후 복사


2. PHP에서는 클래스에서 변경되지 않은 값을 상수로 정의합니다. 상수를 정의하고 사용할 때 $ 기호를 사용할 필요는 없습니다. 상수의 값은 zend_class_entry.constants_table을 통해 저장됩니다.

常量的读取:

class my_class {
    const A1 = "hi";
}
echo my_class::A1;

编译到echo my_class::A1这行时首先会尝试检索下是否已经编译了my_class,如果能在CG(class_table)中找到,则进一步从类的contants_table查找对应的常量,找到的话则会复制其value替换常量,简单的讲就是类似C语言中的宏,编译时替换为实际的值了,而不是在运行时再去检索。

echo my_class::A1;

class my_class {
    const A1 = "hi";
}

在运行时再去检索。替换成为实际的值
로그인 후 복사

3. 멤버 속성


속성의 변수는 초기화될 수 있지만 초기화된 값은 상수여야 합니다. 여기서 상수는 PHP 스크립트가 컴파일 중에 해당 값을 얻을 수 있음을 의미합니다. public $time = time();과 같은 런타임 정보만 평가할 수 있습니다. 이런 방식으로 속성을 정의하면 구문 오류가 발생합니다.

멤버 속성은 일반 속성과 정적 속성 두 가지로 구분됩니다. 상수의 저장 방식과 다르게 멤버 속성의 초기화 값은 "속성 이름"을 인덱스로 해쉬 테이블에 바로 저장되지 않고,

은 실제로 배열에 저장된 구성원 속성의 VALUE에 액세스하면 "속성 이름"으로 색인화된 해시 테이블을 기반으로 특정 VALUE가 검색됩니다. 테이블은 zend_class_entry.properties_info

typedef struct _zend_property_info {
    uint32_t offset; //普通成员变量的内存偏移值,静态成员变量的数组索引
    uint32_t flags;  //属性掩码,如public、private、protected及是否为静态属性
    zend_string *name; //属性名:并不是原始属性名,private会在原始属性名前加上类名,protected则会加上*作为前缀
    zend_string *doc_comment;
    zend_class_entry *ce; //所属类
} zend_property_info;
로그인 후 복사
PHP7 커널 분석 8 등

4. 멤버 메서드


각 클래스는 이 클래스에 속하는 여러 함수(멤버 메서드라고 함)를 정의할 수 있습니다. 이러한 함수는 일반 함수와 동일하지만 관리됩니다. 전역이 아닌 클래스 차원이므로 멤버 메서드는 EG(function_table) 대신 클래스에 저장됩니다

멤버 메서드도 정적 메서드와 비정적 메서드로 구분됩니다. $this는 정적 메서드에서 사용할 수 없습니다. 작업 범위는 모두 객체가 아닌 클래스이기 때문에 $this

PHP7 커널 분석 8 등

5를 통해 이 객체에 속한 멤버 속성에 액세스할 수 있습니다. object

typedef struct _zend_object     zend_object;

struct _zend_object {
    zend_refcounted_h gc; //引用计数
    uint32_t          handle; //对象编号
    zend_class_entry *ce; //所属类
    const zend_object_handlers *handlers; //对象操作处理函数
    HashTable        *properties; //普通成员属性哈希表
    zval              properties_table[1]; //普通属性值数组
};
로그인 후 복사

객체 생성: 먼저 EG의 클래스 이름을 기준으로 (class_table)에서 해당 zend_class_entry를 찾은 다음 객체를 생성 및 초기화하고 마지막으로 생성자를 초기화하고 생성자를 호출하는 zend_execute_data

관련 권장 사항 :

PHP7 커널 분석 7 Zend 엔진 실행 프로세스


PHP7 커널 분석 6 기능

PHP7 커널 분석 5 PHP 코드 컴파일

위 내용은 PHP7 커널 분석 8 등의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!