1--TEST--
2Constant scalar expressions with autoloading and classes
3--INI--
4opcache.enable=1
5opcache.enable_cli=1
6opcache.optimization_level=-1
7--SKIPIF--
8<?php if (php_sapi_name() != "cli") die("skip CLI only"); ?>
9--FILE--
10<?php
11
12# This test validates that autoloading works for common const expression (AST) use cases
13$classlist = [
14  'A'=> 'class A { const HW = "this is A"; }',
15  'B'=> 'class B extends A { const HW = parent::HW." extended by B"; }',
16  'space1\C' => 'namespace space1; class C { const HW = "this is space1\C"; }',
17  'D' => 'class D  { const HW = \space1\C::HW." extented by D"; }',
18  'trE' => 'trait trE { public static function getHW() { return parent::HW; } }',
19  'E' => 'class E extends B { use trE; }',
20  'F' => 'class F { const XX = "this is F"; }',
21  'G' => 'class G extends F { const XX = parent::XX." extended by G"; public static function get_me($x = "got ".self::XX) { return $x; } }',
22];
23
24spl_autoload_register(function ($class) use ($classlist) {
25	if (isset($classlist[$class])) {
26		eval($classlist[$class]);
27	} else {
28		die("Cannot autoload $class\n");
29	}
30});
31
32printf("B::HW = %s\n", B::HW);
33printf("D::HW = %s\n", D::HW);
34
35printf("E::getHW() = %s\n", E::getHW());
36printf("G::get_me() = %s\n", G::get_me());
37
38?>
39--EXPECT--
40B::HW = this is A extended by B
41D::HW = this is space1\C extented by D
42E::getHW() = this is A extended by B
43G::get_me() = got this is F extended by G
44