]> granicus.if.org Git - php/commitdiff
Fixed bug #73118
authorAdam Saponara <as@php.net>
Sat, 11 Feb 2017 04:58:25 +0000 (23:58 -0500)
committerNikita Popov <nikita.ppv@gmail.com>
Sat, 11 Feb 2017 23:14:59 +0000 (00:14 +0100)
NEWS
ext/standard/tests/general_functions/is_callable_anon.phpt [new file with mode: 0644]
ext/standard/tests/general_functions/is_callable_variation1.phpt
ext/standard/type.c

diff --git a/NEWS b/NEWS
index 24f5d0fb76a8ec64cac27459bcb865588f08850c..f78594b612a85ed31b6781f76a46b89929d5c32f 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -36,6 +36,8 @@ PHP                                                                        NEWS
 - Standard:
   . Fixed bug #74005 (mail.add_x_header causes RFC-breaking lone line feed).
     (Anatol)
+  . Fixed bug #73118 (is_callable callable name reports misleading value for
+    anonymous classes). (Adam Saponara)
 
 
 16 Feb 2017 PHP 7.0.16
diff --git a/ext/standard/tests/general_functions/is_callable_anon.phpt b/ext/standard/tests/general_functions/is_callable_anon.phpt
new file mode 100644 (file)
index 0000000..635f2a0
--- /dev/null
@@ -0,0 +1,22 @@
+--TEST--
+Test is_callable() function : usage variations - anonymous class method
+--FILE--
+<?php
+
+new class {
+    function __construct() {
+        $fname = null;
+        if (is_callable([$this, 'f'], false, $fname)) {
+            call_user_func($fname);
+        } else {
+            echo "dang\n";
+        }
+    }
+    function f() {
+        echo "nice\n";
+    }
+};
+
+?>
+--EXPECT--
+nice
index cfc14bbd9c6857cea4dafb2d55ac4b757cbbdece..0a4609b6d2e5404bc63754534a55c483f8c6e174 100644 (file)
@@ -21,10 +21,10 @@ function check_iscallable( $functions ) {
     var_dump( is_callable($func) );  //given only $var argument
     var_dump( is_callable($func, TRUE) );  //given $var and $syntax argument
     var_dump( is_callable($func, TRUE, $callable_name) );
-    echo $callable_name, "\n";
+    echo json_encode($callable_name) . "\n";
     var_dump( is_callable($func, FALSE) );  //given $var and $syntax argument
     var_dump( is_callable($func, FALSE, $callable_name) );
-    echo $callable_name, "\n";
+    echo json_encode($callable_name) . "\n";
     $counter++;
   }
 }
@@ -65,144 +65,144 @@ check_iscallable($undef_functions);
 bool(false)
 bool(true)
 bool(true)
-
+""
 bool(false)
 bool(false)
-
+""
 -- Iteration  2 --
 bool(false)
 bool(true)
 bool(true)
-
+""
 bool(false)
 bool(false)
-
+""
 -- Iteration  3 --
 bool(false)
 bool(true)
 bool(true)
+" "
 bool(false)
 bool(false)
+" "
 -- Iteration  4 --
 bool(false)
 bool(true)
 bool(true)
+" "
 bool(false)
 bool(false)
+" "
 -- Iteration  5 --
 bool(false)
 bool(true)
 bool(true)
-12356
+"12356"
 bool(false)
 bool(false)
-12356
+"12356"
 -- Iteration  6 --
 bool(false)
 bool(true)
 bool(true)
-
+"\u0000"
 bool(false)
 bool(false)
-
+"\u0000"
 -- Iteration  7 --
 bool(false)
 bool(true)
 bool(true)
-\0
+"\\0"
 bool(false)
 bool(false)
-\0
+"\\0"
 -- Iteration  8 --
 bool(false)
 bool(true)
 bool(true)
-hello world
+"hello world"
 bool(false)
 bool(false)
-hello world
+"hello world"
 -- Iteration  9 --
 bool(false)
 bool(true)
 bool(true)
-hello world
+"hello world"
 bool(false)
 bool(false)
-hello world
+"hello world"
 -- Iteration  10 --
 bool(false)
 bool(true)
 bool(true)
-welcome
+"welcome\u0000"
 bool(false)
 bool(false)
-welcome
+"welcome\u0000"
 -- Iteration  11 --
 bool(false)
 bool(true)
 bool(true)
-welcome\0
+"welcome\\0"
 bool(false)
 bool(false)
-welcome\0
+"welcome\\0"
 -- Iteration  12 --
 bool(false)
 bool(true)
 bool(true)
-==%%%***$$$@@@!!
+"==%%%***$$$@@@!!"
 bool(false)
 bool(false)
-==%%%***$$$@@@!!
+"==%%%***$$$@@@!!"
 -- Iteration  13 --
 bool(false)
 bool(true)
 bool(true)
-false
+"false"
 bool(false)
 bool(false)
-false
+"false"
 -- Iteration  14 --
 bool(false)
 bool(true)
 bool(true)
-8
+"8"
 bool(false)
 bool(false)
-8
+"8"
 -- Iteration  15 --
 bool(false)
 bool(true)
 bool(true)
-\t
+"\\t"
 bool(false)
 bool(false)
-\t
+"\\t"
 -- Iteration  16 --
 bool(false)
 bool(true)
 bool(true)
-\007
+"\\007"
 bool(false)
 bool(false)
-\007
+"\\007"
 -- Iteration  17 --
 bool(false)
 bool(true)
 bool(true)
-123
+"123"
 bool(false)
 bool(false)
-123
+"123"
 -- Iteration  18 --
 bool(false)
 bool(true)
 bool(true)
-echo()
+"echo()"
 bool(false)
 bool(false)
-echo()
-===DONE===
\ No newline at end of file
+"echo()"
+===DONE===
index 033eca48d943f3be3cb63c88b62428104fc88736..a9686a21f6fd44f366b1cdbad0c248b5a0db7281 100644 (file)
@@ -384,13 +384,7 @@ PHP_FUNCTION(is_callable)
        if (ZEND_NUM_ARGS() > 2) {
                retval = zend_is_callable_ex(var, NULL, check_flags, &name, NULL, &error);
                zval_dtor(callable_name);
-               //??? is it necessary to be consistent with old PHP ("\0" support)
-               if (UNEXPECTED(ZSTR_LEN(name)) != strlen(ZSTR_VAL(name))) {
-                       ZVAL_STRINGL(callable_name, ZSTR_VAL(name), strlen(ZSTR_VAL(name)));
-                       zend_string_release(name);
-               } else {
-                       ZVAL_STR(callable_name, name);
-               }
+               ZVAL_STR(callable_name, name);
        } else {
                retval = zend_is_callable_ex(var, NULL, check_flags, NULL, NULL, &error);
        }