Storing option value
This looks pretty good IMO. If you are considering taking these values to the database, make sure you create a separate table for each category. Do not use enum type columns. 

However there are few minor things I noticed that you can refactor.


Initialize $constCacheArray as an array so you can avoid the first 3 lines in getConstants()   
isKeyExist method can be a single line

public static function isKeyExist($key) {
    return (isset(self::getConstants()['_' . $key]);
}


getValue method has similar logic too but for readability's sake you can keep it as it is.
Avoid method calls inside loops. Take $user-&gt;getCountry() out of the foreach and assign it to variable which you will use for comparison.
Also to remove the _s from the keys you can use a regex. If you plan to use string keys for enums (eg: const disabled = 'Disabled';), this will come in handy.

json_decode(preg_replace('/"_([0-9]*)":/i', '"$1":', json_encode($arr)), true)