Constantes dentro de una cadena de texto

Buscaba hoy la manera de resolver esto:

Del mismo modo que puedo utilizar variables dentro de una cadena de texto:

<?php
	$nombre = "Manolo";
	$alias = "El del bombo";
	echo "Me llamo $nombre ($alias)";

//	Bien: Devuelve 'Me llamo Manolo (El del bombo)'
?>

Hasta donde yo sé, no es posible hacer nada parecido con las constantes:

<?php
	define("NOMBRE", "Manolo");
	define("ALIAS", "El del bombo");
	echo "Me llamo NOMBRE (ALIAS)";

//	Mal: Devuelve 'Me llamo NOMBRE (ALIAS)'
?>

El único modo posible sería este:

<?php
	echo "Me llamo ".NOMBRE ."(".ALIAS.")";

//	Bien: Devuelve 'Me llamo Manolo (El del bombo)'
?>

Pero a mi siempre me resultó bastante incómoda esta sintaxis:

”texto ”.$variable_o_CONSTANTE.” siguiente texto”

Así que hoy decidí apartar un poco de tiempo para buscar un modo de incluir constantes dentro de una cadena de texto con misma libertad que tengo cuando uso variables. Y creo que lo encontré :)

Para empezar, define() no es la única manera de definir una constante. En php.net he visto que las constantes se pueden definir dentro de clases, y que lo hacen con una sintaxis un poco diferente:

<?php
	class constantes
	{
	const NOMBRE = "Manolo";
	const ALIAS = "El del bombo";
	}
?>

Y a estas constantes puedes llamarlas así:

<?php echo constantes::NOMBRE; ?>

Hasta ahí, estupendo, pero el problema viene cuando quiero llamar a la constante desde una instancia:

<?php
	$c = new constantes();
	echo "Me llamo $c::NOMBRE ($c::ALIAS)";

//	Mal: Devuelve 'Me llamo ()'
?>

Tirando de Google, encontré en cristalab.com una solución que me ha parecido elegante. Ellos publicaron en marzo de 2007 el artículo Cómo usar y acceder a constantes en clases de PHP y en él proponían añadir una función privada que permitiera llamar a cualquiera de esas constantes. La cosa queda así

<?php
	class constantes
	{
	const NOMBRE = "Manolo";
	const ALIAS = "El del bombo";

	private function __get($name)
		{
		if(defined("self::$name"))
			{
			return constant("self::$name");
			}
		trigger_error("$name isn't defined");
		}
	}
?>

De modo que ahora ya puedo hacer esto:

<?php
	$c = new constantes();
	echo "Me llamo $c->NOMBRE ($c->ALIAS)";

//	Bien: Devuelve 'Me llamo Manolo (El del bombo)'
?>

Acerca de esta entrada

Libros en Amazon.es:
Sobre informática | Sobre PHP | Sobre CSS | Sobre javaScript