Zjištění názvu konstanty

Školení, která pořádám

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
?>
Jakub Vrána, Řešení problému, 1.7.2011, diskuse: 3 (nové: 0)

Diskuse

Emil:

Hustej mazec..

Franta:

Zvrhlost PHP (a PHP programátorů) mne asi nikdy nepřestane udivovat :-)

Enum.

ikona Jakub Vrána OpenID:

V PHP existuje http://php.net/splenum, ale moc se to nepoužívá.

Vložit komentář

Používejte diakritiku. Vstup se chápe jako čistý text, ale URL budou převedeny na odkazy a PHP kód uzavřený do <?php ?> bude zvýrazněn. Pokud máte dotaz, který nesouvisí s článkem, zkuste raději diskusi o PHP, zde se odpovědi pravděpodobně nedočkáte.

Jméno: URL:

avatar © 2005-2018 Jakub Vrána. Publikované texty můžete přetiskovat pouze se svolením autora. Ukázky kódu smíte používat s uvedením autora a URL tohoto webu bez dalších omezení Creative Commons. Můžeme si tykat. Skripty předpokládají nastavení: magic_quotes_gpc=Off, magic_quotes_runtime=Off, error_reporting=E_ALL & ~E_NOTICE a očekávají předchozí zavolání mysql_set_charset. Skripty by měly být funkční v PHP >= 4.3 a PHP >= 5.0.