ホームページ >バックエンド開発 >PHPチュートリアル >PHPソースコード解析 - 弱い型変数の実装_PHPチュートリアル

PHPソースコード解析 - 弱い型変数の実装_PHPチュートリアル

WBOY
WBOYオリジナル
2016-07-13 17:47:07962ブラウズ

PHP は、型指定が弱い動的スクリプト言語です。変数を宣言するとき、変数が保持するデータ型を指定する必要はありません。

例:

$var = 1; $var = "変数"; $var = 1.00; $var = 配列(); $var = 新しいオブジェクト()
; $var = 1;
$var = "変数";
$var = 1.00;
$var = array();
$var = 新しいオブジェクト();
動的変数は実行時に変更でき、使用前に変数の型を宣言する必要はありません。



そこで、質問 1: Zend エンジンはこの弱い型を C でどのように実装するのでしょうか?

実際、PHP で宣言された変数は、ZE の zval 構造体に格納されます。

まず、Zend/zend.h を開いて zval の定義を確認します。

typedef struct _zval_struct zval;

struct _zval_struct {

/* 変数情報 */

zvalue_value 値; /* 値 */

zend_uint refcount__gc; zend_uchar タイプ; /* アクティブなタイプ */
zend_uchar is_ref__gc; };
typedef Union _zvalue_value {
長い lval; /* 長い値 */
double dval /* double 値 */
構造体{
char *val
整数

HashTable *ht; /* ハッシュ テーブルの値 */
zend_object_value オブジェクト
zvalue_value
typedef struct _zval_struct zval;

struct _zval_struct {
/* 変数情報 */
zvalue_value 値; /* 値 */
zend_uint refcount__gc;
zend_uchar タイプ; /* アクティブなタイプ */
zend_uchar is_ref__gc;
};

typedef Union _zvalue_value {

長い lval; /* 長い値 */
double dval; /* 倍精度の値 */
構造体{
char *val;
イントレン;
} str;
HashTable *ht; /* ハッシュ テーブルの値 */

zend_object_value obj;

zvalue_value;
Zend/zend_types.h:


typedef unsigned char zend_bool
typedef unsigned char zend_uchar
typedef unsigned int zend_uint; typedef unsigned long zend_ulong
typedef unsigned short zend_ushort
typedef unsigned char zend_bool;
typedef unsigned char zend_uchar;
typedef unsigned int zend_uint;

typedef unsigned long zend_ulong;

typedef unsigned short zend_ushort;
上記のコードから、_zvalue_value が実際にデータを保存する重要な部分であることがわかります。 Union を使用した弱い型付き変数宣言





質問 2: Zend エンジンは、PHP 内のさまざまなデータ型をどのように識別して保存しますか?
_zval_struct.type は変数の実際の型を格納し、型に基づいて zvalue_value の値を取得する方法を選択できます。

型値リスト (Zend/zend.h):
#IS_NULL 0 を定義します
#IS_LONG 1 を定義します
#IS_DOUBLE 2 を定義します
#IS_BOOL 3 を定義します
#IS_ARRAY 4 を定義します
#IS_OBJECT 5 を定義します
#IS_STRING 6 を定義します
#IS_RESOURCE 7 を定義します
#IS_CONSTANT 8 を定義します
#IS_CONSTANT_ARRAY 9 を定義します
型値リスト (Zend/zend.h):
#IS_NULL 0 を定義します
#IS_LONG 1 を定義します
#IS_DOUBLE 2 を定義します
#IS_BOOL 3 を定義します
#IS_ARRAY 4 を定義します
#IS_OBJECT 5 を定義します
#IS_STRING 6 を定義します
#IS_RESOURCE 7 を定義します
#IS_CONSTANT 8 を定義します
#IS_CONSTANT_ARRAY 9 を定義します
簡単な例を見てみましょう: www.2cto.com
$a = 1; //このとき、zval.type = IS_LONG の場合、zval.value は lval になります。 $a = 配列(); //このとき、zval.type = IS_ARRAY の場合、zval.value は
を取得します。 $a = 1;
//この時点では zval.type = IS_LONG なので、zval.value は lval.
を取得します。 $a = 配列();
//この時点では zval.type = IS_ARRAY なので、zval.value は ht.
を取得します。 これらの中で最も複雑で、サードパーティの拡張機能を開発するときによく必要になるのは、「リソース タイプ」です。
PHP では、PHP の組み込み変数タイプに属さない変数はすべてリソースとして扱われ、保存されます。
例: データベース ハンドル、オープン ファイル ハンドル、オープン ソケット ハンドル。

リソースタイプは、ZE が提供する API 関数を使用して登録する必要があります。リソース変数の宣言と使用方法については、別の記事で詳しく紹介します。

PHPが弱い型を実装しているのはZEの処理方式だからこそであり、ZEにとっては常に同じ型のzvalを向いているのです

神様のブログより抜粋

http://www.bkjia.com/PHPjc/478520.html

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/478520.html技術記事 PHP は、型指定が弱い動的スクリプト言語です。変数を宣言する場合、変数に格納されるデータ型を指定する必要はありません。 例: ?php $var = 1; $var = 1.00;
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。