이 글의 내용은 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;
4. 멤버 메서드
각 클래스는 이 클래스에 속하는 여러 함수(멤버 메서드라고 함)를 정의할 수 있습니다. 이러한 함수는 일반 함수와 동일하지만 관리됩니다. 전역이 아닌 클래스 차원이므로 멤버 메서드는 EG(function_table) 대신 클래스에 저장됩니다
멤버 메서드도 정적 메서드와 비정적 메서드로 구분됩니다. $this는 정적 메서드에서 사용할 수 없습니다. 작업 범위는 모두 객체가 아닌 클래스이기 때문에 $this
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]; //普通属性值数组 };
관련 권장 사항 :
PHP7 커널 분석 7 Zend 엔진 실행 프로세스
위 내용은 PHP7 커널 분석 8 등의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!