Heim >Backend-Entwicklung >PHP-Tutorial >Schreiben von Parametertypbindungen für PHP-Erweiterungsfunktionen

Schreiben von Parametertypbindungen für PHP-Erweiterungsfunktionen

巴扎黑
巴扎黑Original
2016-12-07 15:25:431544Durchsuche

Sehen wir uns an, wie man die Typbindung dadurch implementiert, aber diese Funktion kann nur in Zend Engine 2, also PHP5, verwendet werden. Sehen wir uns noch einmal die Argumentinformationsstruktur von ZE2 an. Die Deklaration jeder arg-Info-Struktur beginnt mit der Makrofunktion ZEND_BEGIN_ARG_INFO() oder ZEND_BEGIN_ARG_INFO_EX(), gefolgt von mehreren Zeilen der Makrofunktion ZEND_ARG_*INFO() und endet schließlich mit der Makrofunktion ZEND_END_ARG_INFO(). Wenn wir die count()-Funktion in der PHP-Sprache umschreiben möchten, können wir:
ZEND_FUNCTION(sample_count_array)
{
zval *arr;
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "a" ,&arr) == FAILURE) {
                                                    meters() selbst wird garantiert geliefert. Der übergebene Parameter ist ein Array. Wenn wir jedoch Parameter über die Funktion zend_get_parameter() erhalten, haben wir nicht so viel Glück und müssen die Typprüfung selbst durchführen. Wenn Sie möchten, dass der Kernel die Typüberprüfung automatisch durchführt, müssen Sie arg_info auf die Bühne bringen:
ZEND_BEGIN_ARG_INFO(php_sample_array_arginfo, 0)
ZEND_ARG_ARRAY_INFO(0, arr, 0)
ZEND_END_ARG_INFO()

... .
PHP_FE(sample_count_array, php_sample_array_arginfo)
...
Auf diese Weise haben wir die Arbeit des Typkorrekturlesens an Zend Engine übergeben. Fühlen Sie sich nicht erleichtert? Sie haben Ihrem Argument auch einen Namen gegeben, damit die generierten Fehlermeldungen für Skriptautoren, die versuchen, Ihre API zu verwenden, aussagekräftiger sind. Wir können das Objekt im Argument auch überprüfen, um einzuschränken, ob es von einer bestimmten Klasse oder Implementierung erbt Schnittstelle und so weiter.
ZEND_BEGIN_ARG_INFO(php_sample_class_arginfo, 0)
ZEND_ARG_OBJ_INFO(1, obj, stdClass, 0)
ZEND_END_ARG_INFO()
Es ist zu beachten, dass der Wert des ersten Parameters zu diesem Zeitpunkt die Zahl 1 ist, was „Passed by reference“ darstellt. Tatsächlich ist dieser Parameter für Objekte nahezu nutzlos, da alle Objekte in ZE2 standardmäßig als Referenz übergeben werden, wenn sie als Funktionsparameter verwendet werden. Wir müssen diesen Parameter jedoch auf die Zahl 1 setzen, es sei denn, Sie möchten nicht, dass Ihre Erweiterung mit PHP4 kompatibel ist. In PHP4 werden Objekte als vollständige Kopie und nicht als Referenz übergeben.

Vergessen Sie bei Array- und Objektparametern nicht, dass der letzte Parameter NULL sein darf. Weitere Informationen finden Sie in der Beschreibung im letzten Abschnitt von Kapitel 6.
Die Funktion der Typbindung über arg info ist nur für ZE2 gültig, also PHP5+. Wenn Sie die entsprechende Funktion auf PHP4 implementieren möchten, müssen Sie die Funktion zend_get_parameters() verwenden, um Parameter zu empfangen, und dann die Makrofunktion Z_TYPE_P() verwenden, um den Typ der Parameter zu erkennen, oder die Funktion convert_to_type() verwenden, um den Typ auszuführen Konvertierung.

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn