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 です。
val の追加バイト (構造内の val[0] ではなく val[1]) は、保存された文字列の最後の文字 "\0" を保存するために使用されます。
たとえば $a="abc" の場合、対応する zend_string メモリ構造は左のとおりです。
この値は、ハッシュ関数がキーのハッシュ コード要素に基づいて場所を保存するときに使用されます。 nTableMask = -nTableSize または nTableMask = ~nTableSize 1.
nNumused, nNumOfElements:配列要素を削除する場合、要素はすぐには配列から削除されません。代わりに、要素の型は IS_UNDEF としてマークされます。これは使用されるだけです。アレイの容量が制限を超えて拡張する必要がある場合にのみ削除されます。
展開がない場合、nNum Used は常に増加するため、その値は有効な要素数ではありません。 nNumOfElements は配列内の有効な要素の数であるため、nNumOfElements ≤ nNum Used になります。
バケット構造体には、要素のキーと値が格納されます。 h はハッシュ コードです。キーが数値 (および数値インデックス) の場合、その値は数値インデックスの値になります。キーが文字列の場合、その値は Time33 アルゴリズムによって計算されたハッシュ値になります。文字列キーに基づいて。 h 値は、要素の格納場所をマップするために使用されます。
配列の実装:
中間マッピング テーブルは、実際に格納された順序付けされた配列内の要素の添字を格納します。要素は実際の格納配列に順番に挿入され、その配列の添字はハッシュ関数によってハッシュされた位置に格納されます。新しく追加されたマッピングテーブル。
ハッシュ関数:
要素の保存場所はキーに従ってマッピングされます。通常、モジュロがハッシュ関数として使用されます: 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 = date("Y-m");$b = &$a;$c = $b; //如果想让$c也引用指向$a/$b引用的值,则:$c = &$b
以上がPHP7のデータ型の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

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

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

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

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

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

ホットトピック









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

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

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

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

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

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

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

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