PHP の変数は、弱い型指定の言語であるため、あらゆるデータ型を保存できます。ただし、PHP は C 言語で書かれており、各変数の型は固定されています (型変換を強制することはできますが、zend エンジンでは問題が発生する可能性があります)。 、それは、変数はどのような型を保存することができますか?
zend/zend.h ヘッダー ファイルには、次の構造があります:
zval 構造は、一般的に使用される PHP 変数をカーネル内で表現する方法です。 zval 構造体には、次の 4 つのメンバー変数が表示されます。
リーリーzval 構造体の value メンバー変数は zvalue_value 共用体です。この共用体のおかげで、PHP はあらゆる構造体の型を維持できます。 zvalue_value ユニオンのメンバー変数からわかるように、異なる型は異なるメンバー変数に保存されるため、PHP 変数には任意のデータ型を格納できます。たとえば、変数が整数型の場合は value の lval メンバー変数に保存され、変数の型が文字列の場合は value の str メンバー変数に保存されます。
もう 1 つの質問は、zend エンジンはこの変数が保存する型をどのようにして知るのでしょうか? zval 構造体に type メンバー変数があることに気付きました。このメンバー変数は PHP 変数の型を保存するためのものです。
Zend エンジンは 8 つの変数タイプを定義します:
各マクロ定義は、PHP 言語層の型に対応します。たとえば、zval の type メンバー変数が IS_STRING (zval.type==IS_STRING
) と等しい場合、この変数の型は文字列型であることを意味します。