Annotation of embedaddon/php/Zend/tests/closure_041.phpt, revision 1.1
1.1 ! misho 1: --TEST--
! 2: Closure 041: Rebinding: preservation of previous scope when not given as arg unless impossible
! 3: --FILE--
! 4: <?php
! 5:
! 6: /* It's impossible to preserve the previous scope when doing so would break
! 7: * the invariants that, for non-static closures, having a scope is equivalent
! 8: * to having a bound instance. */
! 9:
! 10: $staticUnscoped = static function () {
! 11: echo "scoped to A: "; var_dump(isset(A::$priv));
! 12: echo "bound: ", isset($this)?get_class($this):"no";
! 13: };
! 14:
! 15: $nonstaticUnscoped = function () {
! 16: echo "scoped to A: "; var_dump(isset(A::$priv));
! 17: echo "bound: ", isset($this)?get_class($this):"no";
! 18: };
! 19:
! 20: class A {
! 21: private static $priv = 7;
! 22: function getClosure() {
! 23: return function () {
! 24: echo "scoped to A: "; var_dump(isset(A::$priv));
! 25: echo "bound: ", isset($this)?get_class($this):"no";
! 26: };
! 27: }
! 28: function getStaticClosure() {
! 29: return static function () {
! 30: echo "scoped to A: "; var_dump(isset(A::$priv));
! 31: echo "bound: ", isset($this)?get_class($this):"no";
! 32: };
! 33: }
! 34: }
! 35: class B extends A {}
! 36:
! 37: $a = new A();
! 38: $staticScoped = $a->getStaticClosure();
! 39: $nonstaticScoped = $a->getClosure();
! 40:
! 41: echo "Before binding", "\n";
! 42: $staticUnscoped(); echo "\n";
! 43: $nonstaticUnscoped(); echo "\n";
! 44: $staticScoped(); echo "\n";
! 45: $nonstaticScoped(); echo "\n";
! 46:
! 47: echo "After binding, no instance", "\n";
! 48: $d = $staticUnscoped->bindTo(null); $d(); echo "\n";
! 49: $d = $nonstaticUnscoped->bindTo(null); $d(); echo "\n";
! 50: $d = $staticScoped->bindTo(null); $d(); echo "\n";
! 51: $d = $nonstaticScoped->bindTo(null); $d(); echo "\n";
! 52: //$d should have been turned to static
! 53: $d->bindTo($d);
! 54:
! 55: echo "After binding, with same-class instance for the bound ones", "\n";
! 56: $d = $staticUnscoped->bindTo(new A); $d(); echo "\n";
! 57: $d = $nonstaticUnscoped->bindTo(new A); $d(); echo " (should be scoped to dummy class)\n";
! 58: $d = $staticScoped->bindTo(new A); $d(); echo "\n";
! 59: $d = $nonstaticScoped->bindTo(new A); $d(); echo "\n";
! 60:
! 61: echo "After binding, with different instance for the bound ones", "\n";
! 62: $d = $nonstaticUnscoped->bindTo(new B); $d(); echo " (should be scoped to dummy class)\n";
! 63: $d = $nonstaticScoped->bindTo(new B); $d(); echo "\n";
! 64:
! 65: echo "Done.\n";
! 66:
! 67: --EXPECTF--
! 68: Before binding
! 69: scoped to A: bool(false)
! 70: bound: no
! 71: scoped to A: bool(false)
! 72: bound: no
! 73: scoped to A: bool(true)
! 74: bound: no
! 75: scoped to A: bool(true)
! 76: bound: A
! 77: After binding, no instance
! 78: scoped to A: bool(false)
! 79: bound: no
! 80: scoped to A: bool(false)
! 81: bound: no
! 82: scoped to A: bool(true)
! 83: bound: no
! 84: scoped to A: bool(true)
! 85: bound: no
! 86:
! 87: Warning: Cannot bind an instance to a static closure in %s on line %d
! 88: After binding, with same-class instance for the bound ones
! 89:
! 90: Warning: Cannot bind an instance to a static closure in %s on line %d
! 91: scoped to A: bool(false)
! 92: bound: no
! 93: scoped to A: bool(false)
! 94: bound: A (should be scoped to dummy class)
! 95:
! 96: Warning: Cannot bind an instance to a static closure in %s on line %d
! 97: scoped to A: bool(true)
! 98: bound: no
! 99: scoped to A: bool(true)
! 100: bound: A
! 101: After binding, with different instance for the bound ones
! 102: scoped to A: bool(false)
! 103: bound: B (should be scoped to dummy class)
! 104: scoped to A: bool(true)
! 105: bound: B
! 106: Done.
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>