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