mirror of
https://github.com/php/php-src.git
synced 2024-09-24 11:27:28 +00:00
517b553625
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
65 lines
1.3 KiB
PHP
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
|