ホームページ  >  記事  >  バックエンド開発  >  PHP7 カーネル解析8など

PHP7 カーネル解析8など

不言
不言オリジナル
2018-04-13 15:14:411603ブラウズ

この記事の内容は 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

PHP7 カーネル解析8など

4. メンバーメソッド


各クラスは、このクラスに属するいくつかの関数 (メンバーメソッドと呼ばれます) を定義できます。これらの関数は通常の関数と同じですが、 で管理されます。グローバルではなくクラスのディメンションであるため、メンバー メソッドは EG (function_table) ではなくクラスに格納されます

メンバー メソッドも静的メソッドと非静的メソッドに分けられます。それらの操作のスコープはすべてオブジェクトではなくクラスであるため、$this

PHP7 カーネル解析8など

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 カーネル分析 5 PHP コードのコンパイル

以上がPHP7 カーネル解析8などの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。