PHP の原則 (PHP 内の変数) の深い理解

angryTom
リリース: 2023-04-07 16:24:01
転載
1962 人が閲覧しました

PHP の原則 (PHP 内の変数) の深い理解

ご存知かもしれませんし、ご存じないかもしれませんが、PHP は弱い型指定の動的スクリプト言語です。 いわゆる弱い型とは、変数を宣言するときに、PHP が変数の型を厳密に検証しないことを意味します (厳密に言うと、PHP は中程度に強い型の言語です。この部分については今後の記事で説明します)。 、保存するデータのタイプを明示的に指定する必要はありません:

<?php
  $var = 1; //int
  $var = "laruence"; //string
  $var = 1.0002; //float
  $var = array(); // array
  $var = new Exception(&#39;error&#39;); //object;
ログイン後にコピー

動的言語。つまり、PHP の言語構造は実行時に変更できます。たとえば、実行時に必要となるのは、言語の関数テーブルを動的に変更する関数定義ファイルです。

いわゆるスクリプト言語は、PHP が独立して実行されないことを意味します。PHP を実行するには、PHP パーサーが必要です:

/usr/bin/php -f example.php
ログイン後にコピー

PHP の実行が次のとおりであることは、前の記事ですでに述べました。 Zend エンジン (ZE、Zend エンジン) を通じて、ZE は C で書かれています。C が厳密に型指定された言語であることは誰もが知っています。つまり、C のすべての変数は、宣言されてから最終的に破棄されるまで 1 つの型しか保存できません。 . データの種類。では、PHP はどのようにして ZE に基づいて弱い型を実装するのでしょうか?

PHP では、すべての変数は構造体 -zval を使用して保存されます。Zend/zend.h では、zval の定義を確認できます:

typedef struct _zval_struct {
    zvalue_value value;
    zend_uint refcount;
    zend_uchar type;
    zend_uchar is_ref;
  } zval;
ログイン後にコピー

where zvalue_value is trueデータ保存の鍵 PHP は ZE に基づいて弱い型をどのように実装しますか? zvalue_value は共用体であるため、

typedef union _zvalue_value {
    long lval;
    double dval;
    struct {
        char *val;
        int len;
    } str;
    HashTable *ht;
    zend_object_value obj;
} zvalue_value;
ログイン後にコピー

では、この構造体はどのようにして PHP で複数の型を格納するのでしょうか?

PHP の一般的な変数の型は次のとおりです:

  • 1. 整数/浮動小数点/長整数/ブール値など

  • 2. 文字列

  • 3. 配列/連想配列

  • ##4. オブジェクト

  • 5. リソース

PHP は、zval の type フィールドに基づいて変数の実際の型を格納し、型に基づいて zvalue_value の値を取得する方法を選択します。たとえば、整数とブール値の場合:

   zval.type = IS_LONG;//整形
   zval.type = IS_BOOL;//布尔值
ログイン後にコピー

Get zval.value.lval、ブール値の場合は lval∈(0|1);

倍精度の場合、またはfloat 次に、zval.value の dval を取得します。

そして、それが文字列の場合:

   zval.type = IS_STRING
ログイン後にコピー

この時点では、次のようになります:

zval.value.str

これは次のとおりです。 C 形式の文字列と文字列の長さを格納する構造体でもあります。

配列とオブジェクトの場合、type はそれぞれ

IS_ARRAY、IS_OBJECT に対応し、対応するものはそれぞれ zval.value.ht と obj## です。 #何が特別なのかというと、リソースです。PHP では、リソースは非常に特別な変数です。データベースハンドル、開いているファイルなど、PHP の組み込み変数タイプに属さない変数はすべて、保存用のリソースとみなされます。ハンドル等。リソースの場合:

   type = IS_RESOURCE
ログイン後にコピー

この時点で、

zval.value.lval

が取得されます。この時点で、lval は整数インジケーターであり、PHP はこのインジケーターを PHP クエリで使用します。 (この部分は今後別記事で紹介します) とりあえず、この時の lval がリソースリストに対応するオフセット値のようだということだけ知っておいてください。

 ZEND_FETCH_RESOURCE(con, type, zval *, default, resource_name, resource_type);
ログイン後にコピー
このようなメカニズムを借用することで、PHP は弱い型を実装します。これは、ZE の場合、常に同じ型、つまり zval に直面するためです。

PHP 関連の知識の詳細については、

PHP 中国語 Web サイト

をご覧ください。

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

関連ラベル:
ソース:www.laruence.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート