この記事の内容は PHP7 カーネル解析 8 などです。必要な方は参考にしてください。
クラスはコンパイル段階の成果物です。コンパイルが完了しました 定義した各クラスは、クラスのすべての情報を格納する zend_class_entry を生成します。実行フェーズ中のすべてのクラス関連の操作は、この構造体を使用します
クラス定数
を使用できます。 PHP では、クラス内で変更されない値を定数として定義します。定数を定義および使用するときに $ 記号を使用する必要はありません。定数は zend_class_entry.constants_table を通じて保存されます。
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; }
3. メンバー属性の変数
属性は初期化できますが、初期化された値は定数である必要があります。ここでの定数は、PHP スクリプトがコンパイル中に値を取得できることを意味します。この方法でプロパティを定義すると、構文エラーが発生します。
メンバー属性は通常属性と静的属性の2つに分類され、定数の格納方法とは異なり、メンバー属性の初期値は「属性名」をインデックスとしたハッシュテーブルに直接格納されるのではなく、配列。
は、実際には配列に格納されているメンバー属性の VALUE にすぎません。アクセスすると、「プロパティ名」でインデックス付けされたハッシュ テーブルとこのハッシュに基づいて検索されます。テーブルは zend_class_entry.properties_info
4. メンバーメソッド
各クラスは、このクラスに属するいくつかの関数 (メンバーメソッドと呼ばれます) を定義できます。これらの関数は通常の関数と同じですが、 で管理されます。グローバルではなくクラスのディメンションであるため、メンバー メソッドは EG (function_table) ではなくクラスに格納されます
メンバー メソッドも静的メソッドと非静的メソッドに分けられます。それらの操作のスコープはすべてオブジェクトではなくクラスであるため、$this
5 を通じてこのオブジェクトに属するメンバー属性にアクセスできます。 object
常量的读取: 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"; } 在运行时再去检索。替换成为实际的值
オブジェクトの作成: まず、EG のクラス名に基づいて (class_table) で対応する zend_class_entry を見つけ、次にオブジェクトを作成して初期化し、最後にコンストラクターを呼び出す zend_execute_data を初期化します
PHP7 カーネル分析 7 Zend エンジンの実行プロセス
PHP7 カーネル分析 6 関数
以上がPHP7 カーネル解析8などの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。