--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; } if ($fn instanceof Closure) { $fnStr = "(function() {})"; } 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 from function bindTo(null, Cls::class): Cannot rebind scope of closure created from function 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 from function bindTo(null, Cls::class): Cannot rebind scope of closure created from function 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 from method bindTo(null, ClsChild::class): Cannot rebind scope of closure created from method bindTo(null, ClsUnrelated::class): Cannot rebind scope of closure created from method (new Cls)->method() ------------------- bindTo(null, Cls::class): Cannot unbind $this of method bindTo(new Cls, Cls::class): Success! bindTo(new ClsChild, Cls::class): Success! bindTo(new ClsUnrelated, Cls::class): Cannot bind method Cls::method() to object of class ClsUnrelated bindTo(new Cls, null): Cannot rebind scope of closure created from method bindTo(new Cls, ClsUnrelated::class): Cannot rebind scope of closure created from method bindTo(new Cls, ClsChild::class): Cannot rebind scope of closure created from method (new SplDoublyLinkedList)->count() ---------------------------------- bindTo(new SplDoublyLinkedList, SplDoublyLinkedList::class): Success! bindTo(new SplStack, SplDoublyLinkedList::class): Success! bindTo(new ClsUnrelated, SplDoublyLinkedList::class): Cannot bind method SplDoublyLinkedList::count() to object of class ClsUnrelated bindTo(null, null): Cannot unbind $this of method bindTo(null, SplDoublyLinkedList::class): Cannot unbind $this of method bindTo(new SplDoublyLinkedList, null): Cannot rebind scope of closure created from method bindTo(new SplDoublyLinkedList, ClsUnrelated::class): Cannot rebind scope of closure created from method (function() {})() ----------------- bindTo(null, null): Success! bindTo(new Cls, null): Success! bindTo(new Cls, Cls::class): Success! bindTo(null, Cls::class): Success! bindTo(null, stdClass::class): Cannot bind closure to scope of internal class stdClass bindTo(new stdClass, null): Success!