首頁 後端開發 php教程 php:資源(resource)資料類型實例詳解

php:資源(resource)資料類型實例詳解

May 16, 2018 pm 04:08 PM

什麼是資源資料型別?

資源資料型態是PHP4引進的。資源是一種特殊的變數類型,保存了到外部資源的一個參考:如開啟檔案、資料庫連線、圖形畫布區域等。

資源是透過專門的函數來建立和使用的。

資源變數在PHP中的使用

$fp = fopen("test.txt", "rw");  
  
var_dump($fp);  
  
fclose($fp);
登入後複製

列印結果:resource(5) of type (stream)

數字5:表示資源ID為5,具體意義後面介紹。

stream:資源型別名稱。

資源ID

核心中將註冊的資源變數儲存在一個HashTable中,並將資源所在HashTable中的key當作資源ID。

所以,實際上PHP中的資源變數實際儲存的是一個整數,透過這個ID找到HashTable中對應的資源。

#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(例如,Apache的mod_php5擴充)被載入到記憶體時,會執行所有擴充的ZEND_MINIT_FUNCTION。

其中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 一樣)。這種情況下此資源所使用的所有外部資源都會被垃圾回收系統釋放。因此,很少需要用某些 free-result 函數來手動釋放記憶體。

注意: 持久性資料庫連線比較特殊,它們不會被垃圾回收系統破壞。

下一節,我們說明兩種特殊資料類型中的「空值(null)」。

以上是php:資源(resource)資料類型實例詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

MySQL資料庫中性別欄位應該使用什麼資料類型? MySQL資料庫中性別欄位應該使用什麼資料類型? Mar 14, 2024 pm 01:21 PM

在MySQL資料庫中,性別欄位通常可以使用ENUM類型來儲存。 ENUM是一種枚舉類型,它允許我們在一組預先定義的值中選擇一個作為欄位的值。在表示性別這樣一個固定且有限的選項時,ENUM是一個很好的選擇。讓我們來看一個具體的程式碼範例:假設我們有一個名為"users"的表,其中包含了使用者的信息,包括性別。現在我們要為性別創建一個字段,我們可以這樣設計表結構:CRE

115網盤怎麼找資源 115網盤怎麼找資源 Feb 23, 2024 pm 05:10 PM

115網盤裡會有很多的資源,那該怎麼找資源呢?使用者可以在軟體裡搜尋所需的資源,然後進入下載介面,然後選擇儲存到網盤就可以了。這篇115網盤找資源方法介紹就能夠告訴大家具體的內容,以下就是詳細的介紹,趕緊來看看吧。 115網盤怎麼找資源答:在軟體裡搜尋內容,然後點選儲存至網盤。具體介紹:1、先在app裡輸入想要的資源。 2、之後點選出現的關鍵字連結。 3、接著進入下載介面。 4.點擊裡面的存到網盤就可以了。

MySQL中最適合用於性別欄位的資料類型是什麼? MySQL中最適合用於性別欄位的資料類型是什麼? Mar 15, 2024 am 10:24 AM

在MySQL中,最適合用於性別欄位的資料類型是ENUM枚舉類型。 ENUM枚舉類型是一種允許定義一組可能取值的資料類型,性別欄位適合使用ENUM類型是因為性別通常只有兩個取值,即男性和女性。接下來,我將透過具體的程式碼範例來展示如何在MySQL中建立一個性別欄位並使用ENUM枚舉類型儲存性別資訊。以下是操作步驟:首先,在MySQL中建立一個名為users的表格,包括

Python 語法的心智圖:深入理解程式碼結構 Python 語法的心智圖:深入理解程式碼結構 Feb 21, 2024 am 09:00 AM

python憑藉其簡單易讀的語法,廣泛應用於廣泛的領域。掌握Python語法的基礎架構至關重要,既可以提高程式效率,又能深入理解程式碼的運作方式。為此,本文提供了一個全面的心智圖,詳細闡述了Python語法的各個面向。變數和資料類型變數是Python中用於儲存資料的容器。心智圖展示了常見的Python資料類型,包括整數、浮點數、字串、布林值和列表。每個資料類型都有其自身的特性和操作方法。運算符運算符用於對資料類型執行各種操作。心智圖涵蓋了Python中的不同運算子類型,例如算術運算子、比

韓小圈為什麼突然沒有資源了 韓小圈為什麼突然沒有資源了 Feb 24, 2024 pm 03:22 PM

韓小圈是能夠觀看許多韓劇的軟體,那為什麼突然沒有資源呢?這個軟體可能是因為網路問題,版本問題,或是版權問題才沒有資源。這篇韓小圈突然沒有資源原因介紹就能夠告訴大家具體的內容,以下就是詳細的介紹,趕快來看看吧。韓小圈為什麼突然沒有資源了答:由於網絡問題,版本問題,版權問題導致具體介紹:1、網絡問題解決方法:可以選擇不同的網絡,然後重新登入軟體試試。 2.版本問題解決方法:使用者可以從官網上下載這個軟體的最新版本。 3.版權問題解決方法:有的韓劇是因為版權問題下架,可以選擇別的韓劇觀看。

MySQL中布林類型的使用方法詳解 MySQL中布林類型的使用方法詳解 Mar 15, 2024 am 11:45 AM

MySQL中布林類型的使用方法詳解MySQL是一種常用的關聯式資料庫管理系統,在實際應用中經常需要使用布林類型來表示邏輯上的真假值。 MySQL中布林類型有兩種表示法:TINYINT(1)和BOOL。本文將詳細介紹MySQL中布林類型的使用方法,包括布林類型的定義、賦值、查詢和修改等操作,同時結合具體的程式碼範例進行說明。 1.布林類型的定義在MySQL中,可

MySQL中性別欄位最佳資料類型選擇是什麼? MySQL中性別欄位最佳資料類型選擇是什麼? Mar 14, 2024 pm 01:24 PM

在設計資料庫表時,選擇合適的資料類型對於效能最佳化和資料儲存效率非常重要。在MySQL資料庫中,儲存性別欄位的資料類型真是沒有所謂的最佳選擇,因為性別欄位一般只有兩個取值:男或女。但是為了效率和節省空間,我們可以選擇合適的資料類型來儲存性別欄位。在MySQL中,儲存性別欄位最常用的資料類型是枚舉類型。枚舉類型是一種能夠把欄位的值限定在一個有限的集合內的資料型別

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

在消逝的光芒這個遊戲中,許多玩家在前期可能會因為資源匱乏而被無數殭屍包圍。有時候他們還會冒險去拯救被困的流浪者,這些流浪者可能還會提供一些支線任務,完成後會有豐厚的獎勵。消逝的光芒無限資源獲取首先,找到一個贅災包裹,放入倉庫。在【物品欄】的首頁,選擇一個數量較多的物品,在選取時使用滑鼠左鍵點選。 2然後,按【ESC】,滑鼠不要移動,快速按F+A,按1下就好,隔約0.25秒,感覺倉庫頁面快跳出來時按滑鼠左和右鍵,滑鼠不要移且不是長按,跳出存放物品的提示即成功。 3最後,在倉庫找到【販災包裹】,被提示框

See all articles