- substr: documentation ( source)
- var_dump: documentation ( source)
- get_declared_classes: documentation ( source)
- array_filter: documentation ( source)
- set_error_handler: documentation ( source)
<?php
set_error_handler(function ($errno, $errstr) { global $errored; $errored = TRUE; return TRUE; });
$errored = FALSE;
$excludedClasses = [ // These cause fatal errors on instantiation
"Closure",
"SQLite3",
"Filter"
];
var_dump(
array_filter(
get_declared_classes(),
function ($className) use (&$errored, $excludedClasses) {
$errored = FALSE;
$class = new ReflectionClass($className);
if (!$class->isInstantiable() || $class->hasMethod('__construct') && (new ReflectionMethod("$className::__construct"))->isPrivate()) {
return FALSE;
}
foreach ($excludedClasses as $bannedClass) {
if (substr($className, 0, strlen($bannedClass)) === $bannedClass) {
return FALSE;
}
}
if (!(new ReflectionClass($className))->hasMethod('__toString')) {
try {
$x = new $className;
$x = (string)$x;
return $errored;
} catch (Exception $e) {
return FALSE;
}
}
return FALSE;
}
)
);