Se me ocurre otra variante que hace laburar un poco mas a la base de datos pero que no altera tanto tu código original y emula el efecto que quieres lograr:
Código PHP:
Ver original<?php
//Cargo variables
$nombre = 'Juan';
$telf = 1234567890;
function recuperarMensajedesdeBD($vars)
{
global $conexion;
$field = "mensaje";
foreach($vars as $key => $val)
$field = 'REPLACE('.$field.', \'{$'.$key.'}\', \''.str_replace('\'', '\\\'', $val).'\')';
$consulta = mysql_query("SELECT $field FROM mensajes WHERE id=1", $conexion); return $mensaje[0];
}
Lo que a efectos practicos seria como si se estubiera interpolando, pero si tienes muchas variables en el ambito en que se llama a la funcion (en este caso global) el rendimiento bajaria en picada innesesariamente, por lo tanto podriamos optar por llamarla de forma optimizada asi:
Código PHP:
Ver originalecho recuperarMensajedesdeBD
(array("nombre" => $nombre, "telf"=> $telf));
En el caso anterior, es la base de datos la que realiza el trabajo pesado, y php igual esta haciendo un loop (el foreach), un reemplazo (el de sanear las comillas) y 3 concatenaciones, asi que es razonable pensar en sacarle el trabajo a la bd y pasarselo a php ya que no se va a perder mucho, mas bien se va a ganar en rendimiento.
Código PHP:
Ver originalfunction recuperarMensajedesdeBD($vars)
{
global $conexion;
$consulta = mysql_query("SELECT mensaje FROM mensajes WHERE id=1", $conexion);
foreach($vars as $key => $val)
$mensaje[0] = str_replace('{$'.$key.'}', $val, $mensaje[0]);
return $mensaje[0];
}