diff options
author | Stanislav Malyshev <stas@php.net> | 2011-09-07 06:46:27 +0000 |
---|---|---|
committer | Stanislav Malyshev <stas@php.net> | 2011-09-07 06:46:27 +0000 |
commit | a447acdcc6f12ea3a5dcd22416cb033e62995935 (patch) | |
tree | 410120ab2ed3bd11aa0fa315379d04a0f887bf89 /Zend/tests/closure_038.phpt | |
parent | 1f347459fb9047e7e21126ce7a34cde75785bf09 (diff) | |
download | php-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.phpt | 58 |
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 |