知っているかもしれませんし、知らないかもしれませんが、PHP は弱く型付けされた動的スクリプト言語です。いわゆる弱い型とは、PHP が変数の型を厳密に検証しないことを意味します (厳密に言うと、PHP は中程度に強い型の言語です。この部分については、変数を宣言するときに検証する必要はありません)。保存するデータの種類を明示的に指定します。
コードをコピーします。 コードは次のとおりです。
$var = "laruence" / /string
$var = 1.0002 ; //float
$var = array(); // array
$var = new Exception('error'); //object;
動的言語、つまり言語構造PHP の関数は実行時に変更可能 たとえば、実行時に関数定義ファイルが必要になるため、言語の関数テーブルが動的に変更されます。
いわゆるスクリプト言語は、PHP が独立して実行されないことを意味します。PHP を実行するには、PHP パーサーが必要です。
コードをコピーします
コードは次のとおりです: /usr/bin/php -f example.ph
PHP が Zend エンジン (ZE、Zend エンジン) を通じて実行されることはすでに述べました。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;
Zvalue_value は、実際にデータを保存するための重要な部分です、PHP が Z をどのように使用するのかという答えを明らかにします。 E 弱い型の実装についてはどうですか? 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. 配列/連想配列
4. オブジェクト
PHP は、zval の type フィールドに基づいて変数の真の型を保存し、整数値や bool 値などの型に基づいて zvalue_value の値を取得する方法を選択します。
コードをコピーします
コードは次のとおりです:
zval .type = IS_LONG;//Integer zval.type = IS_BOOL;//Boolean
ブール値 lval∈(0|1);
If として zval.value.lval を取得します。倍精度であるか、float は zval.value の dval を取得します。
そしてそれが文字列の場合、次のようになります:
コードをコピーします
コードは次のとおりです:
zval.type = IS_STRIN
この時点では、次のようになります:
zval.value.str
これも構造体であり、C 形式の文字列と文字列の長さを保存します。
配列とオブジェクトの場合、型はそれぞれ IS_ARRAY と IS_OBJECT に対応し、対応するものはそれぞれ zval.value.ht と obj です。
さらに特別なのは、リソースです。PHP では、リソースは非常に特別な変数です。 PHP に属さない組み込み変数タイプの変数は、データベース ハンドル、開いているファイル ハンドルなど、ストレージのリソースとして扱われます。 リソースの場合:
コードをコピーします
コードは次のとおりです:
type = IS_RESOURCこのとき、zval.value.lval が取得されます。このとき、lval は整数のインジケーターです。その後、PHP はこのインジケーターに基づいて、PHP で構築されたリソース リスト内の対応するリソースをクエリします (この部分の内容を開きます)。将来的には別の記事で紹介します) 現時点では、この時点の lval がリソースのリンクされたリストに対応するオフセット値であると思われることだけを知っておく必要があります。
コードをコピーします コードは次のとおりです:
ZEND_FETCH_RESOURCE(con, type, zval *,default, resource_name, resource_type);
このようなメカニズムを借用することで、PHP は弱い型付けを実装します。 ZE つまり、常に同じタイプ、つまり zval に直面します。
http://www.bkjia.com/PHPjc/328118.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/328118.html技術記事ご存知かもしれませんし、ご存じないかもしれませんが、PHP は型付けが弱い動的スクリプト言語です。いわゆる弱い型とは、PHP が変数の型を厳密に検証しないことを意味します (厳密に言うと、PHP は中程度の強い型です...
)