目次
変数タイプ:
:
PHP は文字列用に別の構造体 zend_string を定義します。 zend_value では、str は特定の構造体を指します。 ################################################
構造体には、要素のキーと値が格納されます。 h はハッシュ コードです。キーが数値 (および数値インデックス) の場合、その値は数値インデックスの値になります。キーが文字列の場合、その値は Time33 アルゴリズムによって計算されたハッシュ値になります。文字列キーに基づいて。 h 値は、要素の格納場所をマップするために使用されます。
リファレンス:

PHP7のデータ型

Apr 25, 2019 am 09:15 AM
php7

PHP の変数名 → zval、変数値 → zend_value。その変数メモリは参照カウントによって管理されます。PHP7 では、参照カウントは値構造内にあります。

変数タイプ:

ヘッダー ファイルは PHP ソース コード/zend/zend_types.h

:

## に内部的に実装されます。 # PHP は zval 構造体を通じて変数を表し、さまざまな型の変数値は zval に埋め込まれた共用体、つまり zend_value を通じて表されます。

## zend_value は共用体であり、そのコードは次のとおりです:

ast 、ptr、zv などの型は、カーネル自体によってのみ使用されます。

文字列:

PHP は文字列用に別の構造体 zend_string を定義します。 zend_value では、str は特定の構造体を指します。 ################################################



文字列の内容を格納する val は特殊です。

val は char* 型を使用しません。文字列を割り当てるときは、malloc(sizeof(zend_sting) string length) のように操作されます。これは、文字列の内容を保存するためにより多くのメモリが割り当てられることを意味します。このブロックの追加メモリの開始位置は val です。

これの利点は、1 つのメモリ割り当て (char*) を節約でき、メモリ管理に役立つことです。


val の追加バイト (構造内の val[0] ではなく val[1]) は、保存された文字列の最後の文字 "\0" を保存するために使用されます。

たとえば $a="abc" の場合、対応する zend_string メモリ構造は左のとおりです。

配列:




nTableMask:

この値は、ハッシュ関数がキーのハッシュ コード要素に基づいて場所を保存するときに使用されます。 nTableMask = -nTableSize または nTableMask = ~nTableSize 1.

nNumused, nNumOfElements:

配列要素を削除する場合、要素はすぐには配列から削除されません。代わりに、要素の型は IS_UNDEF としてマークされます。これは使用されるだけです。アレイの容量が制限を超えて拡張する必要がある場合にのみ削除されます。

展開がない場合、nNum Used は常に増加するため、その値は有効な要素数ではありません。 nNumOfElements は配列内の有効な要素の数であるため、nNumOfElements ≤ nNum Used になります。

バケット

構造体には、要素のキーと値が格納されます。 h はハッシュ コードです。キーが数値 (および数値インデックス) の場合、その値は数値インデックスの値になります。キーが文字列の場合、その値は Time33 アルゴリズムによって計算されたハッシュ値になります。文字列キーに基づいて。 h 値は、要素の格納場所をマップするために使用されます。

配列の実装:

ハッシュ テーブルの順序性を実現するために、PHP のハッシュ テーブルはハッシュ関数と要素の間に要素を追加します。配列. レイヤーマッピングテーブル、このマッピングテーブルも配列であり、サイズは要素を格納する配列と同じです。

中間マッピング テーブルは、実際に格納された順序付けされた配列内の要素の添字を格納します。要素は実際の格納配列に順番に挿入され、その配列の添字はハッシュ関数によってハッシュされた位置に格納されます。新しく追加されたマッピングテーブル。

ハッシュ関数:

要素の保存場所はキーに従ってマッピングされます。通常、モジュロがハッシュ関数として使用されます: key-> ;h %nテーブルサイズ。しかし、PHP は別のアプローチ (nIndex = key->h | nTableMask) を採用しています。

この中間マッピング テーブルは PHP 配列の構造には存在せず、実際には arData と一緒に配置されます。配列が初期化されると、バケットを格納するために使用されるメモリが割り当てられ、同時に uint32_t サイズの同量のスペースが割り当てられます。次に、要素の配列が格納されている場所に arData をオフセットします。 中間マッピング テーブルには、arData を介して前方にアクセスできます。

ハッシュの競合:

異なるキー値が同じハッシュ値を計算する可能性があり、ハッシュ テーブルに挿入するときに競合が発生します。 table 要素は 1 つだけ格納できます。

解決策: 競合するバケットをリンク リストに文字列化します。つまり、中間マッピング テーブルは、バケットではなくバケットのリンク リストをマップします。検索するときは、このリンク リストを横断し、キーを 1 つずつ比較して検索する必要があります。ターゲット要素。

HashTable は、arData 配列内で競合する要素の保存場所を記録します。

マッピング値を設定するときに、中間マッピング テーブルに設定する位置が、以前に挿入された要素によって占有されていることがわかりました (値が等しくない)初期化された -1)、既存の値を新しく挿入されたバケット (つまり、c が挿入された後の u2.next=0) に保存し、マッピング テーブル内の値を新しいバケットの保存場所に更新します。 (つまり、マッピング テーブルの値: 2)。

リファレンス:

リファレンスは、C 言語のポインターの概念に似た、他の型を指す構造体です。参照型変数を変更すると、その変更は実際に参照される変数に反映されます。

PHP では、$b = &$a などの & 演算子を通じて参照変数が生成されます。実行中、最初に zend_reference 構造体が & 演算の変数に割り当てられます。この構造体は参照です。 type 構造体。zval が埋め込まれており、この zval の値は元の zval の値を指します。その後、元の zval の型は IS_REFERENCE に変更され、元の zval の値は新しく作成された zend_reference 構造体を指します。

#例:

$a = date("Y-m");$b = &$a;
ログイン後にコピー

$a は文字列です&$a を介して参照型に変換し、$b に割り当てます。変換後、$a の型は IS_STRING から IS_REFERENCE に変更され、$a の値も zend_reference 構造体に変換されます。オリジナルの文字列。

$a と $b は、実際の値を間接的に指します。

参照を使用する場合は注意が必要です。参照は & を通じてのみ生成でき、代入を通じて渡すことはできません。

上記の例のように、$b が他の変数に割り当てられている場合、新しい変数に渡される値は、参照自体ではなく、実際の参照の値になります。

$a = date("Y-m");$b = &$a;$c = $b;   //如果想让$c也引用指向$a/$b引用的值,则:$c = &$b
ログイン後にコピー

以上がPHP7のデータ型の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、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)

php7.0 にプラグインがインストールされているのに、まだインストールされていないと表示される場合はどうすればよいですか? php7.0 にプラグインがインストールされているのに、まだインストールされていないと表示される場合はどうすればよいですか? Apr 02, 2024 pm 07:39 PM

PHP 7.0 でインストールされているプラ​​グインが表示されない問題を解決するには: プラグインの設定を確認し、プラグインを有効にします。 PHP を再起動して、構成の変更を適用します。プラグイン ファイルの権限をチェックして、それらが正しいことを確認します。不足している依存関係をインストールして、プラグインが適切に機能することを確認します。他のすべての手順が失敗した場合は、PHP を再構築します。他に考えられる原因としては、プラグインのバージョンに互換性がない、間違ったバージョンをロードしている、PHP 構成の問題などが挙げられます。

php7がTCPポートが機能していないことを検出した場合の問題を解決する方法 php7がTCPポートが機能していないことを検出した場合の問題を解決する方法 Mar 22, 2023 am 09:30 AM

php5 では、fsockopen() 関数を使用して TCP ポートを検出できます。この機能を使用して、ネットワーク接続を開き、ネットワーク通信を実行できます。ただし、php7 では、fsockopen() 関数でポートを開けない、サーバーに接続できないなどの問題が発生する可能性があります。この問題を解決するには、socket_create() 関数とsocket_connect() 関数を使用して TCP ポートを検出します。

php7.0にmongo拡張機能をインストールする方法 php7.0にmongo拡張機能をインストールする方法 Nov 21, 2022 am 10:25 AM

php7.0 に mongo 拡張機能をインストールする方法: 1. mongodb ユーザー グループとユーザーを作成します; 2. mongodb ソース コード パッケージをダウンロードし、ソース コード パッケージを "/usr/local/src/" ディレクトリに配置します; 3. 「src/」ディレクトリに入ります; 4. ソースコードパッケージを解凍します; 5. mongodb ファイルディレクトリを作成します; 6. ファイルを「mongodb/」ディレクトリにコピーします; 7. mongodb 設定ファイルを作成して設定を変更します。

php7.0のインストールとデプロイ方法 php7.0のインストールとデプロイ方法 Nov 30, 2022 am 09:56 AM

php7.0 をインストールおよび展開する方法: 1. PHP 公式 Web サイトにアクセスして、ローカル システムに対応するインストール バージョンをダウンロードします; 2. ダウンロードした zip ファイルを指定したディレクトリに解凍します; 3. コマンド ライン ウィンドウを開いて、次のリンクに移動します。 「E:\php7」ディレクトリ 「php -v」コマンドを実行するだけです。

PHP サーバー環境 FAQ ガイド: 一般的な問題を迅速に解決する PHP サーバー環境 FAQ ガイド: 一般的な問題を迅速に解決する Apr 09, 2024 pm 01:33 PM

PHP サーバー環境の一般的な解決策には、正しい PHP バージョンがインストールされていること、および関連ファイルがモジュール ディレクトリにコピーされていることを確認することが含まれます。 SELinux を一時的または永続的に無効にします。 PHP.ini をチェックして構成し、必要な拡張機能が追加され、正しく設定されていることを確認します。 PHP-FPM サービスを開始または再起動します。 DNS 設定に解決の問題がないか確認してください。

システムの再起動後にUnixSocketの権限を自動的に設定する方法は? システムの再起動後にUnixSocketの権限を自動的に設定する方法は? Mar 31, 2025 pm 11:54 PM

システムが再起動した後、UnixSocketの権限を自動的に設定する方法。システムが再起動するたびに、UnixSocketの許可を変更するために次のコマンドを実行する必要があります:sudo ...

php8 と php7 ではどちらが優れていますか? php8 と php7 ではどちらが優れていますか? Nov 16, 2023 pm 03:09 PM

PHP7 と比較すると、PHP8 にはパフォーマンス、新機能と構文の改善、型システム、エラー処理と拡張機能の点でいくつかの利点と改善点があります。ただし、どのバージョンを使用するかは、特定のニーズとプロジェクトの状況によって異なります。詳細な紹介: 1. パフォーマンスの向上、PHP8 はコードの実行速度を向上できるジャストインタイム (JIT) コンパイラーを導入します; 2. 新機能と構文の改善、PHP8 は名前付きパラメーターとオプションのパラメーターの宣言をサポートします。関数の作成 呼び出しがより柔軟になり、匿名クラス、プロパティの型宣言などが導入されています。

Docker環境にPECLを使用して拡張機能をインストールするときにエラーが発生するのはなぜですか?それを解決する方法は? Docker環境にPECLを使用して拡張機能をインストールするときにエラーが発生するのはなぜですか?それを解決する方法は? Apr 01, 2025 pm 03:06 PM

エラーの原因とソリューションPECLを使用してDocker環境に拡張機能をインストールする場合、Docker環境を使用するときに、いくつかの頭痛に遭遇します...

See all articles