ReflectionClass :: getDefaultProperties () и константы класса - PullRequest
1 голос
/ 29 февраля 2012

Я использую Reflection против следующего класса:

class Constant {
    const CONSTANT = 3;
    public $test1 = 'CONSTANT';
    public $test2 = CONSTANT;
}

При использовании ReflectionClass::getDefaultProperties(); я получаю следующее уведомление:

PHP Notice: Use of undefined constant CONSTANT - assumed 'CONSTANT'

в этой строке кода:

$defaultValues = $reflectionClass->getDefaultProperties();

Во-первых, мне интересно, почему я получаю уведомление здесь (я имею в виду, я не могу предвидеть / избежать уведомления, даже если код на 100% правильный)?

И второе, при использованииvar_export($defaultValues[3]), он выводит 'CONSTANT', что является нормальным, потому что он был приведен к строке.

Итак, как мне вывести CONSTANT вместо 'CONSTANT' для $test2 и при этом вывестистрока с разделителями для $test1?

Редактировать: Я получаю CONSTANT для обоих случаев ($test1 и $test2), но из-за этого я не могу различить их.Я хочу знать: это строка или имя константы.

Ответы [ 2 ]

2 голосов
/ 29 февраля 2012

почему я получаю уведомление здесь?

потому что вы имеете в виду self::CONSTANT, но пытались использовать глобальный CONSTANT, например, ваш код предполагает

const CONSTANT = 3;              // global constant

class Constant {
    const CONSTANT = 3;          // class constant
    public $test1 = 'CONSTANT';
    public $test2 = CONSTANT;    // refers to global constant
}

но вы хотели сделать это:

class Constant {
    const CONSTANT = 3;
    public $test1 = 'CONSTANT';
    public $test2 = self::CONSTANT; // self indicated class scope
}

С последним это

$reflectionClass = new ReflectionClass('Constant');
var_dump( $reflectionClass->getDefaultProperties() );

даст

array(2) {
  ["test1"]=>
  string(8) "CONSTANT"
  ["test2"]=>
  int(3)
}

Есть ли способ получить ["test2"] => self::CONSTANTчерез отражение?Нет. Reflection API оценит константу.Если вы хотите self::CONSTANT, вам придется попробовать некоторые из сторонних API статического отражения.

И, очевидно, если вы хотите 'CONSTANT', напишите "'CONSTANT'".

Относительно РЕДАКТИРОВАНИЯ:

Я получаю ПОСТОЯННОЕ для обоих случаев ($ test1 и $ test2), но из-за этого я не могу различить их.Я хочу знать: это строка или имя константы.

$foo = CONSTANT означает присвоить константу значение свойству foo.Это не значит присваивать константу самой.Присваивая значение свойству, оно больше не является постоянным значением.Это изменчиво«Имя константы» представляется в виде строки.Вы можете использовать ReflectionClass::hasConstant, чтобы проверить, является ли эта строка также именем определенной константы в классе, или использовать defined для глобальных констант.

1 голос
/ 29 февраля 2012

Поскольку вы используете CONSTANT для значения $ test2 и не определяете его до того, как оно выдаст ошибку «неопределенная константа». Вы хотите использовать константу класса CONSTANT в качестве значения для открытого $ test2? Затем используйте public $ test2 = self :: CONSTANT. В противном случае определите CONSTANT как константу перед классом.

Обратите внимание, что PHP преобразует все неизвестные константы в виде строк со значением имени неизвестной константы.

...