From: Nikita Popov Date: Fri, 9 Oct 2015 21:38:25 +0000 (+0200) Subject: Add more tests for closure binding X-Git-Tag: php-7.0.0RC5~5^2 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=7597a065623c4437ff29004d87a5d45f1bfe50fe;p=php Add more tests for closure binding --- diff --git a/Zend/tests/bug70685.phpt b/Zend/tests/bug70685.phpt index e286e58e7d..7a49ff1825 100644 --- a/Zend/tests/bug70685.phpt +++ b/Zend/tests/bug70685.phpt @@ -18,5 +18,5 @@ var_dump($c); Warning: Cannot bind internal method SplDoublyLinkedList::count() to object of class cls in %s on line %d NULL -Warning: Cannot bind function SplDoublyLinkedList::count to scope class cls in %s on line %d +Warning: Cannot rebind scope of closure created by ReflectionFunctionAbstract::getClosure() in %s on line %d NULL diff --git a/Zend/tests/closure_061.phpt b/Zend/tests/closure_061.phpt new file mode 100644 index 0000000000..a87303498e --- /dev/null +++ b/Zend/tests/closure_061.phpt @@ -0,0 +1,208 @@ +--TEST-- +Rebinding of ::getClosure()s +--FILE-- +getClosure(is_object($fn[0]) ? $fn[0] : null); + $fnStr = is_object($fn[0]) ? "(new " . get_class($fn[0]) . ")->$fn[1]" : "$fn[0]::$fn[1]"; + } else { + $c = (new ReflectionFunction($fn))->getClosure(); + $fnStr = $fn; + } + + echo "$fnStr()\n" . str_repeat('-', strlen($fnStr) + 2), "\n\n"; + + foreach ($bindings as list($obj, $scope)) { + $objStr = $obj ? "new " . get_class($obj) : "null"; + $scopeStr = $scope ? "$scope::class" : "null"; + echo "bindTo($objStr, $scopeStr):\n"; + + $ret = $c->bindTo($obj, $scope); + if ($ret !== null) { + echo "Success!\n\n"; + } + } +} + +?> +--EXPECT-- +func() +------ + +bindTo(null, null): +Success! + +bindTo(new Cls, null): +Success! + +bindTo(new Cls, Cls::class): +Cannot rebind scope of closure created by ReflectionFunctionAbstract::getClosure() + +bindTo(null, Cls::class): +Cannot rebind scope of closure created by ReflectionFunctionAbstract::getClosure() + +bindTo(null, stdClass::class): +Cannot bind closure to scope of internal class stdClass + +bindTo(new stdClass, null): +Success! + +strlen() +-------- + +bindTo(null, null): +Success! + +bindTo(new Cls, null): +Success! + +bindTo(new Cls, Cls::class): +Cannot rebind scope of closure created by ReflectionFunctionAbstract::getClosure() + +bindTo(null, Cls::class): +Cannot rebind scope of closure created by ReflectionFunctionAbstract::getClosure() + +bindTo(null, stdClass::class): +Cannot bind closure to scope of internal class stdClass + +bindTo(new stdClass, null): +Success! + +Cls::staticMethod() +------------------- + +bindTo(null, Cls::class): +Success! + +bindTo(new Cls, null): +Cannot bind an instance to a static closure + +bindTo(new Cls, Cls::class): +Cannot bind an instance to a static closure + +bindTo(null, null): +Cannot rebind scope of closure created by ReflectionFunctionAbstract::getClosure() + +bindTo(null, ClsChild::class): +Cannot rebind scope of closure created by ReflectionFunctionAbstract::getClosure() + +bindTo(null, ClsUnrelated::class): +Cannot rebind scope of closure created by ReflectionFunctionAbstract::getClosure() + +(new Cls)->method() +------------------- + +bindTo(null, Cls::class): +Success! + +bindTo(new Cls, Cls::class): +Success! + +bindTo(new ClsChild, Cls::class): +Success! + +bindTo(new ClsUnrelated, Cls::class): +Success! + +bindTo(new Cls, null): +Cannot rebind scope of closure created by ReflectionFunctionAbstract::getClosure() + +bindTo(new Cls, ClsUnrelated::class): +Cannot rebind scope of closure created by ReflectionFunctionAbstract::getClosure() + +bindTo(new Cls, ClsChild::class): +Cannot rebind scope of closure created by ReflectionFunctionAbstract::getClosure() + +(new SplDoublyLinkedList)->count() +---------------------------------- + +bindTo(new SplDoublyLinkedList, SplDoublyLinkedList::class): +Success! + +bindTo(new SplStack, SplDoublyLinkedList::class): +Success! + +bindTo(new ClsUnrelated, SplDoublyLinkedList::class): +Cannot bind internal method SplDoublyLinkedList::count() to object of class ClsUnrelated + +bindTo(null, null): +Cannot unbind $this of internal method + +bindTo(null, SplDoublyLinkedList::class): +Cannot unbind $this of internal method + +bindTo(new SplDoublyLinkedList, null): +Cannot rebind scope of closure created by ReflectionFunctionAbstract::getClosure() + +bindTo(new SplDoublyLinkedList, ClsUnrelated::class): +Cannot rebind scope of closure created by ReflectionFunctionAbstract::getClosure()