- var_dump: documentation ( source)
- get_declared_classes: documentation ( source)
- array_filter: documentation ( source)
<?php
function instantiable($className) {
if (! $className) {
return true;
}
$reflection = new ReflectionClass($className);
$hasFinalConstruct = false;
if ($reflection->hasMethod('__construct')) {
$hasFinalConstruct = $reflection->getMethod('__construct')->isFinal();
}
$parentClass = $reflection->getParentClass();
return instantiable($parentClass ? $parentClass->getName() : null)
&& ! ($reflection->isInternal() && $hasFinalConstruct);
};
$negate = function ($function) {
return function (...$args) use ($function) {
return ! $function(...$args);
};
};
var_dump([
'instantiable' => array_filter(get_declared_classes(), 'instantiable'),
'not_instantiable' => array_filter(get_declared_classes(), $negate('instantiable')),
]);