ホームページ バックエンド開発 PHPチュートリアル PHP カーネルを深く理解する (5) 変数とデータ型 - 変数の構造と型

PHP カーネルを深く理解する (5) 変数とデータ型 - 変数の構造と型

Jun 13, 2016 pm 12:29 PM
nbsp object php zend

PHP カーネルの深い理解 (5) 変数とデータ型 - 変数の構造と型

元のリンク: http://www.orlion.ga/238/

型プログラミング言語は強い型と弱い型の2種類に分けられます。PHPは弱い型付け言語ですが、C言語は強い型付け言語です。公式の PHP 実装では、すべての変数が同じデータ構造 (zval) を使用して保存されます。この構造には、変数の値だけでなく、変数の型も含まれます。これは PHP の弱い型付けの中核です。

zval 構造体は弱い型付けをどのように実装しますか?

1. PHP 変数の型とストレージ構造

PHP は変数の宣言や使用時にデータ型を指定する必要はありませんが、PHP には型があり、PHP には 8 種類のデータ型があります。スカラー型: ブール、整数、浮動小数点 (倍精度) 文字列; 複合型: 配列、オブジェクト; 特殊型: リソース、NULL

C 言語は PHP Woolen クロスでどのように弱い型を実装しますか?

1. 変数の格納構造

変数の値は、以下に示すように zval 構造体に格納されます。 zval 構造体は Zend/zend.h ファイルで定義されており、その構造は次のとおりです:

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;};
ログイン後にコピー

zval 構造体には 4 つのフィールドがあり、それらの意味は次のとおりです:

属性名含义默认值
refcount_gc表示引用计数1
is_ref_gc表示是否为引用0
value存储变量的值
type变量具体的类型

PHP5 では、新しいガベージ コレクション メカニズムが導入されました。それ以前は、refcount と is_ref でした。

変数は別の構造体 zvalue_value に格納され、その値は以下の概要を参照してください。

2. 変数の型

zval 構造体の type フィールドは、弱い型指定を実装するための最も重要なフィールドです。 IS_NULL、IS_BOOL、IS_LONG、IS_DOUBLE、IS_STRING、IS_OBJECT、IS_RESOURCE のいずれかになります。さらに、それらで定義されるタイプには、IS_CONSTANT および IS_CONSTANT_ARRAY が含まれます。

2. 変数値の格納

前述したように、値はzvalue_value 共用体では、構造体は次のように定義されます。

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;
ログイン後にコピー

さまざまなタイプのデータは、変数値と対応する割り当てを格納するために異なるメソッドを使用します。メソッドは次のとおりです。

一般的なタイプ:

変数の種類マクロ
ブール値ZVAL_BOOL
变量类型
booleanZVAL_BOOL

布尔型/整型的变量值存储于(zval).value.lval中,其类型也会

以相应的IS_*进行存储

integerZVAL_LONG
floatZVAL_DOUBLEZ_TYPE_P(z)=IS_BOOL/LONG;Z_LVAL_P(z)=(b)!=0;
nullZVAL_NULL

NULL值的变量值不需要存储,只需要把(zval).type标为IS_NUL

Z_TYPE_P(z)=IS_NULL;

resourceZVAL_RESOURCE

资源类型的存储与其他一般变量无异,但其初始化及存储实现则不

同Z_TYPE_P(z) = IS_RESOURCE; Z_LVAL_P(z) = 1;

ブール/整数変数の値は (zval).value.lval に格納され、その型も対応する IS_*<🎜 とともに <🎜><🎜>格納されます。 >
整数ZVAL_LONG
floatZVAL_DOUBLEZ_TYPE_P(z )=IS_BOOL/LONG;Z_LVAL_P(z)=(b)!=0;
null ZVAL_NULL<🎜>NULL 値の変数値を格納する必要はありません(zval).type を IS_NUL<🎜><🎜>Z_TYPE_P(z)=IS_NULL;<🎜>
としてマークするだけです。 resourceZVAL_RESOURCE<🎜>リソース タイプのストレージは、他の一般的なリソース タイプと変わりません。変数ですが、初期化とストレージの実装が異なります< 🎜><🎜>Z_TYPE_P(z) = IS_RESOURCE = 1;<🎜>

字符串

字符串的类型标示和其他数据类型一样,不过在存储字符串时多了一个字符串长度的字段。

struct {    char *val;    int len;} str;
ログイン後にコピー

(存储字符串长度是因为字符串的操作十分频繁,有利于节省时间,是空间换时间的做法)

数组Array

数组是PHP中最常用也是最强大变量类型。数组的值存储在zvalue_value.ht字段中,它是一个HashTable类型的数据。PHP数组使用哈希表来存储关联数据。PHP的哈希表实现中使用了两个数据结构HashTable和Bucket。PHP所有的工作都是由哈希表实现。

对象Object

PHP的对象是一种复合型的数据,使用一种zend_object_value的结构体来存放,其定义如下

typedef struct _zend_object_value {    zend_object_handle handle;  //  unsigned int?类型,EG(objects_store).object_buckets的索引    zend_object_handlers *handlers;} zend_object_value;
ログイン後にコピー

PHP的对象只有在运行时才会被创建,前面介绍了EG宏,这是一个全局结构体由于保存在运行时的数据。其中就包括了用来保存所有被创建的对象的对象池,EG(objects_store),而object对象值内容的zend_object_handle域就是当前对象在对象池中所在的索引,handlers字段则是将对象进行操作时的处理函数保存起来。

    

    PHP的弱变量容器的实现方式是兼容并包的形式体现。

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

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド Dec 24, 2024 pm 04:42 PM

PHP 8.4 では、いくつかの新機能、セキュリティの改善、パフォーマンスの改善が行われ、かなりの量の機能の非推奨と削除が行われています。 このガイドでは、Ubuntu、Debian、またはその派生版に PHP 8.4 をインストールする方法、または PHP 8.4 にアップグレードする方法について説明します。

今まで知らなかったことを後悔している 7 つの PHP 関数 今まで知らなかったことを後悔している 7 つの PHP 関数 Nov 13, 2024 am 09:42 AM

あなたが経験豊富な PHP 開発者であれば、すでにそこにいて、すでにそれを行っていると感じているかもしれません。あなたは、運用を達成するために、かなりの数のアプリケーションを開発し、数百万行のコードをデバッグし、大量のスクリプトを微調整してきました。

PHP 開発用に Visual Studio Code (VS Code) をセットアップする方法 PHP 開発用に Visual Studio Code (VS Code) をセットアップする方法 Dec 20, 2024 am 11:31 AM

Visual Studio Code (VS Code とも呼ばれる) は、すべての主要なオペレーティング システムで利用できる無料のソース コード エディター (統合開発環境 (IDE)) です。 多くのプログラミング言語の拡張機能の大規模なコレクションを備えた VS Code は、

JSON Web Tokens(JWT)とPHP APIでのユースケースを説明してください。 JSON Web Tokens(JWT)とPHP APIでのユースケースを説明してください。 Apr 05, 2025 am 12:04 AM

JWTは、JSONに基づくオープン標準であり、主にアイデンティティ認証と情報交換のために、当事者間で情報を安全に送信するために使用されます。 1。JWTは、ヘッダー、ペイロード、署名の3つの部分で構成されています。 2。JWTの実用的な原則には、JWTの生成、JWTの検証、ペイロードの解析という3つのステップが含まれます。 3. PHPでの認証にJWTを使用する場合、JWTを生成および検証でき、ユーザーの役割と許可情報を高度な使用に含めることができます。 4.一般的なエラーには、署名検証障害、トークンの有効期限、およびペイロードが大きくなります。デバッグスキルには、デバッグツールの使用とロギングが含まれます。 5.パフォーマンスの最適化とベストプラクティスには、適切な署名アルゴリズムの使用、有効期間を合理的に設定することが含まれます。

母音を文字列にカウントするPHPプログラム 母音を文字列にカウントするPHPプログラム Feb 07, 2025 pm 12:12 PM

文字列は、文字、数字、シンボルを含む一連の文字です。このチュートリアルでは、さまざまな方法を使用してPHPの特定の文字列内の母音の数を計算する方法を学びます。英語の母音は、a、e、i、o、u、そしてそれらは大文字または小文字である可能性があります。 母音とは何ですか? 母音は、特定の発音を表すアルファベットのある文字です。大文字と小文字など、英語には5つの母音があります。 a、e、i、o、u 例1 入力:string = "tutorialspoint" 出力:6 説明する 文字列「TutorialSpoint」の母音は、u、o、i、a、o、iです。合計で6元があります

PHPでHTML/XMLを解析および処理するにはどうすればよいですか? PHPでHTML/XMLを解析および処理するにはどうすればよいですか? Feb 07, 2025 am 11:57 AM

このチュートリアルでは、PHPを使用してXMLドキュメントを効率的に処理する方法を示しています。 XML(拡張可能なマークアップ言語)は、人間の読みやすさとマシン解析の両方に合わせて設計された多用途のテキストベースのマークアップ言語です。一般的にデータストレージに使用されます

PHPでの後期静的結合を説明します(静的::)。 PHPでの後期静的結合を説明します(静的::)。 Apr 03, 2025 am 12:04 AM

静的結合(静的::) PHPで後期静的結合(LSB)を実装し、クラスを定義するのではなく、静的コンテキストで呼び出しクラスを参照できるようにします。 1)解析プロセスは実行時に実行されます。2)継承関係のコールクラスを検索します。3)パフォーマンスオーバーヘッドをもたらす可能性があります。

PHPマジックメソッド(__construct、__destruct、__call、__get、__setなど)とは何ですか? PHPマジックメソッド(__construct、__destruct、__call、__get、__setなど)とは何ですか? Apr 03, 2025 am 12:03 AM

PHPの魔法の方法は何ですか? PHPの魔法の方法には次のものが含まれます。1。\ _ \ _コンストラクト、オブジェクトの初期化に使用されます。 2。\ _ \ _リソースのクリーンアップに使用される破壊。 3。\ _ \ _呼び出し、存在しないメソッド呼び出しを処理します。 4。\ _ \ _ get、dynamic属性アクセスを実装します。 5。\ _ \ _セット、動的属性設定を実装します。これらの方法は、特定の状況で自動的に呼び出され、コードの柔軟性と効率を向上させます。

See all articles