constant_expressions_classes.phpt 1.4 KB

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