getSchema(); } /** * initialiser dans $params les valeurs de $defaults si: * - elles ne sont pas nulles (avec $ignoreNulls == true) * - elles ne sont pas déjà définies dans $params */ static function set_parametrable_params_defaults(?array &$params, ?array $defaults, bool $ignoreNulls=true): void { if ($defaults === null) return; foreach ($defaults as $key => $value) { if ($value !== null || !$ignoreNulls) { A::replace_nx($params, $key, $value); } } } function setParametrableParams(?array $params): void { $parametrables = $this->getParametrableParamsParametrables(); $md = self::parametrable_params_md(); $modifiedKeys = parametrable_utils::set_params($parametrables, $this, $params, $md); $this->afterSetParametrableParams($modifiedKeys, $md); } protected static function was_parametrable_param_modified(array $modifiedKeys, string ...$keys): bool { foreach ($modifiedKeys as $key) { if (in_array($key, $keys)) return true; } return false; } function initParametrableParams(?array $params, bool $setParametrableParams=true): void { $parametrables = $this->getParametrableParamsParametrables(); parametrable_utils::set_defaults($parametrables, $this, self::parametrable_params_md()); if ($setParametrableParams) $this->setParametrableParams($params); } /** * splitter $params en deux tableaux: les paramètres définis et les autres. * ceci n'est utile que si l'on veut traiter à part ces valeurs. */ static function split_parametrable_params(?array $params=null): array { if ($params === null) return [null, []]; $md = self::parametrable_params_md(); $others = $md->getOthers($params); $params = $md->getValues($params); return [$params, $others]; } protected function splitParametrableParams(?array $params): array { return self::split_parametrable_params($params); } /** * implémentation par défaut à utiliser dans une méthode __call() * * la constante _AUTO_SETTERS doit être définie. * * retourner true si la méthode a été appelée, false si elle n'est pas gérée * par cette méthode * * utiliser de cette manière: * function __call(string $name, array $args) { * if ($this->parametrable__call($name, $args, $result)) return $result; * .... * throw IllegalAccessException::not_implemented($name); * } */ function parametrable__call(string $name, array $args, &$result): bool { $md = self::parametrable_params_md(); $auto_getters = self::_AUTO_GETTERS; $auto_setters = self::_AUTO_SETTERS; if (parametrable_utils::should_call($name, $auto_getters, $auto_setters, $md)) { $result = parametrable_utils::call($this, $name, $args, $auto_getters, $auto_setters, $md); return true; } return false; } }