ご存知かもしれませんし、ご存じないかもしれませんが、PHP は弱い型指定の動的スクリプト言語です。 いわゆる弱い型とは、変数を宣言するときに、PHP が変数の型を厳密に検証しないことを意味します (厳密に言うと、PHP は中程度に強い型の言語です。この部分については今後の記事で説明します)。 、保存するデータのタイプを明示的に指定する必要はありません:
<?php $var = 1; //int $var = "laruence"; //string $var = 1.0002; //float $var = array(); // array $var = new Exception('error'); //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. 配列/連想配列
zval.type = IS_LONG;//整形 zval.type = IS_BOOL;//布尔值
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 がリソースリストに対応するオフセット値のようだということだけ知っておいてください。 PHP 関連の知識の詳細については、 以上がPHP の原則 (PHP 内の変数) の深い理解の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。 ZEND_FETCH_RESOURCE(con, type, zval *, default, resource_name, resource_type);