summaryrefslogtreecommitdiff
path: root/Zend/tests/closure_038.phpt
diff options
context:
space:
mode:
authorStanislav Malyshev <stas@php.net>2011-09-07 06:46:27 +0000
committerStanislav Malyshev <stas@php.net>2011-09-07 06:46:27 +0000
commita447acdcc6f12ea3a5dcd22416cb033e62995935 (patch)
tree410120ab2ed3bd11aa0fa315379d04a0f887bf89 /Zend/tests/closure_038.phpt
parent1f347459fb9047e7e21126ce7a34cde75785bf09 (diff)
downloadphp-git-a447acdcc6f12ea3a5dcd22416cb033e62995935.tar.gz
Commit Gustavo's closure rebinding patch as desided by vote
Diffstat (limited to 'Zend/tests/closure_038.phpt')
-rw-r--r--Zend/tests/closure_038.phpt58
1 files changed, 58 insertions, 0 deletions
diff --git a/Zend/tests/closure_038.phpt b/Zend/tests/closure_038.phpt
new file mode 100644
index 0000000000..fef0734786
--- /dev/null
+++ b/Zend/tests/closure_038.phpt
@@ -0,0 +1,58 @@
+--TEST--
+Closure 038: Rebinding closures, change scope, different runtime type
+--FILE--
+<?php
+
+class A {
+ private $x;
+
+ public function __construct($v) {
+ $this->x = $v;
+ }
+
+ public function getIncrementor() {
+ return function() { return ++$this->x; };
+ }
+}
+class B extends A {
+ private $x;
+ public function __construct($v) {
+ parent::__construct($v);
+ $this->x = $v*2;
+ }
+}
+
+$a = new A(0);
+$b = new B(10);
+
+$ca = $a->getIncrementor();
+var_dump($ca());
+
+echo "Testing with scope given as object", "\n";
+
+$cb = $ca->bindTo($b, $b);
+$cb2 = Closure::bind($ca, $b, $b);
+var_dump($cb());
+var_dump($cb2());
+
+echo "Testing with scope as string", "\n";
+
+$cb = $ca->bindTo($b, 'B');
+$cb2 = Closure::bind($ca, $b, 'B');
+var_dump($cb());
+var_dump($cb2());
+
+$cb = $ca->bindTo($b, NULL);
+var_dump($cb());
+
+?>
+--EXPECTF--
+int(1)
+Testing with scope given as object
+int(21)
+int(22)
+Testing with scope as string
+int(23)
+int(24)
+
+Fatal error: Cannot access private property B::$x in %s on line %d