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.