ホームページ  >  記事  >  バックエンド開発  >  PHP 原則の深い理解: 変数スコープ (PHP のスコープ)

PHP 原則の深い理解: 変数スコープ (PHP のスコープ)

angryTom
angryTom転載
2019-10-15 13:43:222053ブラウズ

PHP 原則の深い理解: 変数スコープ (PHP のスコープ)

前の記事 (PHP 原則の深い理解: PHP 内の変数) では、PHP 変数の内部表現を紹介しましたが、問題は、これらの内部表現がユーザー スクリプトとどのように相互作用するかということです。 ? 変数は何に関連付けられていますか?言い換えると、スクリプトに次のように記述するとします:

<?php
  $var = "laruence";
  echo $var;
?>

ZE は変数 var を内部構造 zval にどのように接続しますか?

PHP の原理と変数の深い理解で述べたように、PHP は内部的に zval を使用して変数を表しますが、上記のスクリプトでは、変数には var という名前が付いています。 zval には変数名を反映する対応するフィールドがありません。

そう考えると、変数名を zval にマッピングするメカニズムが PHP 内にあるはずです。それなら、あなたは本当に賢いですね;)

推奨学習: ##PHP ビデオ チュートリアル

PHP では、すべての変数は配列 (正確には

ハッシュ テーブル ) に格納され、PHP はスコープのさまざまな配列 を通じて変数も実装します。

変数を作成すると、PHP はその変数に zval を割り当て、対応する変数値を入力してから、変数の名前と zval へのポインターを配列に入力します。次に、この変数を取得すると、PHP はこの配列を検索して、対応する zval を取得します。

_zend_executor_globals 構造体を表示します (この構造体は、実行関連のコンテキスト情報の一部を PHP エグゼキューターに保存します)

struct _zend_executor_globals {
 
     ....
    HashTable *active_symbol_table;/*活动符号表*/
    HashTable symbol_table;     /*全局符号表*/
 
    HashTable included_files;
 
    jmp_buf *bailout;
    int error_reporting;
     .....
}

その中には、

グローバル シンボル テーブルがあります。 、変数を最上位のスコープ内 (つまり、関数またはオブジェクト内ではない) に保存します。関数 (オブジェクトのメソッド) が呼び出されるたびに、この関数に対してアクティブなシンボル テーブルが作成され、この関数内で定義されたすべての変数がこのアクティブなシンボル テーブルに保存されます。

はい、これが PHP の変数スコープの実装方法です! 例:

<?php
     $var = "I am in the global symbol table";
    function sample($para){
        $var = "I am in the active symbol table";
          echo $var;
      }
    sample($var);
    echo $var;
  ?>

関数サンプルの外側の変数 $var がグローバル シンボル テーブルに入力され、グローバル シンボル テーブルを使用します。これは、文字列「私はグローバル シンボル テーブルにいます」を保存する zval ポインタに対応します。

関数内の $var は、関数サンプルも同様で、それに対応する zval に「私はアクティブなシンボルテーブルにいます」という文字列が格納されます。

特別なのは、関数サンプルのパラメータ $para です。この $para が格納されますサンプルのアクティブシンボルテーブルにはありますが、それに対応する zval ポインタは、グローバル変数 $var のコピーを保持する zval を指します (厳密に言えば、これはコピーではなく参照です)。

以上がPHP 原則の深い理解: 変数スコープ (PHP のスコープ)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はwww.laruence.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。