/ / ReflectionClass :: getDefaultProperties () y constantes de clase - php, reflection, php-5.3

ReflectionClass :: getDefaultProperties () y constantes de clase - php, reflection, php-5.3

Estoy usando Reflexión contra la siguiente clase:

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

Cuando usas ReflectionClass::getDefaultProperties(); Recibo el siguiente aviso:

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

en esta línea de código:

$defaultValues = $reflectionClass->getDefaultProperties();

Primero, me pregunto por qué recibo el aviso aquí (quiero decir, no puedo anticipar / evitar el aviso aunque el código sea 100% correcto).

Y segundo, cuando se usa var_export($defaultValues[3]), da salida "CONSTANT" que es normal porque ha sido fundido a la cadena.

Entonces, ¿cómo puedo dar salida CONSTANT en lugar de "CONSTANT" para $test2 y todavía la salida de una cadena delimitada por comillas para $test1?

Editar: yo obtengo CONSTANT para ambos casos ($test1 y $test2) pero debido a eso no puedo diferenciar entre ellos. Quiero poder saber: eso es una cadena, o ese es el nombre de una constante.

Respuestas

2 para la respuesta № 1

¿Por qué recibo el aviso aquí?

porque te refieres self::CONSTANT pero trató de usar global CONSTANT, p.ej. su código asume

const CONSTANT = 3;              // global constant

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

pero querías hacer esto

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

Con este último, este

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

daré

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

¿Hay alguna manera de obtener ["test2"] => self::CONSTANT a través de la reflexión? No. La API de Reflexión evaluará la constante. Si tu quieres self::CONSTANT tendría que probar algunas de las API de reflexión estática de terceros.

Y obviamente, si quieres. "CONSTANT", escribir ""CONSTANT"".

Respecto a EDITAR:

Me sale CONSTANTE para ambos casos ($ test1 y $ test2), pero debido a eso no puedo diferenciarlos. Quiero saber: eso es una cadena, o ese es el nombre de una constante.

$foo = CONSTANT significa asignar la constante valor a la propiedad foo. No significa asignar la constante misma. Al asignar el valor a una propiedad, ya no es un valor constante. Es mutable. El "nombre de una constante" se representa como una cadena. Puede usar ReflectionClass::hasConstant para comprobar si esa cadena también es el nombre de una constante definida en la clase o el uso defined para constantes globales.


1 para la respuesta № 2

Ya que usa CONSTANT para el valor de $ test2y no lo defina antes de que arroje el error "constante indefinida". ¿Desea utilizar la constante de clase CONSTANTE como valor para el público $ test2? Luego use public $ test2 = self :: CONSTANT. De lo contrario, defina CONSTANTE como constante antes de la clase.

Tenga en cuenta que PHP convierte todas las constantes desconocidas como cadenas con el valor del nombre de la constante desconocida.