ajout func::get_all(), call_all()

This commit is contained in:
Jephté Clain 2025-10-02 19:12:23 +04:00
parent 8cfcaae5b8
commit 6a41b72e95

View File

@ -545,6 +545,92 @@ class func {
else return cl::withn($value);
}
const MASK_PS = ReflectionMethod::IS_STATIC | ReflectionMethod::IS_PUBLIC;
const MASK_P = ReflectionMethod::IS_PUBLIC;
const METHOD_PS = ReflectionMethod::IS_PUBLIC | ReflectionMethod::IS_STATIC;
const METHOD_P = ReflectionMethod::IS_PUBLIC;
private static function match_name(string $name, array $includes, array $excludes): bool {
if ($includes) {
$matches = false;
foreach ($includes as $include) {
if (substr($include, 0, 1) == "/") {
# expression régulière
if (preg_match($include, $name)) {
$matches = true;
break;
}
} else {
# tester la présence de la sous-chaine
if (strpos($name, $include) !== false) {
$matches = true;
break;
}
}
}
if (!$matches) return false;
}
foreach ($excludes as $exclude) {
if (substr($exclude, 0, 1) == "/") {
# expression régulière
if (preg_match($exclude, $name)) return false;
} else {
# tester la présence de la sous-chaine
if (strpos($name, $exclude) !== false) return false;
}
}
return true;
}
/**
* @return self[]
*/
static function get_all($class_or_object, ?array $params=null): array {
$prefix = $params["prefix"] ?? "";
$length = strlen($prefix);
$args = $params["args"] ?? null;
$staticOnly = $params["static_only"] ?? false;
$includes = cl::with($params["include"] ?? null);
$excludes = cl::with($params["exclude"] ?? null);
if (is_string($class_or_object)) {
# lister les méthodes publiques statiques de la classe
$mask = self::MASK_PS;
$expected = self::METHOD_PS;
$c = new ReflectionClass($class_or_object);
} elseif (is_object($class_or_object)) {
# lister les méthodes publiques de la classe
$c = new ReflectionClass($class_or_object);
$mask = $staticOnly? self::MASK_PS: self::MASK_P;
$expected = $staticOnly? self::METHOD_PS: self::METHOD_P;
} else {
throw new ValueException("$class_or_object: vous devez spécifier une classe ou un objet");
}
$methods = [];
foreach ($c->getMethods() as $m) {
if (($m->getModifiers() & $mask) != $expected) continue;
$name = $m->getName();
if (substr($name, 0, $length) != $prefix) continue;
if (!self::match_name($name, $includes, $excludes)) continue;
$method = [$class_or_object, $name];
$methods[] = self::with($method, $args);
}
return $methods;
}
/**
* Appeler toutes les méthodes publiques de $object_or_class et retourner un
* tableau [$method_name => $return_value] des valeurs de retour.
*/
static function call_all($class_or_object, ?array $params=null) {
$methods = self::get_all($class_or_object, $params);
$values = [];
foreach ($methods as $method) {
$values[$method->getName()] = $method->invoke();
}
return $values;
}
#############################################################################
protected function __construct(int $type, $func, ?array $args=null, bool $bound=false, ?string $reason=null) {
@ -598,6 +684,10 @@ class func {
protected ?array $func;
function getName(): ?string {
return $this->func[1] ?? null;
}
protected bool $bound;
protected ?string $reason;