Return to closure_041.phpt CVS log | Up to [ELWIX - Embedded LightWeight unIX -] / embedaddon / php / Zend / tests |
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.