Annotation of embedaddon/php/Zend/tests/closure_046.phpt, revision 1.1
1.1 ! misho 1: --TEST--
! 2: Closure 046: Rebinding: preservation of previous scope when "static" given as scope arg (same as closure #041)
! 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: $nonstaticUnscoped = function () { var_dump(isset(A::$priv)); var_dump(isset($this)); };
! 11:
! 12: class A {
! 13: private static $priv = 7;
! 14: function getClosure() {
! 15: return function() { var_dump(isset(A::$priv)); var_dump(isset($this)); };
! 16: }
! 17: }
! 18: class B extends A {}
! 19:
! 20: $a = new A();
! 21: $nonstaticScoped = $a->getClosure();
! 22:
! 23: echo "Before binding", "\n";
! 24: $nonstaticUnscoped(); echo "\n";
! 25: $nonstaticScoped(); echo "\n";
! 26:
! 27: echo "After binding, no instance", "\n";
! 28: $d = $nonstaticUnscoped->bindTo(null, "static"); $d(); echo "\n";
! 29: $d = $nonstaticScoped->bindTo(null, "static"); $d(); echo "\n";
! 30: //$d should have been turned to static
! 31: $d->bindTo($d);
! 32:
! 33: echo "After binding, with same-class instance for the bound one", "\n";
! 34: $d = $nonstaticUnscoped->bindTo(new A, "static"); $d(); echo "\n";
! 35: $d = $nonstaticScoped->bindTo(new A, "static"); $d(); echo "\n";
! 36:
! 37: echo "After binding, with different instance for the bound one", "\n";
! 38: $d = $nonstaticScoped->bindTo(new B, "static"); $d(); echo "\n";
! 39:
! 40: echo "Done.\n";
! 41:
! 42: --EXPECTF--
! 43: Before binding
! 44: bool(false)
! 45: bool(false)
! 46:
! 47: bool(true)
! 48: bool(true)
! 49:
! 50: After binding, no instance
! 51: bool(false)
! 52: bool(false)
! 53:
! 54: bool(true)
! 55: bool(false)
! 56:
! 57:
! 58: Warning: Cannot bind an instance to a static closure in %s on line %d
! 59: After binding, with same-class instance for the bound one
! 60: bool(false)
! 61: bool(true)
! 62:
! 63: bool(true)
! 64: bool(true)
! 65:
! 66: After binding, with different instance for the bound one
! 67: bool(true)
! 68: bool(true)
! 69:
! 70: Done.
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>