ホームページ バックエンド開発 PHPチュートリアル PHP カーネルの探索: 変数ストレージと型の使用手順_PHP チュートリアル

PHP カーネルの探索: 変数ストレージと型の使用手順_PHP チュートリアル

Jul 13, 2016 am 10:39 AM
変数ストレージ タイプ

まず、前のセクションの質問に答えましょう。

コードをコピーします コードは次のとおりです:

$foo = 10;
$bar = 20;

function change() {
global $foo;
//echo '関数内 $ foo = '.$foo.' />';
br $bar はできません関数の本文内でアクセスできます
$bar = 0;
echo $foo, ' ', $bar;
?>



プログラム出力11 20。その理由は、メソッド内で $bar 変数にアクセスできないため、その値は 20 のままです。 global を使用すると、$foo の値が取得できます。自動インクリメント後の $foo の値は 11 です。
Global はグローバル変数の定義に使用されますが、このグローバル変数は Web サイト全体ではなく、include または require 内のすべてのファイルを含む現在のページに適用されます。
変数の 3 つの基本的な特性については、序文で説明しました。そのうちの 1 つは、変数には文字列、配列、オブジェクトなどの特定の型があります。プログラミング言語の型システムは、強い型と弱い型の 2 つのタイプに分類できます。 強い型付き言語とは、変数が特定の型の変数として宣言されると、プログラムの実行中に変更できないことを意味します。変数の型以外の値が割り当てられます (もちろん、これがすべて当てはまるわけではありません。これには、次のセクションで説明する型変換が含まれる場合があります)。 C/C++/Java がこのカテゴリに分類されます。

PHP、Ruby、JavaScript などのスクリプト言語は弱く型指定された言語です。変数は任意のデータ型を表すことができます。
PHP がシンプルでありながら強力な言語である理由の大部分は、変数の型指定が弱いためです。 しかし、これは諸刃の剣でもあり、不適切に使用すると問題が発生する可能性があります。機器と同じように、強力であればあるほど、エラーが発生する可能性が高くなります。
公式の PHP 実装では、すべての変数は同じデータ構造 (zval) を使用して保存され、この構造は PHP のさまざまなデータ型も表します。 これには、変数の値だけでなく、変数の型も含まれます。これは PHP の弱い型付けの中核です。
zval 構造体はどのようにして弱い型を実装しているのでしょうか?一緒にベールを明らかにしましょう。
変数ストレージ構造
PHP は、変数を宣言または使用するときに、そのデータ型を明示的に示す必要はありません。
PHP は弱い型指定言語ですが、PHP に型がないという意味ではありません。PHP には 8 つの変数型があり、3 つのカテゴリに分類できます
* スカラー型: ブール型、整数型、浮動小数点数 (double)、文字列型
* 複合型: 配列、オブジェクト
* 特殊型: リソース、NULL
公式 PHP は C で実装されており、C は厳密に型指定された言語です。では、これはどのようにして PHP で弱い型を実装するのでしょうか。
変数の値は、以下に示す zval 構造体に格納されます。 zval 構造は Zend/zend.h ファイルで定義されており、その構造は次のとおりです:
コードのコードは次のとおりです;
zend_uchar 型 ; /* アクティブ型 */
zend_uchar is_ref__gc;
};

PHP はこの構造を使用して変数のすべてのデータを保存します。他のコンパイル済み静的言語とは異なり、PHP は変数を格納するときに、PHP ユーザー空間変数の型も同じ構造内に保存します。このようにして、この情報から変数の型を取得できます。
zval 構造体には 4 つのフィールドがあり、その意味は次のとおりです:

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

PHP5.3以降、新しいガベージコレクション機構が導入され、参照カウントと参照フィールド名がrefcount__gcとis_ref__gcに変更されました。その前には refcount と is__ref がありました。

変数の値は別の構造体 zvalue_value に格納されます。値の保存については以下で説明します。
PHP ユーザー空間は PHP 言語のレベルを指し、本書の大部分は PHP の実装について説明しています。 これらの実装は、カーネル空間として理解できます。 PHP は C で実装されているため、このスペースの範囲は C 言語に限定されます。 PHP ユーザー空間は、提供される PHP 構文と関数の範囲に制限されます。 たとえば、一部の PHP 拡張機能は、メソッドまたはクラスを PHP ユーザー空間にエクスポートするいくつかの PHP 関数またはクラスを提供します。
変数の型
zval 構造体の type フィールドは、弱い型指定を実装するための最も重要なフィールドです。type の値は、IS_NULL、IS_BOOL、IS_LONG、IS_DOUBLE、IS_STRING、IS_ARRAY、IS_OBJECT、IS_RESOURCE のいずれかになります。 文字通り理解するのは簡単ですが、これらは型の一意の識別子にすぎず、異なる型に応じて異なる値が値フィールドに格納されます。 さらに、それらで定義されるタイプには、IS_CONSTANT および IS_CONSTANT_ARRAY が含まれます。
これは、データベースを設計するときに行うことと似ています。同様のテーブルの設計の重複を避けるために、インジケーター フィールドを使用してさまざまな種類のデータを記録します。

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

コードをコピーします コードは次のとおりです:
typedef Union _zvalue_value {
long lval; /* long value */
double dval; /* double value */
struct {
char *val;
int len;
} str;
HashTable *ht; /* ハッシュテーブル値 */
zend_object_value obj;
} zvalue_value;

这里使用联合体而不是用结构体是出于空间利用率的考虑,因为一个变量同时只能属于一种类型。 如果使用结构体的话将会不必要的浪费空间,而PHP中的所有逻辑都围绕变量来进行的,这样的话, 内存浪费将是十分大的。这种做法成本小但收益非常大。
各种类型的数据会使用不同的方法来进行变量值的存储,其对应赋值方式如下:

1. 一般类型

変数型 マクロ ?
ブール値 ZVAL_BOOL ブール/整数変数の値は (zval).value.lval に保存され、その型も対応する IS_* とともに保存されます。
Z_TYPE_P(z)=IS_BOOL/LONG; Z_LVAL_P(z)=((b)!=0);
integer ZVAL_LONG
float ZVAL_DOUBLE
null ZVAL_NULL NULL值的变量值不需要存储,只需要把(zval).type标为IS_NULL。
Z_TYPE_P(z)=IS_NULL;
resource ZVAL_RESOURCE 资源类型的存储与其他一般变量无异,但其初始化及存取实现则不同。
Z_TYPE_P(z) = IS_RESOURCE; Z_LVAL_P(z) = l;

2. String Sting
文字列の型表示は他のデータ型と同じですが、文字列を保存するときに文字列長を指定する追加フ​​ィールドがあります。

コードをコピーします コードは次のとおりです:

struct {
char *val;
int len;
} str;

C の文字列は次で始まります

3. 配列

配列は、PHP で最も一般的に使用され、最も強力な変数タイプであり、他のタイプのデータを格納でき、さまざまな組み込み操作関数を提供します。配列の格納は、他の変数よりも複雑です。配列の値は、HashTable タイプのデータである zvalue_value.ht フィールドに格納されます。 PHP の配列は、ハッシュ テーブルを使用して関連データを保存します。ハッシュ テーブルは、効率的なキーと値のペアの格納構造です。 PHP のハッシュ テーブルの実装では、HashTable と Bucket の 2 つのデータ構造が使用されます。 PHP のすべての作業はハッシュ テーブルによって実装されます。次のセクション HashTable では、ハッシュ テーブルの基本概念と PHP でのハッシュ テーブルの実装について説明します。

4. オブジェクト

オブジェクト指向言語では、クラス属性、メソッド、その他のデータなど、必要なデータ型を定義できます。オブジェクトはクラスの特定の実装です。 オブジェクトには独自の状態と完了できる操作があります。

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)、およびオブジェクトの zend_object_handle フィールドが含まれます。オブジェクト値の内容は、オブジェクト プール内の現在のオブジェクトのインデックスであり、handlers フィールドは、オブジェクトが作成されたときのインデックスです。処理機能が保存されます。 この構造体とオブジェクト関連のクラス構造体 _zend_class_entry については後で紹介します。

PHP の弱い変数コンテナーは包括的な形式で実装されており、各タイプの変数には対応するタグとストレージ領域があります。 強力な型を使用する言語は、実行前に多くの情報を決定できるため、通常、弱い型よりも効率的であり、プログラム エラーの排除にも役立ちます。 これが引き起こす問題は、コードの記述が比較的制限されていることです。

PHP は主に Web 開発言語として使用されます。通常の Web アプリケーションでは、ボトルネックは通常ビジネス層とデータ アクセス層にあります。ただし、大規模なアプリケーションでは言語も重要な要素になります。したがって、Facebook は独自の PHP 実装を使用します。 PHP コードを C++ にコンパイルしてパフォーマンスを向上させます。ただし、Facebook の hiphop は完全な PHP 実装ではなく、PHP を C++ に直接コンパイルするため、eval 構造などの一部の PHP の動的機能は実装できません。もちろん、ヒップホップがそれを実装しない場合は、それを実装する方法があります。

http://www.bkjia.com/PHPjc/728099.htmlwww.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/728099.html技術記事まず、前のセクションの質問に答えましょう。 次のようにコードをコピーします: ?php $foo = 10; $bar = 20; function change() { //echo '内部関数 $foo = '.$foo.'br /'; ..
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、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衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

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

SublimeText3 中国語版

SublimeText3 中国語版

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

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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

Windows 11でネットワークの種類をプライベートまたはパブリックに変更する方法 Windows 11でネットワークの種類をプライベートまたはパブリックに変更する方法 Aug 24, 2023 pm 12:37 PM

ワイヤレス ネットワークのセットアップは一般的ですが、ネットワークの種類の選択または変更は、特に結果が分からない場合には混乱する可能性があります。 Windows 11 でネットワークの種類をパブリックからプライベートに、またはその逆に変更する方法についてのアドバイスをお探しの場合は、役立つ情報をお読みください。 Windows 11 のさまざまなネットワーク プロファイルとは何ですか? Windows 11 には、多数のネットワーク プロファイルが付属しています。これらのプロファイルは、基本的に、さまざまなネットワーク接続を構成するために使用できる設定のセットです。これは、自宅やオフィスに複数の接続がある場合に便利で、新しいネットワークに接続するたびにすべてを設定する必要がありません。プライベート ネットワーク プロファイルとパブリック ネットワーク プロファイルは Windows 11 の 2 つの一般的なタイプですが、一般的には

Python での動的配列の実装: 初心者から熟練者まで Python での動的配列の実装: 初心者から熟練者まで Apr 21, 2023 pm 12:04 PM

パート 1 Python シーケンス型の性質について話しましょう。このブログでは、Python のさまざまな「シーケンス」クラスと、一般的に使用される 3 つの組み込みデータ構造 (リスト、タプル、文字) について話します。文字列クラス (str) の性質)。お気づきかどうかはわかりませんが、これらのクラスには明らかな共通点があります。複数のデータ要素を保存するために使用できます。最も重要な機能は、各クラスがシーケンスの要素への添え字 (インデックス) アクセスをサポートしていることです。 SyntaxSeq[i] の使用など。実際、上記の各クラスは配列などの単純なデータ構造で表されます。ただし、Python に詳しい読者は、これら 3 つのデータ構造にいくつかの違いがあることをご存じかもしれません。たとえば、タプルと文字列は変更できませんが、リストは変更できます。

ビデオ マトリックス アカウントを作成するにはどうすればよいですか?どのようなタイプのマトリックスアカウントがありますか? ビデオ マトリックス アカウントを作成するにはどうすればよいですか?どのようなタイプのマトリックスアカウントがありますか? Mar 21, 2024 pm 04:57 PM

ショートビデオプラットフォームの人気に伴い、ビデオマトリックスアカウントマーケティングが新たなマーケティング手法となっています。企業や個人は、さまざまなプラットフォームで複数のアカウントを作成および管理することで、ブランドのプロモーション、ファンの増加、製品の販売などの目標を達成できます。この記事では、ビデオ マトリックス アカウントの効果的な使用方法について説明し、さまざまな種類のビデオ マトリックス アカウントを紹介します。 1. ビデオ マトリックス アカウントを作成するにはどうすればよいですか?優れたビデオ マトリックス アカウントを作成するには、次の手順に従う必要があります。 まず、ブランド コミュニケーション、ファンの増加、製品の販売など、ビデオ マトリックス アカウントの目標を明確にする必要があります。明確な目標を持つことは、それに応じた戦略を立てるのに役立ちます。 2. プラットフォームの選択: 対象視聴者に基づいて、適切なショートビデオ プラットフォームを選択します。現在主流のショートビデオプラットフォームには、Douyin、Kuaishou、Huoshan Videoなどが含まれます。

Golang関数の戻り値の型は何ですか? Golang関数の戻り値の型は何ですか? Apr 13, 2024 pm 05:42 PM

Go 関数は、異なる型の複数の値を返すことができます。戻り値の型は関数シグネチャで指定され、return ステートメントを通じて返されます。たとえば、関数は funcgetDetails()(int,string) のように整数と文字列を返すことができます。実際には、円の面積を計算する関数は、面積とオプションのエラーを返すことができます: funccircleArea(radiusfloat64)(float64,error)。注: 関数シグネチャで型が指定されていない場合は、null 値が返されます。読みやすさを向上させるために、明示的な型宣言を含む return ステートメントを使用することをお勧めします。

Python の型ヒントのベスト プラクティス Python の型ヒントのベスト プラクティス Apr 23, 2023 am 09:28 AM

しばらくの間動的言語を使用するのは素晴らしいことです。コードは火葬場で再構築されます。単体テストと同様に、コードを書くのに少し時間はかかりますが、長い目で見ると非常に価値のある作業です。この記事では、Python の型ヒントをよりよく理解し、使用する方法を説明します。 1. 型ヒントは構文レベルでのみ有効です。型ヒント (PEP3107 以降導入) は、変数、パラメーター、関数パラメーター、およびその戻り値、クラス プロパティ、メソッドに型を追加するために使用されます。 Python の変数型は動的であり、実行時に変更してコードに型ヒントを追加できます。変数型は構文レベルでのみサポートされ、コードの実行には影響しません。Python インタープリタは、コードの実行時に型ヒントを無視します。したがってタイプは

C++ 関数の種類と特性 C++ 関数の種類と特性 Apr 11, 2024 pm 03:30 PM

C++ 関数には、単純関数、const 関数、静的関数、および仮想関数というタイプがあり、インライン関数、デフォルト パラメーター、参照戻り値、およびオーバーロードされた関数などの機能が含まれます。たとえば、calculateArea 関数は π を使用して、指定された半径の円の面積を計算し、それを出力として返します。

主なセルフメディア プラットフォームは何ですか?セルフメディアプラットフォームにはどのような種類がありますか? 主なセルフメディア プラットフォームは何ですか?セルフメディアプラットフォームにはどのような種類がありますか? Mar 21, 2024 pm 06:36 PM

インターネットの急速な発展に伴い、セルフメディアは情報伝達の重要なチャネルとなっています。 Weメディアプラットフォームは、個人や企業が自らをアピールし、情報を広める舞台を提供します。現在、市場に出ている主なセルフメディアプラットフォームには、WeChat公式アカウント、Toutiao、Yidian News、Penguin Media Platformなどが含まれます。これらのプラットフォームにはそれぞれ独自の特徴があり、大多数のセルフメディア実践者に豊富な創造的なスペースを提供します。次に、これらのプラットフォームを詳しく紹介し、セルフメディア プラットフォームの種類を検討します。 1. 主要なセルフメディア プラットフォームは何ですか? WeChat公式アカウントは、テンセントが個人および法人ユーザー向けに情報公開・普及サービスを提供するために立ち上げたセルフメディアプラットフォームです。サービスアカウントとサブスクリプションアカウントの2種類に分かれており、サービスアカウントは主に企業向けのサービスを提供し、サブスクリプションアカウントは情報発信を中心としています。による

PHP8 の新機能の分析: より強力なタイプの属性をどのように活用するか? PHP8 の新機能の分析: より強力なタイプの属性をどのように活用するか? Sep 12, 2023 am 11:26 AM

PHP8 の新機能の分析: より強力なタイプの属性をどのように活用するか?近年、Web 開発の世界で PHP の人気が高まっています。 PHP は、その柔軟性と学習の容易さにより、さまざまなプロジェクトに適した人気のプログラミング言語となっています。言語を継続的に改善および最適化する取り組みの一環として、PHP8 には、プロパティの型付け強化など、多くの新機能が導入されています。この記事では、PHP8 のプロパティ タイプの新機能と、それらを活用してコードの信頼性とパフォーマンスを向上させる方法について詳しく説明します。 PHP8 より前では、プロパティの型宣言は次のようになります。

See all articles