PHP - Использование строки для получения константы? [Дубликат]

Отсутствует «extern» в объявлениях / определениях переменной const (только для C ++)

Для людей, прибывающих с C, может показаться неожиданным, что в C ++ глобальные переменные const имеют внутренние (или статические) связь. В C это не так, поскольку все глобальные переменные неявно extern (т.е. когда отсутствует ключевое слово static).

Пример:

// file1.cpp
const int test = 5;    // in C++ same as "static const int test = 5"
int test2 = 5;

// file2.cpp
extern const int test;
extern int test2;

void foo()
{
 int x = test;   // linker error in C++ , no error in C
 int y = test2;  // no problem
}

correct would использовать файл заголовка и включить его в file2.cpp и file1.cpp

extern const int test;
extern int test2;

. В качестве альтернативы можно было бы объявить переменную const в файле file1.cpp с явным extern

59
задан Elnur Abdurrakhimov 27 November 2013 в 22:44
поделиться

3 ответа

120
ответ дан Mads Lee Jensen 27 August 2018 в 15:21
поделиться

Чтобы использовать динамические имена констант в вашем классе, вы можете использовать функцию отражения (с php5):

$thisClass = new ReflectionClass(__CLASS__);
$thisClass->getConstant($constName);

Например: если вы хотите фильтровать только определенные константы (SORT_ *) в классе

class MyClass 
{
    const SORT_RELEVANCE = 1;
    const SORT_STARTDATE = 2;

    const DISTANCE_DEFAULT = 20;

    public static function getAvailableSortDirections()
    {
        $thisClass = new ReflectionClass(__CLASS__);
        $classConstants = array_keys($thisClass->getConstants());

        $sortDirections = [];
        foreach ($classConstants as $constName) {
            if (0 === strpos($constName, 'SORT_')) {
                $sortDirections[] =  $thisClass->getConstant($constName);
            }
        }

        return $sortDirections;
    }
}

var_dump(MyClass::getAvailableSortDirections());

результат:

array (size=2)
  0 => int 1
  1 => int 2
5
ответ дан Dado 27 August 2018 в 15:21
поделиться

И чтобы продемонстрировать, что это тоже работает с константами класса:

class Joshua {
    const SAY_HELLO = "Hello, World";
}

$command = "HELLO";
echo constant("Joshua::SAY_$command");
48
ответ дан Donamite 27 August 2018 в 15:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: