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

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

angryTom
angryTom転載
2019-10-15 13:35:131921ブラウズ

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 までご連絡ください。