Některé funkce a další obraty PHP vrací hodnotu konstant, např. $_FILES['']['error']
, json_last_error nebo token_get_all. Pro zjištění významu těchto hodnot se dá někdy použít specializovaná funkce (např. token_name v posledním příkladě), někdy z nich chceme udělat lidsky čitelnou hlášku (na to se nejlépe hodí asociativní pole nebo switch), ale někdy by nám úplně stačil název konstanty (např. pro zalogování chyby). To se hodí i u konstant, se kterými program původně nepočítal – např. konstanty JSONu postupně přibývaly.
Vytvořil jsem proto funkci, která dostane hodnotu, prefix konstanty a určí z ní její název. Pracuje i s konstantami tříd a rozhraní, stačí jí předat prefix včetně názvu třídy, např. PDO::PARAM_
nebo jen PDO::
.
<?php /** Zjištění názvu konstanty * @param mixed hodnota konstanty * @param string požadovaný začátek, může obsahovat :: pro konstanty tříd a rozhraní * @param string požadovaný konec * @return string název konstanty nebo false v případě nenalezení * @copyright Jakub Vrána, https://php.vrana.cz/ */ function constant_name($constant, $prefix, $suffix = "") { if (preg_match('~^(.+)::(.*)~', $prefix, $match)) { $reflection = new ReflectionClass($match[1]); $constants = $reflection->getConstants(); $class = "$match[1]::"; $prefix = $match[2]; } else { $constants = get_defined_constants(); $class = ""; } $length = strlen($prefix); foreach ($constants as $key => $val) { if ($constant === $val && !strncmp($key, $prefix, $length) && ($suffix == "" || substr_compare($key, $suffix, -strlen($suffix)) == 0)) { return $class . $key; } } return false; } ?>
Zvažoval jsem kešování get_defined_constants do statické proměnné, ale vzhledem k možnosti vzniku nových konstant jsem to zavrhl. Pro zjištění názvů třídních konstant se používá reflexe. Použití je jednoduché:
<?php echo constant_name(json_last_error(), "JSON_ERROR_") . "\n"; // JSON_ERROR_NONE $column = $pdoStatement->getColumnMeta(0); echo constant_name($column["pdo_type"], "PDO::PARAM_") . "\n"; // PDO::PARAM_STR ?>
Diskuse je zrušena z důvodu spamu.