PHP で弱い型変数を実装する方法: 1. C を使用して Zend エンジンを通じて弱い型を実装し、構造体 zval を使用してそれらを ZE に保存します; 2. Zend エンジンを使用してさまざまな変数を識別して保存しますPHP タイプのデータ。タイプに基づいて [zvalue_value] の値を取得するように選択します。
PHP の弱い型指定変数を実装する方法:
PHP は弱い型指定の動的言語スクリプトです。変数を宣言するとき、その変数が保持するデータ型を指定する必要はありません。例:
<?php $var = 1; $var = "variable"; $var = 1.00; $var = array(); $var = new Object();
動的変数は実行時に変更でき、使用前に変数の型を宣言する必要はありません。
関連する学習の推奨事項: PHP プログラミングの入門から熟練度まで
質問 1. Zend エンジンはこれを実装するために C をどのように使用しますか?弱いタイプはどうですか?
実際には、PHP で宣言された変数は、zval 構造体を使用して ZE に格納されます。
最初に Zend/zend.h
を開いて zval の定義を確認します:
typedef struct _zval_struct zval; struct _zval_struct { /* Variable information */ zvalue_value value; /* value */ zend_uint refcount__gc; zend_uchar type; /* active type */ zend_uchar is_ref__gc; }; typedef union _zvalue_value { long lval; /* long value */ double dval; /* double value */ struct { char *val; int len; } str; HashTable *ht; /* hash table value */ 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;
上記のコードから、_zvalue_value
が実際にデータを保存する重要な部分であることがわかります。共用体による弱い型指定の変数宣言
質問 2. Zend エンジンはどのようにして PHP で複数のデータ型を識別し、保存しますか?
_zval_struct.type
には変数の実際の型が格納され、型に応じて zvalue_value の値を取得する方法を選択できます。
型値リスト (Zend/zend.h):
#define IS_NULL 0 #define IS_LONG 1 #define IS_DOUBLE 2 #define IS_BOOL 3 #define IS_ARRAY 4 #define IS_OBJECT 5 #define IS_STRING 6 #define IS_RESOURCE 7 #define IS_CONSTANT 8 #define IS_CONSTANT_ARRAY 9
簡単な例を見てみましょう:
<?php $a = 1; //此时zval.type = IS_LONG,那么zval.value就去取lval. $a = array(); //此时zval.type = IS_ARRAY,那么zval.value就去取ht.
最も複雑な例です。サードパーティの拡張機能の開発でよく必要になるのは、「リソース タイプ」です。
PHP では、PHP の組み込み変数タイプに属さない変数はすべてリソースとみなされ、保存されます。
例: データベース ハンドル、オープン ファイル ハンドル、オープン ソケット ハンドル。
リソースタイプの場合、lval が使用されます。この時点では、これは整数インジケーターです。その後、PHP は、以下に基づいて、PHP の組み込みリソースリスト内の対応するリソースリストをクエリします。このインジケーターのリソース。
ZEの処理方法だからこそ、PHPは弱い型を実装しており、ZEにとっては常に同じ型zvalと対峙することになります。
以上がPHPで弱く型指定された変数を実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。