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

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

リソースデータ型は 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 までご連絡ください。
dint是什么数据类型dint是什么数据类型Sep 05, 2022 am 11:05 AM

dint是带符号位的32位整数类型;dint的表示方法及范围是“L#-2147483648~L#+2147483647”,定义为双整数或长整数,字节是电脑里的数据量单位,在计算机中,数据只用0和1这种表现形式。

Python时间序列数据操作的常用方法总结Python时间序列数据操作的常用方法总结Apr 24, 2023 pm 10:22 PM

时间序列数据是一种在一段时间内收集的数据类型,它通常用于金融、经济学和气象学等领域,经常通过分析来了解随着时间的推移的趋势和模式Pandas是Python中一个强大且流行的数据操作库,特别适合处理时间序列数据。它提供了一系列工具和函数可以轻松加载、操作和分析时间序列数据。在本文中,我们介绍时间序列数据的索引和切片、重新采样和滚动窗口计算以及其他有用的常见操作,这些都是使用Pandas操作时间序列数据的关键技术。数据类型Python在Python中,没有专门用于表示日期的内置数据类型。一般情况下都

115网盘怎么找资源115网盘怎么找资源Feb 23, 2024 pm 05:10 PM

115网盘里会有很多的资源,那么该怎么找资源呢?用户们可以在软件里搜索需要的资源,然后进入下载界面,然后选择存至网盘就可以了。这篇115网盘找资源方法介绍就能够告诉大家具体的内容,下面就是详细的介绍,赶紧来看看吧。115网盘怎么找资源答:在软件里搜索内容,然后点击存至网盘。具体介绍:1、首先在app里输入想要的资源。2、之后点击出现的关键词链接。3、接着进入下载界面。4、点击里面的存至网盘就可以了。

资源管理器.exe在 Windows 11 安全模式下发生崩溃的情况不再发生资源管理器.exe在 Windows 11 安全模式下发生崩溃的情况不再发生Aug 30, 2023 pm 11:09 PM

资源管理器.exe在Windows11的安全模式下崩溃?不会了。Microsoft刚刚发布了开发频道的新补丁,虽然此版本没有新功能,但许多修复和改进都进入了Windows预览体验计划,包括资源管理器.exe在安全模式下崩溃的烦人错误。好吧,你现在可以告别它了,至少在Windows预览体验计划中是这样。但与所有这些更新一样,它们也将进入实时Windows服务器。修复了导致资源管理器.exe无法在安全模式下工作的问题。但是,文件资源管理器还进行了其他一些修复,因此Microsoft热衷于使其正常工作

韩小圈为什么突然没有资源了韩小圈为什么突然没有资源了Feb 24, 2024 pm 03:22 PM

韩小圈是能够观看很多韩剧的软件,那么为什么突然没有资源呢?这个软件可能是因为网络问题,版本问题,或者是版权问题才没有资源。这篇韩小圈突然没有资源原因介绍就能够告诉大家具体的内容,下面就是详细的介绍,赶紧来看看吧。韩小圈为什么突然没有资源了答:由于网络问题,版本问题,版权问题导致具体介绍:1、网络问题解决方法:可以选择不同的网络,然后重新登录软件试试。2、版本问题解决方法:用户们可以从官网上下载这个软件的最新版本。3、版权问题解决方法:有的韩剧是因为版权问题下架,可以选择别的韩剧观看。

mysql性别用什么类型mysql性别用什么类型Jun 13, 2023 am 11:33 AM

MySQL性别采用多种数据类型来表示性别字段,例如CHAR、ENUM等,最终采用哪种类型,取决于实际需求以及数据存储的大小和性能。

如何无限刷取消逝的光芒资源如何无限刷取消逝的光芒资源Jan 24, 2024 pm 04:03 PM

在消逝的光芒这个游戏中,许多玩家在前期可能会因为资源匮乏而被无数丧尸包围。有时候他们还会冒险去拯救被困的流浪者,这些流浪者可能还会提供一些支线任务,完成后会有丰厚的奖励。消逝的光芒无限资源获取首先,找到一个赈灾包裹,放入仓库。在【物品栏】的首页,选择一个数量较多的物品,在选中时使用鼠标左键点击。2然后,按【ESC】,鼠标不要移动,快速按F+A,按1下就好,隔约0.25秒,感觉仓库页面快跳出来时按鼠标左和右键,鼠标不要移且不是长按,跳出存放物品的提示即成功。3最后,在仓库找到【贩灾包裹】,被提示框

Go语言图形界面开发:探索现有工具与资源Go语言图形界面开发:探索现有工具与资源Mar 23, 2024 pm 03:06 PM

指导原则:Go语言本身并不直接支持图形界面开发,但是可以通过调用其他语言的库或者使用现有的工具来实现图形界面开发。本文将介绍一些常用的工具和资源,帮助读者更好地探索使用Go语言进行图形界面开发的可能性。一、Go语言图形界面开发的现状Go语言是一种高效、简洁的编程语言,适用于各种应用领域,但在图形界面开发方面并不擅长。由于Go语言的性能和并发特性,许多开发者希

See all articles

ホット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ヘンタイを無料で生成します。

ホットツール

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

AtomエディタMac版ダウンロード

AtomエディタMac版ダウンロード

最も人気のあるオープンソースエディター

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強力な PHP 統合開発環境

SublimeText3 Mac版

SublimeText3 Mac版

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

Dreamweaver Mac版

Dreamweaver Mac版

ビジュアル Web 開発ツール