[PHP-CVS] [php-src] master: snmp: Additional SNMP library output formatting options (#21502)

[email protected] (eskyuu via GitHub)
Newsgroups php.cvs
Message-ID <[email protected]>
Author: eskyuu (eskyuu)
Committer: GitHub (web-flow)
Pusher: Girgias
Date: 2026-08-24T14:08:31+01:00

Commit: https://github.com/php/php-src/commit/33e3966f8b28564700dfe96509d47f3d54688bc7
Raw diff: https://github.com/php/php-src/commit/33e3966f8b28564700dfe96509d47f3d54688bc7.diff

snmp: Additional SNMP library output formatting options (#21502)

RFC: https://wiki.php.net/rfc/snmp_improvements_2026#implement_more_mib_parsing_and_value_output_controls

Changed paths:
  A  ext/snmp/snmp_decl.h
  M  ext/snmp/php_snmp.h
  M  ext/snmp/snmp.c
  M  ext/snmp/snmp.stub.php
  M  ext/snmp/snmp_arginfo.h
  M  ext/snmp/tests/snmp-object-properties.phpt
  M  ext/snmp/tests/snmp_set_oid_output_format.phpt


Diff:

diff --git a/ext/snmp/php_snmp.h b/ext/snmp/php_snmp.h
index c5376ee2e1b2..52100b09b77a 100644
--- a/ext/snmp/php_snmp.h
+++ b/ext/snmp/php_snmp.h
@@ -48,6 +48,13 @@ typedef struct _php_snmp_object {
 	int valueretrieval;
 	bool quick_print;
 	bool enum_print;
+	bool numeric_index;
+	bool numeric_timeticks;
+	bool extended_index;
+	bool dont_print_units;
+	bool escape_quotes;
+	bool print_hex_text;
+	int string_output_format;
 	int oid_output_format;
 	int snmp_errno;
 	bool oid_increasing_check;
diff --git a/ext/snmp/snmp.c b/ext/snmp/snmp.c
index 8fac85a236ab..94b7d803a030 100644
--- a/ext/snmp/snmp.c
+++ b/ext/snmp/snmp.c
@@ -22,6 +22,7 @@
 #endif
 
 #include "php.h"
+#include "Zend/zend_enum.h"
 #include "main/php_network.h"
 #include "ext/standard/info.h"
 
@@ -64,7 +65,12 @@
 #include <net-snmp/net-snmp-config.h>
 #include <net-snmp/net-snmp-includes.h>
 
+#include "snmp_decl.h"
 #include "snmp_arginfo.h"
+static zend_class_entry *SnmpMib_ce;
+static zend_class_entry *SnmpOidOutput_ce;
+static zend_class_entry *SnmpOutput_ce;
+static zend_class_entry *SnmpStringOutput_ce;
 
 /* For net-snmp prior to 5.4 */
 #ifndef HAVE_SHUTDOWN_SNMP_LOGGING
@@ -90,6 +96,10 @@ typedef struct snmp_session php_snmp_session;
 }
 
 static bool mib_needs_reset;
+static php_snmp_object saved_snmp_settings;
+static int saved_mib_allow_underscores;
+static int saved_mib_comment_term;
+static int saved_mib_replace;
 
 ZEND_DECLARE_MODULE_GLOBALS(snmp)
 static PHP_GINIT_FUNCTION(snmp);
@@ -1246,6 +1256,42 @@ static ZEND_ATTRIBUTE_NONNULL_ARGS(2) bool snmp_session_set_security(struct snmp
 }
 /* }}} */
 
+/* {{{ Save the snmplib state into the given php_snmp_object */
+static void save_snmplib_output_options(php_snmp_object *snmp_object)
+{
+	// Booleans
+	snmp_object->quick_print = netsnmp_ds_get_boolean(NETSNMP_DS_LIBRARY_ID, NETSNMP_DS_LIB_QUICK_PRINT);
+	snmp_object->enum_print = netsnmp_ds_get_boolean(NETSNMP_DS_LIBRARY_ID, NETSNMP_DS_LIB_PRINT_NUMERIC_ENUM);
+	snmp_object->numeric_index = netsnmp_ds_get_boolean(NETSNMP_DS_LIBRARY_ID, NETSNMP_DS_LIB_DONT_BREAKDOWN_OIDS);
+	snmp_object->numeric_timeticks = netsnmp_ds_get_boolean(NETSNMP_DS_LIBRARY_ID, NETSNMP_DS_LIB_NUMERIC_TIMETICKS);
+	snmp_object->extended_index = netsnmp_ds_get_boolean(NETSNMP_DS_LIBRARY_ID, NETSNMP_DS_LIB_EXTENDED_INDEX);
+	snmp_object->dont_print_units = netsnmp_ds_get_boolean(NETSNMP_DS_LIBRARY_ID, NETSNMP_DS_LIB_DONT_PRINT_UNITS);
+	snmp_object->escape_quotes = netsnmp_ds_get_boolean(NETSNMP_DS_LIBRARY_ID, NETSNMP_DS_LIB_ESCAPE_QUOTES);
+	snmp_object->print_hex_text = netsnmp_ds_get_boolean(NETSNMP_DS_LIBRARY_ID, NETSNMP_DS_LIB_PRINT_HEX_TEXT);
+	// Integers
+	snmp_object->string_output_format = netsnmp_ds_get_int(NETSNMP_DS_LIBRARY_ID, NETSNMP_DS_LIB_STRING_OUTPUT_FORMAT);
+	snmp_object->oid_output_format = netsnmp_ds_get_int(NETSNMP_DS_LIBRARY_ID, NETSNMP_DS_LIB_OID_OUTPUT_FORMAT);
+}
+/* }}} */
+
+/* {{{ Set the snmplib output options using the given php_snmp_object */
+static void set_snmplib_output_options(php_snmp_object *snmp_object)
+{
+	// Booleans
+	netsnmp_ds_set_boolean(NETSNMP_DS_LIBRARY_ID, NETSNMP_DS_LIB_QUICK_PRINT, snmp_object->quick_print);
+	netsnmp_ds_set_boolean(NETSNMP_DS_LIBRARY_ID, NETSNMP_DS_LIB_PRINT_NUMERIC_ENUM, snmp_object->enum_print);
+	netsnmp_ds_set_boolean(NETSNMP_DS_LIBRARY_ID, NETSNMP_DS_LIB_DONT_BREAKDOWN_OIDS, snmp_object->numeric_index);
+	netsnmp_ds_set_boolean(NETSNMP_DS_LIBRARY_ID, NETSNMP_DS_LIB_NUMERIC_TIMETICKS, snmp_object->numeric_timeticks);
+	netsnmp_ds_set_boolean(NETSNMP_DS_LIBRARY_ID, NETSNMP_DS_LIB_EXTENDED_INDEX, snmp_object->extended_index);
+	netsnmp_ds_set_boolean(NETSNMP_DS_LIBRARY_ID, NETSNMP_DS_LIB_DONT_PRINT_UNITS, snmp_object->dont_print_units);
+	netsnmp_ds_set_boolean(NETSNMP_DS_LIBRARY_ID, NETSNMP_DS_LIB_ESCAPE_QUOTES, snmp_object->escape_quotes);
+	netsnmp_ds_set_boolean(NETSNMP_DS_LIBRARY_ID, NETSNMP_DS_LIB_PRINT_HEX_TEXT, snmp_object->print_hex_text);
+	// Integers
+	netsnmp_ds_set_int(NETSNMP_DS_LIBRARY_ID, NETSNMP_DS_LIB_STRING_OUTPUT_FORMAT, snmp_object->string_output_format);
+	netsnmp_ds_set_int(NETSNMP_DS_LIBRARY_ID, NETSNMP_DS_LIB_OID_OUTPUT_FORMAT, snmp_object->oid_output_format);
+}
+/* }}} */
+
 /* {{{ php_snmp
 *
 * Generic SNMP handler for all versions.
@@ -1429,12 +1475,10 @@ static void php_snmp(INTERNAL_FUNCTION_PARAMETERS, int st, int version)
 		}
 		objid_query.oid_increasing_check = snmp_object->oid_increasing_check;
 		objid_query.valueretrieval = snmp_object->valueretrieval;
-		glob_snmp_object.enum_print = netsnmp_ds_get_boolean(NETSNMP_DS_LIBRARY_ID, NETSNMP_DS_LIB_PRINT_NUMERIC_ENUM);
-		netsnmp_ds_set_boolean(NETSNMP_DS_LIBRARY_ID, NETSNMP_DS_LIB_PRINT_NUMERIC_ENUM, snmp_object->enum_print);
-		glob_snmp_object.quick_print = netsnmp_ds_get_boolean(NETSNMP_DS_LIBRARY_ID, NETSNMP_DS_LIB_QUICK_PRINT);
-		netsnmp_ds_set_boolean(NETSNMP_DS_LIBRARY_ID, NETSNMP_DS_LIB_QUICK_PRINT, snmp_object->quick_print);
-		glob_snmp_object.oid_output_format = netsnmp_ds_get_int(NETSNMP_DS_LIBRARY_ID, NETSNMP_DS_LIB_OID_OUTPUT_FORMAT);
-		netsnmp_ds_set_int(NETSNMP_DS_LIBRARY_ID, NETSNMP_DS_LIB_OID_OUTPUT_FORMAT, snmp_object->oid_output_format);
+
+		// Save the global snmplib output options and set the options to those defined by the object instance
+		save_snmplib_output_options(&glob_snmp_object);
+		set_snmplib_output_options(snmp_object);
 	}
 
 	if (objid_query.max_repetitions < 0) {
@@ -1448,9 +1492,8 @@ static void php_snmp(INTERNAL_FUNCTION_PARAMETERS, int st, int version)
 	if (session_less_mode) {
 		snmp_session_free(&session);
 	} else {
-		netsnmp_ds_set_boolean(NETSNMP_DS_LIBRARY_ID, NETSNMP_DS_LIB_PRINT_NUMERIC_ENUM, glob_snmp_object.enum_print);
-		netsnmp_ds_set_boolean(NETSNMP_DS_LIBRARY_ID, NETSNMP_DS_LIB_QUICK_PRINT, glob_snmp_object.quick_print);
-		netsnmp_ds_set_int(NETSNMP_DS_LIBRARY_ID, NETSNMP_DS_LIB_OID_OUTPUT_FORMAT, glob_snmp_object.oid_output_format);
+		// Restore the snmplib output options back to the global state
+		set_snmplib_output_options(&glob_snmp_object);
 	}
 }
 /* }}} */
@@ -1527,28 +1570,147 @@ PHP_FUNCTION(snmp_set_enum_print)
 }
 /* }}} */
 
+/* {{{ Set walk option. */
+PHP_FUNCTION(snmp_set_mib_option)
+{
+	zend_enum_Snmp_Mib opt;
+	int snmp_opt;
+	bool val;
+
+	ZEND_PARSE_PARAMETERS_START(2, 2)
+		Z_PARAM_ENUM(opt, SnmpMib_ce)
+		Z_PARAM_BOOL(val)
+	ZEND_PARSE_PARAMETERS_END();
+
+	switch (opt) {
+		case ZEND_ENUM_Snmp_Mib_AllowUnderscores:
+			snmp_opt = NETSNMP_DS_LIB_MIB_PARSE_LABEL;
+			break;
+		case ZEND_ENUM_Snmp_Mib_CommentTerm:
+			snmp_opt = NETSNMP_DS_LIB_MIB_COMMENT_TERM;
+			break;
+		case ZEND_ENUM_Snmp_Mib_Replace:
+			snmp_opt = NETSNMP_DS_LIB_MIB_REPLACE;
+			break;
+		default:
+			ZEND_UNREACHABLE();
+	}
+	netsnmp_ds_set_boolean(NETSNMP_DS_LIBRARY_ID, snmp_opt, (int) val);
+}
+/* }}} */
+
+/* {{{ Set the string output format. */
+PHP_FUNCTION(snmp_set_string_output_format)
+{
+	zend_enum_Snmp_StringOutput format;
+	int snmp_format;
+
+	ZEND_PARSE_PARAMETERS_START(1, 1)
+		Z_PARAM_ENUM(format, SnmpStringOutput_ce)
+	ZEND_PARSE_PARAMETERS_END();
+
+	switch (format) {
+		case ZEND_ENUM_Snmp_StringOutput_Guess:
+			snmp_format = NETSNMP_STRING_OUTPUT_GUESS;
+			break;
+		case ZEND_ENUM_Snmp_StringOutput_Ascii:
+			snmp_format = NETSNMP_STRING_OUTPUT_ASCII;
+			break;
+		case ZEND_ENUM_Snmp_StringOutput_Hex:
+			snmp_format = NETSNMP_STRING_OUTPUT_HEX;
+			break;
+		default:
+			ZEND_UNREACHABLE();
+	}
+	netsnmp_ds_set_int(NETSNMP_DS_LIBRARY_ID, NETSNMP_DS_LIB_STRING_OUTPUT_FORMAT, snmp_format);
+}
+/* }}} */
+
+/* {{{ Set output format option. */
+PHP_FUNCTION(snmp_set_output_option)
+{
+	zend_enum_Snmp_Output opt;
+	int snmp_opt;
+	bool val;
+
+	ZEND_PARSE_PARAMETERS_START(2, 2)
+		Z_PARAM_ENUM(opt, SnmpOutput_ce)
+		Z_PARAM_BOOL(val)
+	ZEND_PARSE_PARAMETERS_END();
+
+	switch (opt) {
+		case ZEND_ENUM_Snmp_Output_NumericIndex:
+			snmp_opt = NETSNMP_DS_LIB_DONT_BREAKDOWN_OIDS;
+			break;
+		case ZEND_ENUM_Snmp_Output_EnumPrint:
+			snmp_opt = NETSNMP_DS_LIB_PRINT_NUMERIC_ENUM;
+			break;
+		case ZEND_ENUM_Snmp_Output_EscapeQuotes:
+			snmp_opt = NETSNMP_DS_LIB_ESCAPE_QUOTES;
+			break;
+		case ZEND_ENUM_Snmp_Output_QuickPrint:
+			snmp_opt = NETSNMP_DS_LIB_QUICK_PRINT;
+			break;
+		case ZEND_ENUM_Snmp_Output_NumericTimeticks:
+			snmp_opt = NETSNMP_DS_LIB_NUMERIC_TIMETICKS;
+			break;
+		case ZEND_ENUM_Snmp_Output_HexText:
+			snmp_opt = NETSNMP_DS_LIB_PRINT_HEX_TEXT;
+			break;
+		case ZEND_ENUM_Snmp_Output_DontPrintUnits:
+			snmp_opt = NETSNMP_DS_LIB_DONT_PRINT_UNITS;
+			break;
+		case ZEND_ENUM_Snmp_Output_ExtendedIndex:
+			snmp_opt = NETSNMP_DS_LIB_EXTENDED_INDEX;
+			break;
+		default:
+			ZEND_UNREACHABLE();
+	}
+	netsnmp_ds_set_boolean(NETSNMP_DS_LIBRARY_ID, snmp_opt, (int) val);
+}
+/* }}} */
+
 /* {{{ Set the OID output format. */
 PHP_FUNCTION(snmp_set_oid_output_format)
 {
 	zend_long format;
+	int snmp_format;
+	zend_object *format_object = NULL;
 
-	if (zend_parse_parameters(ZEND_NUM_ARGS(), "l", &format) == FAILURE) {
-		RETURN_THROWS();
+	ZEND_PARSE_PARAMETERS_START(1, 1)
+		Z_PARAM_OBJ_OF_CLASS_OR_LONG(format_object, SnmpOidOutput_ce, format)
+	ZEND_PARSE_PARAMETERS_END();
+
+	if (format_object != NULL) {
+		format = zend_enum_fetch_case_id(format_object);
 	}
 
 	switch (format) {
-		case NETSNMP_OID_OUTPUT_SUFFIX:
-		case NETSNMP_OID_OUTPUT_MODULE:
-		case NETSNMP_OID_OUTPUT_FULL:
-		case NETSNMP_OID_OUTPUT_NUMERIC:
-		case NETSNMP_OID_OUTPUT_UCD:
-		case NETSNMP_OID_OUTPUT_NONE:
-			netsnmp_ds_set_int(NETSNMP_DS_LIBRARY_ID, NETSNMP_DS_LIB_OID_OUTPUT_FORMAT, format);
-			RETURN_TRUE;
+		case ZEND_ENUM_Snmp_OidOutput_Suffix:
+			snmp_format = NETSNMP_OID_OUTPUT_SUFFIX;
+			break;
+		case ZEND_ENUM_Snmp_OidOutput_Module:
+			snmp_format = NETSNMP_OID_OUTPUT_MODULE;
+			break;
+		case ZEND_ENUM_Snmp_OidOutput_Full:
+			snmp_format = NETSNMP_OID_OUTPUT_FULL;
+			break;
+		case ZEND_ENUM_Snmp_OidOutput_Numeric:
+			snmp_format = NETSNMP_OID_OUTPUT_NUMERIC;
+			break;
+		case ZEND_ENUM_Snmp_OidOutput_Ucd:
+			snmp_format = NETSNMP_OID_OUTPUT_UCD;
+			break;
+		case ZEND_ENUM_Snmp_OidOutput_None:
+			snmp_format = NETSNMP_OID_OUTPUT_NONE;
+			break;
 		default:
-			zend_argument_value_error(1, "must be an SNMP_OID_OUTPUT_* constant");
+			zend_argument_value_error(1, "must be a Snmp\\OidOutput constant");
 			RETURN_THROWS();
 	}
+
+	netsnmp_ds_set_int(NETSNMP_DS_LIBRARY_ID, NETSNMP_DS_LIB_OID_OUTPUT_FORMAT, snmp_format);
+	RETURN_TRUE;
 }
 /* }}} */
 
@@ -1731,9 +1893,7 @@ PHP_METHOD(SNMP, __construct)
 	}
 	snmp_object->max_oids = 0;
 	snmp_object->valueretrieval = SNMP_G(valueretrieval);
-	snmp_object->enum_print = netsnmp_ds_get_boolean(NETSNMP_DS_LIBRARY_ID, NETSNMP_DS_LIB_PRINT_NUMERIC_ENUM);
-	snmp_object->oid_output_format = netsnmp_ds_get_int(NETSNMP_DS_LIBRARY_ID, NETSNMP_DS_LIB_OID_OUTPUT_FORMAT);
-	snmp_object->quick_print = netsnmp_ds_get_boolean(NETSNMP_DS_LIBRARY_ID, NETSNMP_DS_LIB_QUICK_PRINT);
+	save_snmplib_output_options(snmp_object);
 	snmp_object->oid_increasing_check = true;
 	snmp_object->exceptions_enabled = 0;
 }
@@ -1812,6 +1972,74 @@ PHP_METHOD(SNMP, setSecurity)
 }
 /* }}} */
 
+/* {{{ Set OID output format */
+PHP_METHOD(SNMP, setOidOutputFormat)
+{
+	php_snmp_object *snmp_object;
+	zval *object = ZEND_THIS;
+	zend_enum_Snmp_OidOutput format;
+
+	ZEND_PARSE_PARAMETERS_START(1, 1)
+		Z_PARAM_ENUM(format, SnmpOidOutput_ce)
+	ZEND_PARSE_PARAMETERS_END();
+
+	snmp_object = Z_SNMP_P(object);
+
+	switch (format) {
+		case ZEND_ENUM_Snmp_OidOutput_Suffix:
+			snmp_object->oid_output_format = NETSNMP_OID_OUTPUT_SUFFIX;
+			RETURN_TRUE;
+		case ZEND_ENUM_Snmp_OidOutput_Module:
+			snmp_object->oid_output_format = NETSNMP_OID_OUTPUT_MODULE;
+			RETURN_TRUE;
+		case ZEND_ENUM_Snmp_OidOutput_Full:
+			snmp_object->oid_output_format = NETSNMP_OID_OUTPUT_FULL;
+			RETURN_TRUE;
+		case ZEND_ENUM_Snmp_OidOutput_Numeric:
+			snmp_object->oid_output_format = NETSNMP_OID_OUTPUT_NUMERIC;
+			RETURN_TRUE;
+		case ZEND_ENUM_Snmp_OidOutput_Ucd:
+			snmp_object->oid_output_format = NETSNMP_OID_OUTPUT_UCD;
+			RETURN_TRUE;
+		case ZEND_ENUM_Snmp_OidOutput_None:
+			snmp_object->oid_output_format = NETSNMP_OID_OUTPUT_NONE;
+			RETURN_TRUE;
+		default:
+			ZEND_UNREACHABLE();
+	}
+
+}
+/* }}} */
+
+/* {{{ Set string output format */
+PHP_METHOD(SNMP, setStringOutputFormat)
+{
+	php_snmp_object *snmp_object;
+	zval *object = ZEND_THIS;
+	zend_enum_Snmp_StringOutput format;
+
+	ZEND_PARSE_PARAMETERS_START(1, 1)
+		Z_PARAM_ENUM(format, SnmpStringOutput_ce)
+	ZEND_PARSE_PARAMETERS_END();
+
+	snmp_object = Z_SNMP_P(object);
+
+	switch (format) {
+		case ZEND_ENUM_Snmp_StringOutput_Guess:
+			snmp_object->string_output_format = NETSNMP_STRING_OUTPUT_GUESS;
+			RETURN_TRUE;
+		case ZEND_ENUM_Snmp_StringOutput_Ascii:
+			snmp_object->string_output_format = NETSNMP_STRING_OUTPUT_ASCII;
+			RETURN_TRUE;
+		case ZEND_ENUM_Snmp_StringOutput_Hex:
+			snmp_object->string_output_format = NETSNMP_STRING_OUTPUT_HEX;
+			RETURN_TRUE;
+		default:
+			ZEND_UNREACHABLE();
+	}
+}
+/* }}} */
+
 /* {{{ Get last error code number */
 PHP_METHOD(SNMP, getErrno)
 {
@@ -2033,6 +2261,35 @@ static zend_result php_snmp_read_max_oids(php_snmp_object *snmp_object, zval *re
 }
 /* }}} */
 
+/* {{{ */
+static zend_result php_snmp_read_oid_output_format(php_snmp_object *snmp_object, zval *retval)
+{
+	switch(snmp_object->oid_output_format) {
+		case NETSNMP_OID_OUTPUT_SUFFIX:
+			ZVAL_LONG(retval, ZEND_ENUM_Snmp_OidOutput_Suffix);
+			return SUCCESS;
+		case NETSNMP_OID_OUTPUT_MODULE:
+			ZVAL_LONG(retval, ZEND_ENUM_Snmp_OidOutput_Module);
+			return SUCCESS;
+		case NETSNMP_OID_OUTPUT_FULL:
+			ZVAL_LONG(retval, ZEND_ENUM_Snmp_OidOutput_Full);
+			return SUCCESS;
+		case NETSNMP_OID_OUTPUT_NUMERIC:
+			ZVAL_LONG(retval, ZEND_ENUM_Snmp_OidOutput_Numeric);
+			return SUCCESS;
+		case NETSNMP_OID_OUTPUT_UCD:
+			ZVAL_LONG(retval, ZEND_ENUM_Snmp_OidOutput_Ucd);
+			return SUCCESS;
+		case NETSNMP_OID_OUTPUT_NONE:
+			ZVAL_LONG(retval, ZEND_ENUM_Snmp_OidOutput_None);
+			return SUCCESS;
+		default:
+			ZVAL_NULL(retval);
+			return SUCCESS;
+	}
+}
+/* }}} */
+
 #define PHP_SNMP_BOOL_PROPERTY_READER_FUNCTION(name) \
 	static zend_result php_snmp_read_##name(php_snmp_object *snmp_object, zval *retval) \
 	{ \
@@ -2043,6 +2300,12 @@ static zend_result php_snmp_read_max_oids(php_snmp_object *snmp_object, zval *re
 PHP_SNMP_BOOL_PROPERTY_READER_FUNCTION(oid_increasing_check)
 PHP_SNMP_BOOL_PROPERTY_READER_FUNCTION(quick_print)
 PHP_SNMP_BOOL_PROPERTY_READER_FUNCTION(enum_print)
+PHP_SNMP_BOOL_PROPERTY_READER_FUNCTION(numeric_index)
+PHP_SNMP_BOOL_PROPERTY_READER_FUNCTION(numeric_timeticks)
+PHP_SNMP_BOOL_PROPERTY_READER_FUNCTION(extended_index)
+PHP_SNMP_BOOL_PROPERTY_READER_FUNCTION(dont_print_units)
+PHP_SNMP_BOOL_PROPERTY_READER_FUNCTION(escape_quotes)
+PHP_SNMP_BOOL_PROPERTY_READER_FUNCTION(print_hex_text)
 
 #define PHP_SNMP_LONG_PROPERTY_READER_FUNCTION(name) \
 	static zend_result php_snmp_read_##name(php_snmp_object *snmp_object, zval *retval) \
@@ -2052,7 +2315,6 @@ PHP_SNMP_BOOL_PROPERTY_READER_FUNCTION(enum_print)
 	}
 
 PHP_SNMP_LONG_PROPERTY_READER_FUNCTION(valueretrieval)
-PHP_SNMP_LONG_PROPERTY_READER_FUNCTION(oid_output_format)
 PHP_SNMP_LONG_PROPERTY_READER_FUNCTION(exceptions_enabled)
 
 /* {{{ */
@@ -2106,9 +2368,15 @@ static zend_result php_snmp_write_##name(php_snmp_object *snmp_object, zval *new
 	return SUCCESS; \
 }
 
+PHP_SNMP_BOOL_PROPERTY_WRITER_FUNCTION(oid_increasing_check)
 PHP_SNMP_BOOL_PROPERTY_WRITER_FUNCTION(quick_print)
 PHP_SNMP_BOOL_PROPERTY_WRITER_FUNCTION(enum_print)
-PHP_SNMP_BOOL_PROPERTY_WRITER_FUNCTION(oid_increasing_check)
+PHP_SNMP_BOOL_PROPERTY_WRITER_FUNCTION(numeric_index)
+PHP_SNMP_BOOL_PROPERTY_WRITER_FUNCTION(numeric_timeticks)
+PHP_SNMP_BOOL_PROPERTY_WRITER_FUNCTION(extended_index)
+PHP_SNMP_BOOL_PROPERTY_WRITER_FUNCTION(dont_print_units)
+PHP_SNMP_BOOL_PROPERTY_WRITER_FUNCTION(escape_quotes)
+PHP_SNMP_BOOL_PROPERTY_WRITER_FUNCTION(print_hex_text)
 
 /* {{{ */
 static zend_result php_snmp_write_oid_output_format(php_snmp_object *snmp_object, zval *newval)
@@ -2116,16 +2384,26 @@ static zend_result php_snmp_write_oid_output_format(php_snmp_object *snmp_object
 	zend_long lval = zval_get_long(newval);
 
 	switch(lval) {
-		case NETSNMP_OID_OUTPUT_SUFFIX:
-		case NETSNMP_OID_OUTPUT_MODULE:
-		case NETSNMP_OID_OUTPUT_FULL:
-		case NETSNMP_OID_OUTPUT_NUMERIC:
-		case NETSNMP_OID_OUTPUT_UCD:
-		case NETSNMP_OID_OUTPUT_NONE:
-			snmp_object->oid_output_format = lval;
+		case ZEND_ENUM_Snmp_OidOutput_Suffix:
+			snmp_object->oid_output_format = NETSNMP_OID_OUTPUT_SUFFIX;
+			return SUCCESS;
+		case ZEND_ENUM_Snmp_OidOutput_Module:
+			snmp_object->oid_output_format = NETSNMP_OID_OUTPUT_MODULE;
+			return SUCCESS;
+		case ZEND_ENUM_Snmp_OidOutput_Full:
+			snmp_object->oid_output_format = NETSNMP_OID_OUTPUT_FULL;
+			return SUCCESS;
+		case ZEND_ENUM_Snmp_OidOutput_Numeric:
+			snmp_object->oid_output_format = NETSNMP_OID_OUTPUT_NUMERIC;
+			return SUCCESS;
+		case ZEND_ENUM_Snmp_OidOutput_Ucd:
+			snmp_object->oid_output_format = NETSNMP_OID_OUTPUT_UCD;
+			return SUCCESS;
+		case ZEND_ENUM_Snmp_OidOutput_None:
+			snmp_object->oid_output_format = NETSNMP_OID_OUTPUT_NONE;
 			return SUCCESS;
 		default:
-			zend_value_error("SNMP output print format must be an SNMP_OID_OUTPUT_* constant");
+			zend_value_error("SNMP output print format must be a SNMP_OID_OUTPUT_* constant");
 			return FAILURE;
 	}
 }
@@ -2155,11 +2433,17 @@ static void free_php_snmp_properties(zval *el)  /* {{{ */
 const php_snmp_prop_handler php_snmp_property_entries[] = {
 	PHP_SNMP_READONLY_PROPERTY_ENTRY_RECORD(info),
 	PHP_SNMP_PROPERTY_ENTRY_RECORD(max_oids),
-	PHP_SNMP_PROPERTY_ENTRY_RECORD(valueretrieval),
+	PHP_SNMP_PROPERTY_ENTRY_RECORD(oid_increasing_check),
 	PHP_SNMP_PROPERTY_ENTRY_RECORD(quick_print),
 	PHP_SNMP_PROPERTY_ENTRY_RECORD(enum_print),
+	PHP_SNMP_PROPERTY_ENTRY_RECORD(numeric_index),
+	PHP_SNMP_PROPERTY_ENTRY_RECORD(numeric_timeticks),
+	PHP_SNMP_PROPERTY_ENTRY_RECORD(extended_index),
+	PHP_SNMP_PROPERTY_ENTRY_RECORD(dont_print_units),
+	PHP_SNMP_PROPERTY_ENTRY_RECORD(escape_quotes),
+	PHP_SNMP_PROPERTY_ENTRY_RECORD(print_hex_text),
+	PHP_SNMP_PROPERTY_ENTRY_RECORD(valueretrieval),
 	PHP_SNMP_PROPERTY_ENTRY_RECORD(oid_output_format),
-	PHP_SNMP_PROPERTY_ENTRY_RECORD(oid_increasing_check),
 	PHP_SNMP_PROPERTY_ENTRY_RECORD(exceptions_enabled),
 	{ NULL, 0, NULL, NULL}
 };
@@ -2209,6 +2493,12 @@ PHP_MINIT_FUNCTION(snmp)
 	/* Register SNMPException class */
 	php_snmp_exception_ce = register_class_SNMPException(spl_ce_RuntimeException);
 
+	/* Register enums */
+	SnmpMib_ce = register_class_Snmp_Mib();
+	SnmpOidOutput_ce = register_class_Snmp_OidOutput();
+	SnmpOutput_ce = register_class_Snmp_Output();
+	SnmpStringOutput_ce = register_class_Snmp_StringOutput();
+
 	register_snmp_symbols(module_number);
 
 	return SUCCESS;
@@ -2226,6 +2516,21 @@ PHP_MSHUTDOWN_FUNCTION(snmp)
 }
 /* }}} */
 
+/* {{{ PHP_INIT_FUNCTION */
+static PHP_RINIT_FUNCTION(snmp)
+{
+	// Save the output options
+	save_snmplib_output_options(&saved_snmp_settings);
+
+	// Save the MIB options
+	saved_mib_allow_underscores = netsnmp_ds_get_int(NETSNMP_DS_LIBRARY_ID, NETSNMP_DS_LIB_MIB_PARSE_LABEL);
+	saved_mib_comment_term = netsnmp_ds_get_int(NETSNMP_DS_LIBRARY_ID, NETSNMP_DS_LIB_MIB_COMMENT_TERM);
+	saved_mib_replace = netsnmp_ds_get_int(NETSNMP_DS_LIBRARY_ID, NETSNMP_DS_LIB_MIB_REPLACE);
+
+	return SUCCESS;
+}
+/* }}} */
+
 /* {{{ PHP_RSHUTDOWN_FUNCTION */
 static PHP_RSHUTDOWN_FUNCTION(snmp)
 {
@@ -2239,6 +2544,14 @@ static PHP_RSHUTDOWN_FUNCTION(snmp)
 #endif
 	}
 
+	// Restore the output options
+	set_snmplib_output_options(&saved_snmp_settings);
+
+	// Restore MIB options
+	netsnmp_ds_set_int(NETSNMP_DS_LIBRARY_ID, NETSNMP_DS_LIB_MIB_PARSE_LABEL, saved_mib_allow_underscores);
+	netsnmp_ds_set_int(NETSNMP_DS_LIBRARY_ID, NETSNMP_DS_LIB_MIB_COMMENT_TERM, saved_mib_comment_term);
+	netsnmp_ds_set_int(NETSNMP_DS_LIBRARY_ID, NETSNMP_DS_LIB_MIB_REPLACE, saved_mib_replace);
+
 	return SUCCESS;
 }
 /* }}} */
@@ -2269,7 +2582,7 @@ zend_module_entry snmp_module_entry = {
 	ext_functions,
 	PHP_MINIT(snmp),
 	PHP_MSHUTDOWN(snmp),
-	NULL,
+	PHP_RINIT(snmp),
 	PHP_RSHUTDOWN(snmp),
 	PHP_MINFO(snmp),
 	PHP_SNMP_VERSION,
diff --git a/ext/snmp/snmp.stub.php b/ext/snmp/snmp.stub.php
index b40a2fcd9f20..f68da7e75f1c 100644
--- a/ext/snmp/snmp.stub.php
+++ b/ext/snmp/snmp.stub.php
@@ -1,36 +1,40 @@
 <?php
 
-/** @generate-class-entries */
+/**
+ * @generate-class-entries
+ * @generate-c-enums
+ */
+
 namespace
 {
     /**
      * @var int
-     * @cvalue NETSNMP_OID_OUTPUT_SUFFIX
+     * @cvalue ZEND_ENUM_Snmp_OidOutput_Suffix
      */
     const SNMP_OID_OUTPUT_SUFFIX = UNKNOWN;
     /**
      * @var int
-     * @cvalue NETSNMP_OID_OUTPUT_MODULE
+     * @cvalue ZEND_ENUM_Snmp_OidOutput_Module
      */
     const SNMP_OID_OUTPUT_MODULE = UNKNOWN;
     /**
      * @var int
-     * @cvalue NETSNMP_OID_OUTPUT_FULL
+     * @cvalue ZEND_ENUM_Snmp_OidOutput_Full
      */
     const SNMP_OID_OUTPUT_FULL = UNKNOWN;
     /**
      * @var int
-     * @cvalue NETSNMP_OID_OUTPUT_NUMERIC
+     * @cvalue ZEND_ENUM_Snmp_OidOutput_Numeric
      */
     const SNMP_OID_OUTPUT_NUMERIC = UNKNOWN;
     /**
      * @var int
-     * @cvalue NETSNMP_OID_OUTPUT_UCD
+     * @cvalue ZEND_ENUM_Snmp_OidOutput_Ucd
      */
     const SNMP_OID_OUTPUT_UCD = UNKNOWN;
     /**
      * @var int
-     * @cvalue NETSNMP_OID_OUTPUT_NONE
+     * @cvalue ZEND_ENUM_Snmp_OidOutput_None
      */
     const SNMP_OID_OUTPUT_NONE = UNKNOWN;
 
@@ -130,10 +134,16 @@ function snmp_set_quick_print(bool $enable): true {}
 
     function snmp_set_enum_print(bool $enable): true {}
 
-    function snmp_set_oid_output_format(int $format): true {}
+    function snmp_set_mib_option(Snmp\Mib $option, bool $enable): void {}
+
+    function snmp_set_oid_output_format(Snmp\OidOutput|int $format): true {}
+
+    function snmp_set_output_option(Snmp\Output $option, bool $enable): void {}
+
+    function snmp_set_string_output_format(Snmp\StringOutput $format): void {}
 
     /** @alias snmp_set_oid_output_format */
-    function snmp_set_oid_numeric_print(int $format): true {}
+    function snmp_set_oid_numeric_print(Snmp\OidOutput|int $format): true {}
 
     function snmp2_get(string $hostname, string $community, array|string $object_id, int $timeout = -1, int $retries = -1): mixed {}
 
@@ -216,11 +226,17 @@ class SNMP
         /** @readonly */
         public array $info;
         public ?int $max_oids;
-        public int $valueretrieval;
+        public bool $oid_increasing_check;
         public bool $quick_print;
         public bool $enum_print;
+        public bool $numeric_index;
+        public bool $numeric_timeticks;
+        public bool $extended_index;
+        public bool $dont_print_units;
+        public bool $escape_quotes;
+        public bool $print_hex_text;
+        public int $valueretrieval;
         public int $oid_output_format;
-        public bool $oid_increasing_check;
         public int $exceptions_enabled;
 
         public function __construct(int $version, string $hostname, string $community, int $timeout = -1, int $retries = -1) {}
@@ -234,6 +250,12 @@ public function setSecurity(
             string $privacyProtocol = "", string $privacyPassphrase = "",
             string $contextName = "", string $contextEngineId = ""): bool {}
 
+	    /** @tentative-return-type */
+	    public function setOidOutputFormat (Snmp\OidOutput $format): bool {}
+
+	    /** @tentative-return-type */
+	    public function setStringOutputFormat (Snmp\StringOutput $format): bool {}
+
         /** @tentative-return-type */
         public function get(array|string $objectId, bool $preserveKeys = false): mixed {}
 
@@ -257,3 +279,41 @@ class SNMPException extends RuntimeException
     {
     }
 }
+
+namespace Snmp {
+    enum Mib
+    {
+        case AllowUnderscores;
+        case CommentTerm;
+        case Replace;
+    }
+
+    enum OidOutput
+    {
+        case Suffix;
+        case Module;
+        case Full;
+        case Numeric;
+        case Ucd;
+        case None;
+    }
+
+    enum Output
+    {
+        case NumericIndex;
+        case EnumPrint;
+        case EscapeQuotes;
+        case QuickPrint;
+        case NumericTimeticks;
+        case HexText;
+        case DontPrintUnits;
+        case ExtendedIndex;
+    }
+
+    enum StringOutput
+    {
+        case Guess;
+        case Ascii;
+        case Hex;
+    }
+}
diff --git a/ext/snmp/snmp_arginfo.h b/ext/snmp/snmp_arginfo.h
index d2faf5056b51..67d72cf75bd4 100644
--- a/ext/snmp/snmp_arginfo.h
+++ b/ext/snmp/snmp_arginfo.h
@@ -1,5 +1,6 @@
 /* This is a generated file, edit snmp.stub.php instead.
- * Stub hash: 7d535318f2334eed04806a7e670ab7c806b286ea */
+ * Stub hash: 9916f5e1d4db267e7f5d6709adf90decc9dc7f0a
+ * Has decl header: yes */
 
 ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_snmpget, 0, 3, IS_MIXED, 0)
 	ZEND_ARG_TYPE_INFO(0, hostname, IS_STRING, 0)
@@ -42,8 +43,22 @@ ZEND_END_ARG_INFO()
 
 #define arginfo_snmp_set_enum_print arginfo_snmp_set_quick_print
 
+ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_snmp_set_mib_option, 0, 2, IS_VOID, 0)
+	ZEND_ARG_OBJ_INFO(0, option, Snmp\\Mib, 0)
+	ZEND_ARG_TYPE_INFO(0, enable, _IS_BOOL, 0)
+ZEND_END_ARG_INFO()
+
 ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_snmp_set_oid_output_format, 0, 1, IS_TRUE, 0)
-	ZEND_ARG_TYPE_INFO(0, format, IS_LONG, 0)
+	ZEND_ARG_OBJ_TYPE_MASK(0, format, Snmp\\OidOutput, MAY_BE_LONG, NULL)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_snmp_set_output_option, 0, 2, IS_VOID, 0)
+	ZEND_ARG_OBJ_INFO(0, option, Snmp\\Output, 0)
+	ZEND_ARG_TYPE_INFO(0, enable, _IS_BOOL, 0)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_snmp_set_string_output_format, 0, 1, IS_VOID, 0)
+	ZEND_ARG_OBJ_INFO(0, format, Snmp\\StringOutput, 0)
 ZEND_END_ARG_INFO()
 
 #define arginfo_snmp_set_oid_numeric_print arginfo_snmp_set_oid_output_format
@@ -139,6 +154,14 @@ ZEND_BEGIN_ARG_WITH_TENTATIVE_RETURN_TYPE_INFO_EX(arginfo_class_SNMP_setSecurity
 	ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, contextEngineId, IS_STRING, 0, "\"\"")
 ZEND_END_ARG_INFO()
 
+ZEND_BEGIN_ARG_WITH_TENTATIVE_RETURN_TYPE_INFO_EX(arginfo_class_SNMP_setOidOutputFormat, 0, 1, _IS_BOOL, 0)
+	ZEND_ARG_OBJ_INFO(0, format, Snmp\\OidOutput, 0)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_WITH_TENTATIVE_RETURN_TYPE_INFO_EX(arginfo_class_SNMP_setStringOutputFormat, 0, 1, _IS_BOOL, 0)
+	ZEND_ARG_OBJ_INFO(0, format, Snmp\\StringOutput, 0)
+ZEND_END_ARG_INFO()
+
 ZEND_BEGIN_ARG_WITH_TENTATIVE_RETURN_TYPE_INFO_EX(arginfo_class_SNMP_get, 0, 1, IS_MIXED, 0)
 	ZEND_ARG_TYPE_MASK(0, objectId, MAY_BE_ARRAY|MAY_BE_STRING, NULL)
 	ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, preserveKeys, _IS_BOOL, 0, "false")
@@ -175,7 +198,10 @@ ZEND_FUNCTION(snmpset);
 ZEND_FUNCTION(snmp_get_quick_print);
 ZEND_FUNCTION(snmp_set_quick_print);
 ZEND_FUNCTION(snmp_set_enum_print);
+ZEND_FUNCTION(snmp_set_mib_option);
 ZEND_FUNCTION(snmp_set_oid_output_format);
+ZEND_FUNCTION(snmp_set_output_option);
+ZEND_FUNCTION(snmp_set_string_output_format);
 ZEND_FUNCTION(snmp2_get);
 ZEND_FUNCTION(snmp2_getnext);
 ZEND_FUNCTION(snmp2_walk);
@@ -193,6 +219,8 @@ ZEND_FUNCTION(snmp_init_mib);
 ZEND_METHOD(SNMP, __construct);
 ZEND_METHOD(SNMP, close);
 ZEND_METHOD(SNMP, setSecurity);
+ZEND_METHOD(SNMP, setOidOutputFormat);
+ZEND_METHOD(SNMP, setStringOutputFormat);
 ZEND_METHOD(SNMP, get);
 ZEND_METHOD(SNMP, getnext);
 ZEND_METHOD(SNMP, walk);
@@ -210,7 +238,10 @@ static const zend_function_entry ext_functions[] = {
 	ZEND_FE(snmp_get_quick_print, arginfo_snmp_get_quick_print)
 	ZEND_FE(snmp_set_quick_print, arginfo_snmp_set_quick_print)
 	ZEND_FE(snmp_set_enum_print, arginfo_snmp_set_enum_print)
+	ZEND_FE(snmp_set_mib_option, arginfo_snmp_set_mib_option)
 	ZEND_FE(snmp_set_oid_output_format, arginfo_snmp_set_oid_output_format)
+	ZEND_FE(snmp_set_output_option, arginfo_snmp_set_output_option)
+	ZEND_FE(snmp_set_string_output_format, arginfo_snmp_set_string_output_format)
 	ZEND_RAW_FENTRY("snmp_set_oid_numeric_print", zif_snmp_set_oid_output_format, arginfo_snmp_set_oid_numeric_print, 0, NULL, NULL)
 	ZEND_FE(snmp2_get, arginfo_snmp2_get)
 	ZEND_FE(snmp2_getnext, arginfo_snmp2_getnext)
@@ -233,6 +264,8 @@ static const zend_function_entry class_SNMP_methods[] = {
 	ZEND_ME(SNMP, __construct, arginfo_class_SNMP___construct, ZEND_ACC_PUBLIC)
 	ZEND_ME(SNMP, close, arginfo_class_SNMP_close, ZEND_ACC_PUBLIC)
 	ZEND_ME(SNMP, setSecurity, arginfo_class_SNMP_setSecurity, ZEND_ACC_PUBLIC)
+	ZEND_ME(SNMP, setOidOutputFormat, arginfo_class_SNMP_setOidOutputFormat, ZEND_ACC_PUBLIC)
+	ZEND_ME(SNMP, setStringOutputFormat, arginfo_class_SNMP_setStringOutputFormat, ZEND_ACC_PUBLIC)
 	ZEND_ME(SNMP, get, arginfo_class_SNMP_get, ZEND_ACC_PUBLIC)
 	ZEND_ME(SNMP, getnext, arginfo_class_SNMP_getnext, ZEND_ACC_PUBLIC)
 	ZEND_ME(SNMP, walk, arginfo_class_SNMP_walk, ZEND_ACC_PUBLIC)
@@ -244,12 +277,12 @@ static const zend_function_entry class_SNMP_methods[] = {
 
 static void register_snmp_symbols(int module_number)
 {
-	REGISTER_LONG_CONSTANT("SNMP_OID_OUTPUT_SUFFIX", NETSNMP_OID_OUTPUT_SUFFIX, CONST_PERSISTENT);
-	REGISTER_LONG_CONSTANT("SNMP_OID_OUTPUT_MODULE", NETSNMP_OID_OUTPUT_MODULE, CONST_PERSISTENT);
-	REGISTER_LONG_CONSTANT("SNMP_OID_OUTPUT_FULL", NETSNMP_OID_OUTPUT_FULL, CONST_PERSISTENT);
-	REGISTER_LONG_CONSTANT("SNMP_OID_OUTPUT_NUMERIC", NETSNMP_OID_OUTPUT_NUMERIC, CONST_PERSISTENT);
-	REGISTER_LONG_CONSTANT("SNMP_OID_OUTPUT_UCD", NETSNMP_OID_OUTPUT_UCD, CONST_PERSISTENT);
-	REGISTER_LONG_CONSTANT("SNMP_OID_OUTPUT_NONE", NETSNMP_OID_OUTPUT_NONE, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("SNMP_OID_OUTPUT_SUFFIX", ZEND_ENUM_Snmp_OidOutput_Suffix, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("SNMP_OID_OUTPUT_MODULE", ZEND_ENUM_Snmp_OidOutput_Module, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("SNMP_OID_OUTPUT_FULL", ZEND_ENUM_Snmp_OidOutput_Full, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("SNMP_OID_OUTPUT_NUMERIC", ZEND_ENUM_Snmp_OidOutput_Numeric, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("SNMP_OID_OUTPUT_UCD", ZEND_ENUM_Snmp_OidOutput_Ucd, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("SNMP_OID_OUTPUT_NONE", ZEND_ENUM_Snmp_OidOutput_None, CONST_PERSISTENT);
 	REGISTER_LONG_CONSTANT("SNMP_VALUE_LIBRARY", SNMP_VALUE_LIBRARY, CONST_PERSISTENT);
 	REGISTER_LONG_CONSTANT("SNMP_VALUE_PLAIN", SNMP_VALUE_PLAIN, CONST_PERSISTENT);
 	REGISTER_LONG_CONSTANT("SNMP_VALUE_OBJECT", SNMP_VALUE_OBJECT, CONST_PERSISTENT);
@@ -358,11 +391,11 @@ static zend_class_entry *register_class_SNMP(void)
 	zend_declare_typed_property(class_entry, property_max_oids_name, &property_max_oids_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG|MAY_BE_NULL));
 	zend_string_release_ex(property_max_oids_name, true);
 
-	zval property_valueretrieval_default_value;
-	ZVAL_UNDEF(&property_valueretrieval_default_value);
-	zend_string *property_valueretrieval_name = zend_string_init("valueretrieval", sizeof("valueretrieval") - 1, true);
-	zend_declare_typed_property(class_entry, property_valueretrieval_name, &property_valueretrieval_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG));
-	zend_string_release_ex(property_valueretrieval_name, true);
+	zval property_oid_increasing_check_default_value;
+	ZVAL_UNDEF(&property_oid_increasing_check_default_value);
+	zend_string *property_oid_increasing_check_name = zend_string_init("oid_increasing_check", sizeof("oid_increasing_check") - 1, true);
+	zend_declare_typed_property(class_entry, property_oid_increasing_check_name, &property_oid_increasing_check_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_BOOL));
+	zend_string_release_ex(property_oid_increasing_check_name, true);
 
 	zval property_quick_print_default_value;
 	ZVAL_UNDEF(&property_quick_print_default_value);
@@ -376,18 +409,54 @@ static zend_class_entry *register_class_SNMP(void)
 	zend_declare_typed_property(class_entry, property_enum_print_name, &property_enum_print_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_BOOL));
 	zend_string_release_ex(property_enum_print_name, true);
 
+	zval property_numeric_index_default_value;
+	ZVAL_UNDEF(&property_numeric_index_default_value);
+	zend_string *property_numeric_index_name = zend_string_init("numeric_index", sizeof("numeric_index") - 1, true);
+	zend_declare_typed_property(class_entry, property_numeric_index_name, &property_numeric_index_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_BOOL));
+	zend_string_release_ex(property_numeric_index_name, true);
+
+	zval property_numeric_timeticks_default_value;
+	ZVAL_UNDEF(&property_numeric_timeticks_default_value);
+	zend_string *property_numeric_timeticks_name = zend_string_init("numeric_timeticks", sizeof("numeric_timeticks") - 1, true);
+	zend_declare_typed_property(class_entry, property_numeric_timeticks_name, &property_numeric_timeticks_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_BOOL));
+	zend_string_release_ex(property_numeric_timeticks_name, true);
+
+	zval property_extended_index_default_value;
+	ZVAL_UNDEF(&property_extended_index_default_value);
+	zend_string *property_extended_index_name = zend_string_init("extended_index", sizeof("extended_index") - 1, true);
+	zend_declare_typed_property(class_entry, property_extended_index_name, &property_extended_index_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_BOOL));
+	zend_string_release_ex(property_extended_index_name, true);
+
+	zval property_dont_print_units_default_value;
+	ZVAL_UNDEF(&property_dont_print_units_default_value);
+	zend_string *property_dont_print_units_name = zend_string_init("dont_print_units", sizeof("dont_print_units") - 1, true);
+	zend_declare_typed_property(class_entry, property_dont_print_units_name, &property_dont_print_units_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_BOOL));
+	zend_string_release_ex(property_dont_print_units_name, true);
+
+	zval property_escape_quotes_default_value;
+	ZVAL_UNDEF(&property_escape_quotes_default_value);
+	zend_string *property_escape_quotes_name = zend_string_init("escape_quotes", sizeof("escape_quotes") - 1, true);
+	zend_declare_typed_property(class_entry, property_escape_quotes_name, &property_escape_quotes_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_BOOL));
+	zend_string_release_ex(property_escape_quotes_name, true);
+
+	zval property_print_hex_text_default_value;
+	ZVAL_UNDEF(&property_print_hex_text_default_value);
+	zend_string *property_print_hex_text_name = zend_string_init("print_hex_text", sizeof("print_hex_text") - 1, true);
+	zend_declare_typed_property(class_entry, property_print_hex_text_name, &property_print_hex_text_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_BOOL));
+	zend_string_release_ex(property_print_hex_text_name, true);
+
+	zval property_valueretrieval_default_value;
+	ZVAL_UNDEF(&property_valueretrieval_default_value);
+	zend_string *property_valueretrieval_name = zend_string_init("valueretrieval", sizeof("valueretrieval") - 1, true);
+	zend_declare_typed_property(class_entry, property_valueretrieval_name, &property_valueretrieval_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG));
+	zend_string_release_ex(property_valueretrieval_name, true);
+
 	zval property_oid_output_format_default_value;
 	ZVAL_UNDEF(&property_oid_output_format_default_value);
 	zend_string *property_oid_output_format_name = zend_string_init("oid_output_format", sizeof("oid_output_format") - 1, true);
 	zend_declare_typed_property(class_entry, property_oid_output_format_name, &property_oid_output_format_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG));
 	zend_string_release_ex(property_oid_output_format_name, true);
 
-	zval property_oid_increasing_check_default_value;
-	ZVAL_UNDEF(&property_oid_increasing_check_default_value);
-	zend_string *property_oid_increasing_check_name = zend_string_init("oid_increasing_check", sizeof("oid_increasing_check") - 1, true);
-	zend_declare_typed_property(class_entry, property_oid_increasing_check_name, &property_oid_increasing_check_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_BOOL));
-	zend_string_release_ex(property_oid_increasing_check_name, true);
-
 	zval property_exceptions_enabled_default_value;
 	ZVAL_UNDEF(&property_exceptions_enabled_default_value);
 	zend_string *property_exceptions_enabled_name = zend_string_init("exceptions_enabled", sizeof("exceptions_enabled") - 1, true);
@@ -406,3 +475,71 @@ static zend_class_entry *register_class_SNMPException(zend_class_entry *class_en
 
 	return class_entry;
 }
+
+static zend_class_entry *register_class_Snmp_Mib(void)
+{
+	zend_class_entry *class_entry = zend_register_internal_enum("Snmp\\Mib", IS_UNDEF, NULL);
+
+	zend_enum_add_case_cstr(class_entry, "AllowUnderscores", NULL);
+
+	zend_enum_add_case_cstr(class_entry, "CommentTerm", NULL);
+
+	zend_enum_add_case_cstr(class_entry, "Replace", NULL);
+
+	return class_entry;
+}
+
+static zend_class_entry *register_class_Snmp_OidOutput(void)
+{
+	zend_class_entry *class_entry = zend_register_internal_enum("Snmp\\OidOutput", IS_UNDEF, NULL);
+
+	zend_enum_add_case_cstr(class_entry, "Suffix", NULL);
+
+	zend_enum_add_case_cstr(class_entry, "Module", NULL);
+
+	zend_enum_add_case_cstr(class_entry, "Full", NULL);
+
+	zend_enum_add_case_cstr(class_entry, "Numeric", NULL);
+
+	zend_enum_add_case_cstr(class_entry, "Ucd", NULL);
+
+	zend_enum_add_case_cstr(class_entry, "None", NULL);
+
+	return class_entry;
+}
+
+static zend_class_entry *register_class_Snmp_Output(void)
+{
+	zend_class_entry *class_entry = zend_register_internal_enum("Snmp\\Output", IS_UNDEF, NULL);
+
+	zend_enum_add_case_cstr(class_entry, "NumericIndex", NULL);
+
+	zend_enum_add_case_cstr(class_entry, "EnumPrint", NULL);
+
+	zend_enum_add_case_cstr(class_entry, "EscapeQuotes", NULL);
+
+	zend_enum_add_case_cstr(class_entry, "QuickPrint", NULL);
+
+	zend_enum_add_case_cstr(class_entry, "NumericTimeticks", NULL);
+
+	zend_enum_add_case_cstr(class_entry, "HexText", NULL);
+
+	zend_enum_add_case_cstr(class_entry, "DontPrintUnits", NULL);
+
+	zend_enum_add_case_cstr(class_entry, "ExtendedIndex", NULL);
+
+	return class_entry;
+}
+
+static zend_class_entry *register_class_Snmp_StringOutput(void)
+{
+	zend_class_entry *class_entry = zend_register_internal_enum("Snmp\\StringOutput", IS_UNDEF, NULL);
+
+	zend_enum_add_case_cstr(class_entry, "Guess", NULL);
+
+	zend_enum_add_case_cstr(class_entry, "Ascii", NULL);
+
+	zend_enum_add_case_cstr(class_entry, "Hex", NULL);
+
+	return class_entry;
+}
diff --git a/ext/snmp/snmp_decl.h b/ext/snmp/snmp_decl.h
new file mode 100644
index 000000000000..78fad4608a29
--- /dev/null
+++ b/ext/snmp/snmp_decl.h
@@ -0,0 +1,39 @@
+/* This is a generated file, edit snmp.stub.php instead.
+ * Stub hash: 9916f5e1d4db267e7f5d6709adf90decc9dc7f0a */
+
+#ifndef ZEND_SNMP_DECL_9916f5e1d4db267e7f5d6709adf90decc9dc7f0a_H
+#define ZEND_SNMP_DECL_9916f5e1d4db267e7f5d6709adf90decc9dc7f0a_H
+
+typedef enum zend_enum_Snmp_Mib {
+	ZEND_ENUM_Snmp_Mib_AllowUnderscores = 1,
+	ZEND_ENUM_Snmp_Mib_CommentTerm = 2,
+	ZEND_ENUM_Snmp_Mib_Replace = 3,
+} zend_enum_Snmp_Mib;
+
+typedef enum zend_enum_Snmp_OidOutput {
+	ZEND_ENUM_Snmp_OidOutput_Suffix = 1,
+	ZEND_ENUM_Snmp_OidOutput_Module = 2,
+	ZEND_ENUM_Snmp_OidOutput_Full = 3,
+	ZEND_ENUM_Snmp_OidOutput_Numeric = 4,
+	ZEND_ENUM_Snmp_OidOutput_Ucd = 5,
+	ZEND_ENUM_Snmp_OidOutput_None = 6,
+} zend_enum_Snmp_OidOutput;
+
+typedef enum zend_enum_Snmp_Output {
+	ZEND_ENUM_Snmp_Output_NumericIndex = 1,
+	ZEND_ENUM_Snmp_Output_EnumPrint = 2,
+	ZEND_ENUM_Snmp_Output_EscapeQuotes = 3,
+	ZEND_ENUM_Snmp_Output_QuickPrint = 4,
+	ZEND_ENUM_Snmp_Output_NumericTimeticks = 5,
+	ZEND_ENUM_Snmp_Output_HexText = 6,
+	ZEND_ENUM_Snmp_Output_DontPrintUnits = 7,
+	ZEND_ENUM_Snmp_Output_ExtendedIndex = 8,
+} zend_enum_Snmp_Output;
+
+typedef enum zend_enum_Snmp_StringOutput {
+	ZEND_ENUM_Snmp_StringOutput_Guess = 1,
+	ZEND_ENUM_Snmp_StringOutput_Ascii = 2,
+	ZEND_ENUM_Snmp_StringOutput_Hex = 3,
+} zend_enum_Snmp_StringOutput;
+
+#endif /* ZEND_SNMP_DECL_9916f5e1d4db267e7f5d6709adf90decc9dc7f0a_H */
diff --git a/ext/snmp/tests/snmp-object-properties.phpt b/ext/snmp/tests/snmp-object-properties.phpt
index a8fccd406b7e..76060aaba482 100644
--- a/ext/snmp/tests/snmp-object-properties.phpt
+++ b/ext/snmp/tests/snmp-object-properties.phpt
@@ -92,16 +92,28 @@ object(SNMP)#%d (%d) {
   }
   ["max_oids"]=>
   NULL
-  ["valueretrieval"]=>
-  int(1)
+  ["oid_increasing_check"]=>
+  bool(true)
   ["quick_print"]=>
   bool(false)
   ["enum_print"]=>
   bool(false)
+  ["numeric_index"]=>
+  bool(false)
+  ["numeric_timeticks"]=>
+  bool(false)
+  ["extended_index"]=>
+  bool(false)
+  ["dont_print_units"]=>
+  bool(false)
+  ["escape_quotes"]=>
+  bool(false)
+  ["print_hex_text"]=>
+  bool(false)
+  ["valueretrieval"]=>
+  int(1)
   ["oid_output_format"]=>
   int(3)
-  ["oid_increasing_check"]=>
-  bool(true)
   ["exceptions_enabled"]=>
   int(0)
 }
@@ -117,16 +129,28 @@ object(SNMP)#%d (%d) {
   }
   ["max_oids"]=>
   int(40)
-  ["valueretrieval"]=>
-  int(0)
+  ["oid_increasing_check"]=>
+  bool(false)
   ["quick_print"]=>
   bool(true)
   ["enum_print"]=>
   bool(true)
+  ["numeric_index"]=>
+  bool(false)
+  ["numeric_timeticks"]=>
+  bool(false)
+  ["extended_index"]=>
+  bool(false)
+  ["dont_print_units"]=>
+  bool(false)
+  ["escape_quotes"]=>
+  bool(false)
+  ["print_hex_text"]=>
+  bool(false)
+  ["valueretrieval"]=>
+  int(0)
   ["oid_output_format"]=>
   int(4)
-  ["oid_increasing_check"]=>
-  bool(false)
   ["exceptions_enabled"]=>
   int(0)
 }
@@ -142,16 +166,28 @@ object(SNMP)#%d (%d) {
   }
   ["max_oids"]=>
   int(40)
-  ["valueretrieval"]=>
-  int(1)
+  ["oid_increasing_check"]=>
+  bool(true)
   ["quick_print"]=>
   bool(true)
   ["enum_print"]=>
   bool(true)
+  ["numeric_index"]=>
+  bool(false)
+  ["numeric_timeticks"]=>
+  bool(false)
+  ["extended_index"]=>
+  bool(false)
+  ["dont_print_units"]=>
+  bool(false)
+  ["escape_quotes"]=>
+  bool(false)
+  ["print_hex_text"]=>
+  bool(false)
+  ["valueretrieval"]=>
+  int(1)
   ["oid_output_format"]=>
   int(3)
-  ["oid_increasing_check"]=>
-  bool(true)
   ["exceptions_enabled"]=>
   int(0)
 }
@@ -172,16 +208,28 @@ object(SNMP)#%d (%d) {
   }
   ["max_oids"]=>
   int(40)
-  ["valueretrieval"]=>
-  int(1)
+  ["oid_increasing_check"]=>
+  bool(true)
   ["quick_print"]=>
   bool(true)
   ["enum_print"]=>
   bool(true)
+  ["numeric_index"]=>
+  bool(false)
+  ["numeric_timeticks"]=>
+  bool(false)
+  ["extended_index"]=>
+  bool(false)
+  ["dont_print_units"]=>
+  bool(false)
+  ["escape_quotes"]=>
+  bool(false)
+  ["print_hex_text"]=>
+  bool(false)
+  ["valueretrieval"]=>
+  int(1)
   ["oid_output_format"]=>
   int(3)
-  ["oid_increasing_check"]=>
-  bool(true)
   ["exceptions_enabled"]=>
   int(0)
   ["123"]=>
@@ -195,6 +243,6 @@ Warning: Undefined property: SNMP::$there is no such parameter in %s on line %d
 NULL
 bool(false)
 SNMP retrieval method must be a bitmask of SNMP_VALUE_LIBRARY, SNMP_VALUE_PLAIN, and SNMP_VALUE_OBJECT
-SNMP output print format must be an SNMP_OID_OUTPUT_* constant
+SNMP output print format must be a SNMP_OID_OUTPUT_* constant
 Cannot write read-only property SNMP::$info
 NULL
diff --git a/ext/snmp/tests/snmp_set_oid_output_format.phpt b/ext/snmp/tests/snmp_set_oid_output_format.phpt
index bb8c63bdda1a..582ba79e7c29 100644
--- a/ext/snmp/tests/snmp_set_oid_output_format.phpt
+++ b/ext/snmp/tests/snmp_set_oid_output_format.phpt
@@ -26,7 +26,7 @@ var_dump(snmp_set_oid_output_format(SNMP_OID_OUTPUT_NUMERIC));
 ?>
 --EXPECT--
 Checking error handling
-snmp_set_oid_output_format(): Argument #1 ($format) must be an SNMP_OID_OUTPUT_* constant
+snmp_set_oid_output_format(): Argument #1 ($format) must be a Snmp\OidOutput constant
 Checking working
 bool(true)
 bool(true)
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.