}; } function getStaticClosure() { return static function () { echo "scoped to A: "; var_dump(isset(A::$priv)); echo "bound: ", isset($this) ? get_class($this) : "no"; }; } } class B extends A { } $a = new A(); $staticScoped = $a->getStaticClosure(); $nonstaticScoped = $a->getClosure(); echo "Before binding", "\n"; $staticUnscoped(); echo "\n"; $nonstaticUnscoped(); echo "\n"; $staticScoped(); echo "\n"; $nonstaticScoped(); echo "\n"; echo "After binding, no instance", "\n"; $d = $staticUnscoped->bindTo(null); $d(); echo "\n"; $d = $nonstaticUnscoped->bindTo(null);
$staticUnscoped = static function () { var_dump(isset(A::$priv)); var_dump(isset($this)); }; class A { private static $priv = 7; static function getStaticClosure() { return static function () { var_dump(isset(A::$priv)); var_dump(isset($this)); }; } } $staticScoped = A::getStaticClosure(); echo "Before binding", "\n"; $staticUnscoped(); echo "\n"; $staticScoped(); echo "\n"; echo "After binding, null scope, no instance", "\n"; $d = $staticUnscoped->bindTo(null, null); $d(); echo "\n"; $d = $staticScoped->bindTo(null, null); $d(); echo "\n"; echo "After binding, null scope, with instance", "\n"; $d = $staticUnscoped->bindTo(new A(), null); $d();