php-src/Zend/tests/closure_061.phpt
Bob Weinand 517b553625 Fixed bug #70630 (Closure::call/bind() crash with ReflectionFunction->getClosure())
This additionally removes support for binding to an unknown (not in parent hierarchy) scope.
Removing support for cross-scope is necessary for certain compile-time assumptions (like class constants) to prevent unexpected results
2015-10-04 01:38:59 +02:00

65 lines
1.3 KiB
PHP

--TEST--
Closure::call() or Closure::bind() to independent class must fail
--FILE--
<?php
class foo {
public $var;
function initClass() {
$this->var = __CLASS__;
}
}
class bar {
public $var;
function initClass() {
$this->var = __CLASS__;
}
function getVar() {
assert($this->var !== null); // ensure initClass was called
return $this->var;
}
}
class baz extends bar {
public $var;
function initClass() {
$this->var = __CLASS__;
}
}
function callMethodOn($class, $method, $object) {
$closure = (new ReflectionMethod($class, $method))->getClosure((new ReflectionClass($class))->newInstanceWithoutConstructor());
$closure = $closure->bindTo($object, $class);
return $closure();
}
$baz = new baz;
callMethodOn("baz", "initClass", $baz);
var_dump($baz->getVar());
callMethodOn("bar", "initClass", $baz);
var_dump($baz->getVar());
callMethodOn("foo", "initClass", $baz);
var_dump($baz->getVar());
?>
--EXPECTF--
string(3) "baz"
string(3) "bar"
Warning: Cannot bind function foo::initClass to object of class baz in %s on line %d
Fatal error: Uncaught Error: Using $this when not in object context in %s:%d
Stack trace:
#0 %s(%d): initClass()
#1 %s(%d): callMethodOn('foo', 'initClass', Object(baz))
#2 {main}
thrown in %s on line %d