diff --git a/Zend/tests/constants/class_constants_005.phpt b/Zend/tests/constants/class_constants_005.phpt index de53c2c0caa54..7accce13f208b 100644 --- a/Zend/tests/constants/class_constants_005.phpt +++ b/Zend/tests/constants/class_constants_005.phpt @@ -4,7 +4,7 @@ String interning during constants substitution opcache.enable_cli=0 --FILE-- diff --git a/Zend/tests/nullsafe_operator/013.phpt b/Zend/tests/nullsafe_operator/013.phpt index 883f6ac24aa8d..abc850a15a055 100644 --- a/Zend/tests/nullsafe_operator/013.phpt +++ b/Zend/tests/nullsafe_operator/013.phpt @@ -53,6 +53,8 @@ Deprecated: chr(): Passing null to parameter #1 ($codepoint) of type int is depr string(1) "%s" Deprecated: ord(): Passing null to parameter #1 ($character) of type string is deprecated in %s on line %d + +Deprecated: ord(): Providing an empty string is deprecated in %s on line %d int(0) string(98) "call_user_func_array(): Argument #1 ($callback) must be a valid callback, no array or string given" string(77) "call_user_func_array(): Argument #2 ($args) must be of type array, null given" diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index eb2286b932959..1b0474285042d 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -4160,14 +4160,18 @@ static zend_result zend_compile_func_chr(znode *result, zend_ast_list *args) /* } /* }}} */ -static zend_result zend_compile_func_ord(znode *result, zend_ast_list *args) /* {{{ */ +static zend_result zend_compile_func_ord(znode *result, const zend_ast_list *args) /* {{{ */ { - if (args->children == 1 && - args->child[0]->kind == ZEND_AST_ZVAL && - Z_TYPE_P(zend_ast_get_zval(args->child[0])) == IS_STRING) { - + zval *str; + if ( + args->children == 1 + && args->child[0]->kind == ZEND_AST_ZVAL + && (str = zend_ast_get_zval(args->child[0])) + && Z_TYPE_P(str) == IS_STRING + && Z_STRLEN_P(str) == 1 + ) { result->op_type = IS_CONST; - ZVAL_LONG(&result->u.constant, (unsigned char)Z_STRVAL_P(zend_ast_get_zval(args->child[0]))[0]); + ZVAL_LONG(&result->u.constant, (unsigned char)Z_STRVAL_P(str)[0]); return SUCCESS; } else { return FAILURE; diff --git a/ext/standard/string.c b/ext/standard/string.c index 4bc56f550fe1b..b94f91eb79543 100644 --- a/ext/standard/string.c +++ b/ext/standard/string.c @@ -2651,6 +2651,15 @@ PHP_FUNCTION(ord) Z_PARAM_STR(str) ZEND_PARSE_PARAMETERS_END(); + if (UNEXPECTED(ZSTR_LEN(str) != 1)) { + if (ZSTR_LEN(str) == 0) { + php_error_docref(NULL, E_DEPRECATED, + "Providing an empty string is deprecated"); + } else { + php_error_docref(NULL, E_DEPRECATED, + "Providing a string which is not one byte long is deprecated, use ord($str[0]) instead"); + } + } RETURN_LONG((unsigned char) ZSTR_VAL(str)[0]); } /* }}} */ diff --git a/ext/standard/tests/strings/ord_basic.phpt b/ext/standard/tests/strings/ord_basic.phpt index 0921dfda55aa2..4e00bd0b22f5e 100644 --- a/ext/standard/tests/strings/ord_basic.phpt +++ b/ext/standard/tests/strings/ord_basic.phpt @@ -15,7 +15,6 @@ var_dump(ord("@")); var_dump(ord("\n")); var_dump(ord("\x0A")); var_dump(ord("\xFF")); -var_dump(ord("Hello")); // Make sure all valid ascii chars round trip for ($i = 0; $i < 255; $i++) { @@ -37,4 +36,3 @@ int(64) int(10) int(10) int(255) -int(72) diff --git a/ext/standard/tests/strings/ord_not_1_byte.phpt b/ext/standard/tests/strings/ord_not_1_byte.phpt new file mode 100644 index 0000000000000..b769c92b99872 --- /dev/null +++ b/ext/standard/tests/strings/ord_not_1_byte.phpt @@ -0,0 +1,15 @@ +--TEST-- +ord() with values not one byte long +--FILE-- + +--EXPECTF-- +Deprecated: ord(): Providing an empty string is deprecated in %s on line 3 +int(0) + +Deprecated: ord(): Providing a string which is not one byte long is deprecated, use ord($str[0]) instead in %s on line 4 +int(72)