ホームページ バックエンド開発 PHPチュートリアル PHP の原則 (PHP 内の変数) の深い理解

PHP の原則 (PHP 内の変数) の深い理解

Oct 15, 2019 pm 01:35 PM
原理 変数

PHP の原則 (PHP 内の変数) の深い理解

ご存知かもしれませんし、ご存じないかもしれませんが、PHP は弱い型指定の動的スクリプト言語です。 いわゆる弱い型とは、変数を宣言するときに、PHP が変数の型を厳密に検証しないことを意味します (厳密に言うと、PHP は中程度に強い型の言語です。この部分については今後の記事で説明します)。 、保存するデータのタイプを明示的に指定する必要はありません:

<?php
  $var = 1; //int
  $var = "laruence"; //string
  $var = 1.0002; //float
  $var = array(); // array
  $var = new Exception(&#39;error&#39;); //object;
ログイン後にコピー

動的言語。つまり、PHP の言語構造は実行時に変更できます。たとえば、実行時に必要となるのは、言語の関数テーブルを動的に変更する関数定義ファイルです。

いわゆるスクリプト言語は、PHP が独立して実行されないことを意味します。PHP を実行するには、PHP パーサーが必要です:

/usr/bin/php -f example.php
ログイン後にコピー

PHP の実行が次のとおりであることは、前の記事ですでに述べました。 Zend エンジン (ZE、Zend エンジン) を通じて、ZE は C で書かれています。C が厳密に型指定された言語であることは誰もが知っています。つまり、C のすべての変数は、宣言されてから最終的に破棄されるまで 1 つの型しか保存できません。 . データの種類。では、PHP はどのようにして ZE に基づいて弱い型を実装するのでしょうか?

PHP では、すべての変数は構造体 -zval を使用して保存されます。Zend/zend.h では、zval の定義を確認できます:

typedef struct _zval_struct {
    zvalue_value value;
    zend_uint refcount;
    zend_uchar type;
    zend_uchar is_ref;
  } zval;
ログイン後にコピー

where zvalue_value is trueデータ保存の鍵 PHP は ZE に基づいて弱い型をどのように実装しますか? zvalue_value は共用体であるため、

typedef union _zvalue_value {
    long lval;
    double dval;
    struct {
        char *val;
        int len;
    } str;
    HashTable *ht;
    zend_object_value obj;
} zvalue_value;
ログイン後にコピー

では、この構造体はどのようにして PHP で複数の型を格納するのでしょうか?

PHP の一般的な変数の型は次のとおりです:

  • 1. 整数/浮動小数点/長整数/ブール値など

  • 2. 文字列

  • 3. 配列/連想配列

  • ##4. オブジェクト

  • 5. リソース

PHP は、zval の type フィールドに基づいて変数の実際の型を格納し、型に基づいて zvalue_value の値を取得する方法を選択します。たとえば、整数とブール値の場合:

   zval.type = IS_LONG;//整形
   zval.type = IS_BOOL;//布尔值
ログイン後にコピー

Get zval.value.lval、ブール値の場合は lval∈(0|1);

倍精度の場合、またはfloat 次に、zval.value の dval を取得します。

そして、それが文字列の場合:

   zval.type = IS_STRING
ログイン後にコピー

この時点では、次のようになります:

zval.value.str

これは次のとおりです。 C 形式の文字列と文字列の長さを格納する構造体でもあります。

配列とオブジェクトの場合、type はそれぞれ

IS_ARRAY、IS_OBJECT に対応し、対応するものはそれぞれ zval.value.ht と obj## です。 #何が特別なのかというと、リソースです。PHP では、リソースは非常に特別な変数です。データベースハンドル、開いているファイルなど、PHP の組み込み変数タイプに属さない変数はすべて、保存用のリソースとみなされます。ハンドル等。リソースの場合:

   type = IS_RESOURCE
ログイン後にコピー

この時点で、

zval.value.lval

が取得されます。この時点で、lval は整数インジケーターであり、PHP はこのインジケーターを PHP クエリで使用します。 (この部分は今後別記事で紹介します) とりあえず、この時の lval がリソースリストに対応するオフセット値のようだということだけ知っておいてください。

 ZEND_FETCH_RESOURCE(con, type, zval *, default, resource_name, resource_type);
ログイン後にコピー
このようなメカニズムを借用することで、PHP は弱い型を実装します。これは、ZE の場合、常に同じ型、つまり zval に直面するためです。

PHP 関連の知識の詳細については、

PHP 中国語 Web サイト

をご覧ください。

以上がPHP の原則 (PHP 内の変数) の深い理解の詳細内容です。詳細については、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)

nohupの機能と原理の解析 nohupの機能と原理の解析 Mar 25, 2024 pm 03:24 PM

nohup の役割と原理の分析 Unix および Unix 系オペレーティング システムでは、nohup はバックグラウンドでコマンドを実行するためによく使用されるコマンドです。ユーザーが現在のセッションを終了したり、ターミナル ウィンドウを閉じたりしても、コマンドはまだ実行され続けています。この記事では、nohup コマンドの機能と原理を詳しく分析します。 1. nohup の役割: バックグラウンドでのコマンドの実行: nohup コマンドを使用すると、ターミナル セッションを終了するユーザーの影響を受けることなく、長時間実行されるコマンドをバックグラウンドで実行し続けることができます。これは実行する必要があります

Struts フレームワークの原則と実践についての深い議論 Struts フレームワークの原則と実践についての深い議論 Feb 18, 2024 pm 06:10 PM

Struts フレームワークの原理分析と実践的な調査 JavaWeb 開発で一般的に使用される MVC フレームワークとして、Struts フレームワークは優れた設計パターンとスケーラビリティを備えており、エンタープライズ レベルのアプリケーション開発で広く使用されています。この記事では、Struts フレームワークの原理を分析し、読者がフレームワークをよりよく理解して適用できるように、実際のコード例を使用してそれを検討します。 1. Struts フレームワークの原理の分析 1. MVC アーキテクチャ Struts フレームワークは MVC (Model-View-Con) に基づいています。

MyBatis のバッチ挿入実装原理の深い理解 MyBatis のバッチ挿入実装原理の深い理解 Feb 21, 2024 pm 04:42 PM

MyBatis は、さまざまな Java プロジェクトで広く使用されている人気のある Java 永続層フレームワークです。その中でも、バッチ挿入は、データベース操作のパフォーマンスを効果的に向上させることができる一般的な操作です。この記事では、MyBatis でのバッチ挿入の実装原理を深く調査し、特定のコード例を使用して詳細に分析します。 MyBatis でのバッチ挿入 MyBatis では、通常、バッチ挿入操作は動的 SQL を使用して実装されます。複数の挿入値を含む S を構築することによって

Javaのインスタンス変数とは何ですか Javaのインスタンス変数とは何ですか Feb 19, 2024 pm 07:55 PM

Java のインスタンス変数は、メソッドやコンストラクターではなく、クラスで定義された変数を指します。インスタンス変数はメンバー変数とも呼ばれ、クラスの各インスタンスにはインスタンス変数の独自のコピーがあります。インスタンス変数はオブジェクトの作成時に初期化され、その状態はオブジェクトの存続期間全体にわたって保存および維持されます。インスタンス変数定義は通常、クラスの先頭に配置され、パブリック、プライベート、プロテクト、またはデフォルトのアクセス修飾子など、任意のアクセス修飾子を使用して宣言できます。それは私たちがこれをどうしたいかによって決まります

Ajaxを使用してPHPメソッドから変数を取得するにはどうすればよいですか? Ajaxを使用してPHPメソッドから変数を取得するにはどうすればよいですか? Mar 09, 2024 pm 05:36 PM

Ajax を使用して PHP メソッドから変数を取得することは、Web 開発では一般的なシナリオであり、Ajax を使用すると、データを更新せずにページを動的に取得できます。この記事では、Ajax を使用して PHP メソッドから変数を取得する方法と、具体的なコード例を紹介します。まず、Ajax リクエストを処理し、必要な変数を返すための PHP ファイルを作成する必要があります。以下は、単純な PHP ファイル getData.php のサンプル コードです。

Python 構文のマインド マップ: コード構造の深い理解 Python 構文のマインド マップ: コード構造の深い理解 Feb 21, 2024 am 09:00 AM

Pythonはそのシンプルで読みやすい構文から幅広い分野で広く使われています。プログラミングの効率を向上させ、コードがどのように機能するかを深く理解するためには、Python 構文の基本構造をマスターすることが重要です。この目的を達成するために、この記事では、Python 構文のさまざまな側面を詳しく説明した包括的なマインド マップを提供します。変数とデータ型 変数は、Python でデータを保存するために使用されるコンテナです。マインド マップには、整数、浮動小数点数、文字列、ブール値、リストなどの一般的な Python データ型が表示されます。各データ型には独自の特性と操作方法があります。演算子 演算子は、データ型に対してさまざまな操作を実行するために使用されます。マインド マップは、算術演算子、比率など、Python のさまざまな演算子の種類をカバーしています。

Linux RPM ツールの機能と原理についての詳細な説明 Linux RPM ツールの機能と原理についての詳細な説明 Feb 23, 2024 pm 03:00 PM

Linux システムの RPM (RedHatPackageManager) ツールは、システム ソフトウェア パッケージのインストール、アップグレード、アンインストール、管理を行うための強力なツールです。これは RedHatLinux システムで一般的に使用されるソフトウェア パッケージ管理ツールであり、他の多くの Linux ディストリビューションでも使用されます。 RPM ツールの役割は非常に重要で、システム管理者とユーザーがシステム上のソフトウェア パッケージを簡単に管理できるようになります。 RPM を通じて、ユーザーは新しいソフトウェア パッケージを簡単にインストールし、既存のソフトウェアをアップグレードできます。

MyBatis ページングプラグインの原理の詳細な説明 MyBatis ページングプラグインの原理の詳細な説明 Feb 22, 2024 pm 03:42 PM

MyBatis は優れた永続層フレームワークであり、XML とアノテーションに基づいたデータベース操作をサポートし、シンプルで使いやすく、豊富なプラグイン メカニズムも提供します。その中でも、ページング プラグインは、よく使用されるプラグインの 1 つです。この記事では、MyBatis ページング プラグインの原理を詳しく説明し、具体的なコード例で説明します。 1. ページング プラグインの原理 MyBatis 自体はネイティブ ページング機能を提供しませんが、プラグインを使用してページング クエリを実装できます。ページング プラグインの原理は主に MyBatis を傍受することです

See all articles