- substr: documentation ( source)
- var_dump: documentation ( source)
- get_declared_classes: documentation ( source)
- array_filter: documentation ( source)
- set_error_handler: documentation ( source)
<?php
$errored = FALSE;
set_error_handler(function ($errno, $errstr) use (&$errored) { $errored = TRUE; return TRUE; });
$excludedClasses = [ // These cause fatal errors on instantiation
"Closure",
"SQLite3",
"Filter",
"PDO"
];
var_dump(
array_filter(
get_declared_classes(),
function ($className) use (&$errored, $excludedClasses) {
$errored = FALSE;
$class = new ReflectionClass($className);
$constructor = $class->getMethod('__construct');
$constructor->setAccessible(true);
if (!$class->isInstantiable() || $class->hasMethod('__construct') && $constructor->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;
}
)
);