ホームページ >バックエンド開発 >PHPの問題 >PHPで弱く型指定された変数を実装するにはどうすればよいですか?

PHPで弱く型指定された変数を実装するにはどうすればよいですか?

coldplay.xixi
coldplay.xixiオリジナル
2020-07-01 09:57:143756ブラウズ

PHP で弱い型変数を実装する方法: 1. C を使用して Zend エンジンを通じて弱い型を実装し、構造体 zval を使用してそれらを ZE に保存します; 2. Zend エンジンを使用してさまざまな変数を識別して保存しますPHP タイプのデータ。タイプに基づいて [zvalue_value] の値を取得するように選択します。

PHPで弱く型指定された変数を実装するにはどうすればよいですか?

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

関連記事

続きを見る