まず、静的変数とグローバル変数の違いについて説明します。グローバル変数は、すべての関数からアクセスできます。複数の独立した関数が同じ名前の変数を使用する場合、1 つの関数だけが特定の変数にアクセスする必要がある場合、競合が発生します。 、グローバル変数の代わりに静的変数を使用することを優先する必要があります
クラス内の静的メンバーは、クラスのインスタンスではなくクラス全体に属します。静的メンバーは 1 つの変数値のみを保持し、この変数値はすべてのインスタンスでこのメンバーを共有します。
$this はクラスの現在のインスタンスを表し、Self:: はクラス自体を表します。クラス外のコードはこの演算子を使用できず、継承ツリー階層内の位置を識別できません。つまり、拡張クラスで self スコープを使用する場合、self は基本クラスで宣言されたメソッドを呼び出すことができますが、常に拡張クラスでオーバーライドされたメソッドを呼び出します。基本クラスのメソッドはオーバーライドされますが、基本クラスのメソッドを呼び出す場合は、parent キーワードを使用する必要があります。
静的メンバーは親クラスにのみ所属することもできます。親クラスと子クラスには、親クラスの静的メンバーにアクセスするために、parent を使用する必要があります。この場合、親クラスと子クラスで保存される静的メンバーの値が異なります。
静的メソッドを使用してクラス内のメソッドを呼び出すと、クラスをインスタンス化するためのコードを省略でき、より効率的になります (クラスのインスタンス化時に消費する必要があるリソースの一部を節約できます)
語彙および文法分析プロセス
1 ファイル Zend/zend_compile.c で、字句解析の後に 2 行のコードを追加して、字句解析から得られた特定の単語の分割を出力します
retval = lex_scan(&zendlval->u.constant TSRMLS_CC) //オリジナルの字句解析スクリプト
if(zendlval->u.constant.value.lval && zendlval->u.constant.value.lval
printf("word: %ldn", zendlval->u.constant.value.lval);
else if(zendlval->u.constant.value.str.val)
printf("word: %sn", zendlval->u.constant.value.str.val);
2 フォローアップ追跡を容易にするために、字句解析 zend_ language_scanner.c 内の字句リンクの格条件を出力します
printf("word-line:%dn", yy_act);
スイッチ (yy_act)
3 フォローアップ追跡を容易にするために、構文分析 zend_ language_parser.c 内の構文リンクのケース条件を出力します
YY_REDUCE_PRINT(yyn);
printf("文法行: %dn", yyn);
スイッチ(yyn)
4 staticを含むクラスファイルを構築します
クラスクラス名{
public static $valname = 'test';
パブリック $val = 'test1';
関数 functionname(){
echo self::$valname;
}
}
$obj = 新しいクラス名();
echo $obj->関数名();
5 重要なフラグメント分析
単語: クラス名
文法行: 93
文法行: 86
zend_do_begin_class_declaration は終了しました
初期化クラスの情報
そしてクラスをCG(class_table)に登録します
現在のクラスを CG(active_class_entry) に設定します
最後に次のオペコードを取り出して設定しました
文法行: 98
文法行: 168
公開
文法行: 183
文法行: 181
単語: 静的
文法行: 186
Z_LVAL((yyval).u.constant)= ZEND_ACC_STATIC;
文法行: 182
この関数 zend_do_verify_access_types は廃止されました
テスト後は、抽象クラスのメンバ変数を制限するために static を使用することはできません。
単語: ヴァルネーム
文法行: 177
文法行: 169
単語: テスト
文法行: 303
文法行: 309
文法行: 192
zend_do_declare_property 関数が呼び出されました
インターフェイスにメンバー変数を追加できないことをCG(active_class_entry)で検出
変数を抽象または最終変数にすることはできません
重複した定義がなされていないか確認してください
zend_declare_property_ex を呼び出す
access_type& ZEND_ACC_STATIC を通じて静的変数かどうかを判断するには
ofから出て G そうでない場合、target_symbol_table = & CE-& GT; 最後に、Zend_hash_updateは属性フィールドを更新します
6 結論
クラスの通常変数とメンバー変数はクラス構造の属性に格納され、そこに格納される対象のハッシュテーブルのみが異なります
xiaoq3406さんのコラムより抜粋
http://www.bkjia.com/PHPjc/478469.htmlwww.bkjia.com
true