1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
|
--TEST--
Dynamic class constant fetch
--FILE--
<?php
class Foo {
public const BAR = 'bar';
}
function test($code) {
try {
var_dump(eval($code));
} catch (Throwable $e) {
echo $e->getMessage(), "\n";
}
}
$const_names = [
['', '"BAR"'],
['$bar = "BAR";', '$bar'],
['$ba = "BA"; $r = "R";', '$ba . $r'],
['', 'strtoupper("bar")'],
['', '$barr'],
['$bar = "BAR"; $barRef = &$bar;', '$barRef'],
['', 'strtolower("CLASS")'],
['', '42'],
['$bar = 42;', '$bar'],
['', '[]'],
['$bar = [];', '$bar'],
];
foreach ($const_names as [$prolog, $const_name]) {
test("$prolog return Foo::{{$const_name}};");
test("\$foo = 'Foo'; $prolog return \$foo::{{$const_name}};");
}
?>
--EXPECTF--
string(3) "bar"
string(3) "bar"
string(3) "bar"
string(3) "bar"
string(3) "bar"
string(3) "bar"
string(3) "bar"
string(3) "bar"
Warning: Undefined variable $barr in %s : eval()'d code on line %d
Cannot use value of type null as class constant name
Warning: Undefined variable $barr in %s : eval()'d code on line %d
Cannot use value of type null as class constant name
string(3) "bar"
string(3) "bar"
string(3) "Foo"
string(3) "Foo"
Cannot use value of type int as class constant name
Cannot use value of type int as class constant name
Cannot use value of type int as class constant name
Cannot use value of type int as class constant name
Cannot use value of type array as class constant name
Cannot use value of type array as class constant name
Cannot use value of type array as class constant name
Cannot use value of type array as class constant name
|