Was sind Ressourcendatentypen?
Der Ressourcendatentyp wird in PHP4 eingeführt. Ressource ist ein spezieller Variablentyp, der einen Verweis auf eine externe Ressource enthält: beispielsweise eine geöffnete Datei, eine Datenbankverbindung, einen Grafikbereich usw.
Ressourcen werden durch spezielle Funktionen erstellt und genutzt.
Verwendung von Ressourcenvariablen in PHP
$fp = fopen("test.txt", "rw"); var_dump($fp); fclose($fp);
Ergebnis drucken: Ressource(5) vom Typ (Stream)
Nummer 5: Gibt an, dass die Ressourcen-ID 5 ist, Speziell Die Bedeutung wird später eingeführt.
stream: Name des Ressourcentyps.
Ressourcen-ID
Der Kernel speichert die registrierten Ressourcenvariablen in einer HashTable und verwendet den Schlüssel in der HashTable, in der sich die Ressource befindet, als Ressourcen-ID.
Tatsächlich speichert die Ressourcenvariable in PHP also tatsächlich eine Ganzzahl, und die entsprechende Ressource in der HashTable wird über diese ID gefunden.
#define Z_RESVAL(zval) (zval).value.lval #define Z_RESVAL_P(zval) Z_RESVAL(*zval) #define Z_RESVAL_PP(zval) Z_RESVAL(**zval)
Das obige Makro ist die von ZE im Kernel verwendete API, um Ressourcenvariablen Werte zuzuweisen. Es ist ersichtlich, dass es sich tatsächlich um eine Zuweisung an eine Ganzzahlvariable handelt.
Ressourcentypname
Um Ressourcentypen zu unterscheiden, müssen wir Typnamen für die von uns definierten Ressourcen definieren.
#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) führt alle erweiterten ZEND_MINIT_FUNCTIONs aus, wenn PHP als SAPI in den Speicher geladen wird (z. B. die mod_php5-Erweiterung von Apache).
Wobei jinyong der Name der aktuellen Erweiterung ist. Der Name der Erweiterung lautet derzeit beispielsweise jinyong
Zum leichteren Verständnis stellen wir uns das als die Erweiterung vor, die während der Initialisierung einen neuen Ressourcentyp beim Kernel registriert.
Ressourcenvariable erstellen
Der Ressourcentyp wurde erfolgreich registriert und ein unterscheidender Typname wurde für die Ressource definiert. Variablen für diese Ressource können jetzt verwendet werden.
Implementieren Sie die fopen-Funktion in PHP:
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返回资源变量 }
Hier wird die Funktion namens my_fopen in PHP definiert. my_fopen(string $file_name, string $mode)
implementiert die fclose-Funktion in PHP:
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; }
definiert die Funktion namens my_fclose in PHP. my_fclose($resource)
Mit der Methode in der benutzerdefinierten Erweiterung in PHP kann
my_fwrite($fp, "aaTest"); var_dump($fp); my_fclose($fp); var_dump($fp);
normal geöffnet und geschlossen werden Ressource.
Ressourcen freigeben
Da die PHP4-Zend-Engine ein Ressourcenzählsystem einführt, kann sie automatisch erkennen, dass auf eine Ressource nicht mehr verwiesen wird (genau wie Java). In diesem Fall werden alle von dieser Ressource verwendeten externen Ressourcen vom Garbage Collection-System freigegeben. Daher ist es selten erforderlich, manuell Speicher mithilfe einer Free-Result-Funktion freizugeben.
Hinweis: Permanente Datenbankverbindungen sind etwas Besonderes, sie werden vom Garbage-Collection-System nicht zerstört.
Im nächsten Abschnitt erklären wir den „Nullwert (null) “ unter den beiden speziellen Datentypen.
Das obige ist der detaillierte Inhalt vonPHP: Detaillierte Erläuterung der Beispiele für Ressourcendatentypen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!