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.