Annotation of embedaddon/php/Zend/tests/closure_041.phpt, revision 1.1.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>