ホームページ バックエンド開発 PHPチュートリアル PHP: リソースのデータ型の例の詳細な説明

PHP: リソースのデータ型の例の詳細な説明

May 16, 2018 pm 04:08 PM

リソースのデータ型とは何ですか?

リソースデータ型は PHP4 で導入されました。 Resource は、開いているファイル、データベース接続、グラフィックス キャンバス領域などの外部リソースへの参照を保持する特殊な変数タイプです。

リソースは、特殊な機能を通じて作成および使用されます。

PHPでのリソース変数の使用

$fp = fopen("test.txt", "rw");  
  
var_dump($fp);  
  
fclose($fp);
ログイン後にコピー

出力結果: タイプ(ストリーム)のリソース(5)

数字5: リソースIDが5であることを示します。具体的な意味は後で紹介します。

stream: リソースタイプ名。

リソースID

カーネルは、登録されたリソース変数をハッシュテーブルに保存し、リソースが配置されているハッシュテーブル内のキーをリソースIDとして使用します。

つまり、実際には、PHP のリソース変数には実際には整数が格納されており、HashTable 内の対応するリソースはこの ID を通じて検索されます。

#define Z_RESVAL(zval)          (zval).value.lval  
#define Z_RESVAL_P(zval)        Z_RESVAL(*zval)  
#define Z_RESVAL_PP(zval)       Z_RESVAL(**zval)
ログイン後にコピー

上記のマクロは、リソース変数に値を割り当てるためにカーネル内の ZE によって使用される API であり、実際に整数変数への代入であることがわかります。

リソースタイプ名

リソースタイプを区別するには、定義するリソースのタイプ名を定義する必要があります。

#define MY_RES_NAME "my_resource" //资源类型名称,PHP通过var_dump打印资源变量时会看到这个名称  
static int my_resource_descriptor;  
  
ZEND_MINIT_FUNCTION(jinyong)  
{  
    my_resource_descriptor = zend_register_list_destructors_ex(NULL, NULL, MY_RES_NAME, module_number);//向内核中注册新的资源类型  
}
ログイン後にコピー

ZEND_MINIT_FUNCTION(jinyong) は、PHP が SAPI としてメモリにロードされるときに、すべての拡張機能の ZEND_MINIT_FUNCTION を実行します (たとえば、Apache の mod_php5 拡張機能)。

その中で、jinyongは現在の拡張機能の名前です。例えば、この時の拡張機能の名前はjinyongです

理解を容易にするために、初期化時に新しいリソースタイプをカーネルに登録する拡張機能と考えます。

リソース変数の作成

リソースタイプが正常に登録され、区別されたタイプ名がリソースに定義されました。このリソースの変数が使用できるようになりました。

PHP で fopen 関数を実装します:

PHP_FUNCTION(my_fopen)  
{  
    zval *res;  
  
    char *filename, *mode;  
      
    int filename_strlen, mode_strlen;  
  
    FILE *fp;  
      
    if(zend_parse_parameters(ZEND_NUM_ARGS TSRMLS_CC, "s|s",  &filename, &filename_strlen, &mode, &mode_strlen) == FAILURE){  
        RETURN_FALSE;  
    }  
  
    //此处省略了对参数的有效性验证  
    fp = fopen(filename, mode);  
  
    ZEND_REGISTER_RESOURCE(res, fp, my_resource_descriptor);//向全局变量&EG(regular_list)中注册资源变量,并将对应HashTable的ID赋值给res  
  
    RETURN_RESOURCE(res);//向PHP返回资源变量  
}
ログイン後にコピー

ここでは、PHP で my_fopen という名前の関数が定義されています。 my_fopen(string $file_name, string $mode)

は、PHP で fclose 関数を実装します。

PHP_FUNCTION(my_fclose)  
{  
    zval *res;  
      
    FILE *fp;  
  
    if(zend_parse_parameters(ZEND_NUM_ARGS TSRMS_CC, "r", &res) == FAILURE){  
        RETURN_FALSE;  
    }  
  
    if(Z_TYPE_P(res) == IS_RESOURCE){//判断变量类型是否是资源类型  
        zend_hash_index_del(&EG(regular_list), Z_RESVAL_P(res));//EG就类似于PHP中的$_GLOBALS。在全局资源变量regular_list中删除对应ID的资源  
    }else{  
        php_error_docref(NULL TSRMLS_CC, E_WARNING, "参数必须是资源类型变量");  
        RETURN_FALSE;  
    }  
  
    RETURN_TRUE;  
}
ログイン後にコピー

は、PHP で my_fclose という名前の関数を定義します。 my_fclose($resource)

PHP

my_fwrite($fp, "aaTest");  
  
var_dump($fp);  
  
my_fclose($fp);  
  
var_dump($fp);
ログイン後にコピー

のカスタム拡張機能のメソッドを使用すると、リソースを正常に開閉できます。

リソースを解放する

PHP4 Zend エンジンにはリソースカウントシステムが導入されているため、(Java と同様に) リソースが参照されなくなったことを自動的に検出できます。この場合、このリソースによって使用されているすべての外部リソースは、ガベージ コレクション システムによって解放されます。したがって、結果解放関数を使用して手動でメモリを解放する必要がほとんどありません。

注: 永続的なデータベース接続は特別であり、ガベージ コレクション システムによって破棄されません。

次のセクションでは、2つの特殊なデータ型のうち、「null値(null)」について説明します。

以上が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衣類リムーバー

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)

MySQL データベースの性別フィールドにはどのデータ型を使用する必要がありますか? MySQL データベースの性別フィールドにはどのデータ型を使用する必要がありますか? Mar 14, 2024 pm 01:21 PM

MySQL データベースでは、通常、性別フィールドは ENUM タイプを使用して保存できます。 ENUM は、定義済みの値のセットから 1 つをフィ​​ールドの値として選択できる列挙型です。 ENUM は、性別などの固定的で限定されたオプションを表す場合に適しています。具体的なコード例を見てみましょう。性別を含むユーザー情報を含む「users」というテーブルがあるとします。ここで性別のフィールドを作成したいと思います。テーブル構造は次のように設計できます: CRE

115 ネットワーク ディスク上のリソースを見つける方法 115 ネットワーク ディスク上のリソースを見つける方法 Feb 23, 2024 pm 05:10 PM

115 ネットワーク ディスクには大量のリソースが存在しますが、リソースを見つけるにはどうすればよいでしょうか?ユーザーはソフトウェア内で必要なリソースを検索し、ダウンロード インターフェイスに入り、ネットワーク ディスクに保存することを選択できます。 115 ネットワーク ディスク上のリソースを検索する方法のこの紹介では、具体的な内容を説明します。 115 ネットワーク ディスク上のリソースを見つけるにはどうすればよいですか? 回答: ソフトウェアでコンテンツを検索し、クリックしてネットワーク ディスクに保存します。詳細な紹介: 1. まず、アプリに必要なリソースを入力します。 2. 次に、表示されるキーワードのリンクをクリックします。 3. 次に、ダウンロード インターフェイスに入ります。 4. 内部のネットワーク ディスクに保存をクリックします。

MySQL の性別フィールドに最適なデータ型は何ですか? MySQL の性別フィールドに最適なデータ型は何ですか? Mar 15, 2024 am 10:24 AM

MySQL では、性別フィールドに最も適したデータ型は ENUM 列挙型です。 ENUM 列挙型は、可能な値のセットを定義できるデータ型です。通常、性別には男性と女性の 2 つの値しかないため、性別フィールドは ENUM 型の使用に適しています。次に、具体的なコード例を使用して、MySQL で性別フィールドを作成し、ENUM 列挙型を使用して性別情報を保存する方法を示します。手順は次のとおりです。 まず、MySQL に users という名前のテーブルを作成します。

なぜHan Xiaoquanには突然リソースがなくなったのでしょうか? なぜHan Xiaoquanには突然リソースがなくなったのでしょうか? Feb 24, 2024 pm 03:22 PM

Han Xiaoquan は多くの韓国ドラマを視聴できるソフトウェアですが、なぜ突然リソースがなくなったのですか?このソフトウェアには、ネットワークの問題、バージョンの問題、または著作権の問題により、リソースがない可能性があります。 Han Xiaoquan が突然リソースを失った理由についてのこの記事では、その具体的な内容を説明します。 Han Xiaoquan に突然リソースがなくなったのはなぜですか? 回答: ネットワークの問題、バージョンの問題、および著作権の問題のため、詳細な紹介: 1. ネットワーク問題の解決策: 別のネットワークを選択し、ソフトウェアに再度ログインして試すことができます。 。 2. バージョンの問題の解決策: ユーザーは、このソフトウェアの最新バージョンを公式 Web サイトからダウンロードできます。 3. 著作権問題への対応: 一部の韓国ドラマは著作権問題により棚から削除されていますが、他の韓国ドラマを選択して視聴することができます。

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

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

MySQLでのBoolean型の使い方を詳しく解説 MySQLでのBoolean型の使い方を詳しく解説 Mar 15, 2024 am 11:45 AM

MySQL でのブール型の使用方法の詳細な説明 MySQL は、一般的に使用されるリレーショナル データベース管理システムです。実際のアプリケーションでは、論理的な true と false の値を表すためにブール型を使用する必要があることがよくあります。 MySQL には Boolean 型の表現方法として TINYINT(1) と BOOL の 2 つがあります。この記事では、ブール型の定義、代入、クエリ、変更など、MySQL でのブール型の使用方法を詳細に紹介し、具体的なコード例を示して説明します。 1. ブール型は MySQL で定義されており、次のようにすることができます。

MySQL の性別フィールドに最適なデータ型の選択は何ですか? MySQL の性別フィールドに最適なデータ型の選択は何ですか? Mar 14, 2024 pm 01:24 PM

データベース テーブルを設計する場合、適切なデータ型を選択することは、パフォーマンスの最適化とデータ ストレージの効率にとって非常に重要です。 MySQL データベースでは、性別フィールドには通常、男性または女性の 2 つの値しかないため、性別フィールドを保存するデータ型にいわゆる最良の選択はありません。ただし、効率とスペースを節約するために、性別フィールドを保存するのに適切なデータ型を選択できます。 MySQL では、性別フィールドを格納するために最も一般的に使用されるデータ型は列挙型です。列挙型は、フィールドの値を限られたセットに制限できるデータ型です。

Dying Light リソースを無限に更新する方法 Dying Light リソースを無限に更新する方法 Jan 24, 2024 pm 04:03 PM

『ダイイング ライト』というゲームでは、リソース不足により、序盤で多くのプレイヤーが無数のゾンビに囲まれることがあります。場合によっては、彼らは危険を冒して閉じ込められた放浪者を救出することもあり、これらの放浪者はいくつかのサイドタスクを提供することもあり、それを完了すると寛大な報酬が得られます。 Dying Light 無制限のリソース獲得 まず、救援パッケージを見つけて倉庫に置きます。 [在庫]のホームページで、数量の大きい項目を選択し、選択した状態で左クリックします。 2. 次に、マウスを動かさずに [ESC] を押します。F+A を素早く押します。1 回だけ押します。約 0.25 秒後、ウェアハウスのページが表示されそうなとき、マウスの左右のボタンを押します。 . マウスを動かさず、長押ししないでください。アイテムを保存するためのプロンプトが表示され、保存は成功します。 3最後に、倉庫で[災害パッケージ]を見つけて、次のメッセージが表示されます。

See all articles