Это поздний вклад, но есть действительный случай для кастинга json_decode
с (array)
.
Рассмотрим следующее:
$jsondata = '';
$arr = json_decode($jsondata, true);
foreach ($arr as $k=>$v){
echo $v; // etc.
}
Если $jsondata
когда-либо будет возвращено как пустая строка (как, по моему опыту, часто), json_decode
вернет NULL
, что приведет к ошибке Предупреждение: неверный аргумент указан для foreach () в строке 3 . Вы можете добавить строку кода if / then или троичного оператора, но IMO чище просто изменить строку 2 на ...
$arr = (array) json_decode($jsondata,true);
... если вы не json_decode
используете одновременно миллионы больших массивов, и в этом случае, как указывает @ TCB13, производительность может ухудшиться.
В общем, нельзя. Может быть любое количество констант с одинаковым значением. Если вы знаете класс, который объявил константу, вы можете найти все общедоступные статические поля и посмотреть, есть ли какие-либо со значением 0, но не более того. С другой стороны, этого может быть достаточно для вас - не так ли? Если так ...
public string FindConstantName<T>(Type containingType, T value)
{
EqualityComparer<T> comparer = EqualityComparer<T>.Default;
foreach (FieldInfo field in containingType.GetFields
(BindingFlags.Static | BindingFlags.Public))
{
if (field.FieldType == typeof(T) &&
comparer.Equals(value, (T) field.GetValue(null)))
{
return field.Name; // There could be others, of course...
}
}
return null; // Or throw an exception
}
Вместо этого вас могут заинтересовать Enums, которые можно программно преобразовать из имени в значение и наоборот.
Вы не сможете сделайте это, поскольку константы заменяются во время компиляции их буквальными значениями.
Другими словами, компилятор принимает это:
class Foo
{
uint someField = ERR_OK;
}
и превращает это в следующее:
class Foo
{
uint someField = 0;
}
Я предлагаю вам использовать перечисление для представления вашей константы.
Или
string ReturnConstant(uint val)
{
if(val == 0x00000000)
return "ERR_OK";
else
return null;
}
Самый простой способ - перейти на использование перечисления
Я не думаю, что вы можете сделать это детерминированным образом. Что, если существует несколько констант с одинаковым значением?