Me gustaría poder hacer algo como esto:
class ThingIDs
{
const Something = 1;
const AnotherThing = 2;
}
$thing = 'Something';
$id = ThingIDs::$thing;
Esto no funciona. ¿Existe una forma sencilla de hacer algo equivalente? Tenga en cuenta que estoy atrapado con la clase; está en una biblioteca que no puedo reescribir. Estoy escribiendo código que toma argumentos en la línea de comando, y realmente me gustaría que tomara nombres simbólicos en lugar de números de identificación.
php
class-constants
Ben
fuente
fuente
ThingIDs::{$thing}
?Respuestas:
$id = constant("ThingIDs::$thing");
http://php.net/manual/en/function.constant.php
fuente
defined("ThingIDs::$thing");
$id = constant(sprintf('%s::%s', ThingIDs::class, $thing));
use
en la parte superior del archivo y luego usar el::class
método para obtener mágicamente el FQDN, mejora la legibilidad.Usar Reflexión
fuente
Si está utilizando espacios de nombres, debe incluir el espacio de nombres con la clase.
fuente
fuente
Función auxiliar
Puedes usar una función como esta:
Se necesitan dos argumentos:
Si se pasa una instancia de objeto, se infiere su nombre de clase. Si usa PHP 7, puede usar
::class
para pasar el nombre de clase apropiado sin tener que pensar en los espacios de nombres.Ejemplos
fuente
Si tiene una referencia a la clase en sí, puede hacer lo siguiente:
fuente
Mi problema era similar a este tema. Cuando tenga el objeto, pero no el nombre de la clase, puede usar:
fuente