ホームページ > バックエンド開発 > PHPチュートリアル > classes_PHPチュートリアルの静的メンバ変数の詳細説明

classes_PHPチュートリアルの静的メンバ変数の詳細説明

WBOY
リリース: 2016-07-13 17:47:47
オリジナル
846 人が閲覧しました

まず、静的変数とグローバル変数の違いについて説明します。グローバル変数は、すべての関数からアクセスできます。複数の独立した関数が同じ名前の変数を使用する場合、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.html

www.bkjia.com

tru​​e

技術記事まず、静的変数とグローバル変数の違いについて説明します。 グローバル変数は、複数の独立した関数で同じ名前の変数を使用すると、競合が発生します。
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート