2009-08-09 14 views
11

Me pregunto si hay una forma de llamar funciones variables con espacios de nombres. Básicamente estoy tratando de analizar las etiquetas y enviarlas a las funciones de plantilla para que puedan rendir html`Funciones de variables con espacios de nombres en PHP

He aquí un ejemplo: (estoy usando PHP 5,3)

// Main php file 
require_once 'template.php'; 
foreach (array("javascript","script","css") as $tag) { 
    echo template\$tag(); 
} 

// template.php 
namespace template; 

function javascript() { return "Hello from javascript"; } 
function css() { return "Hello from css"; } 
function script() { return "Hello from script"; } 

me siguen dando Error de análisis: error de sintaxis, inesperado T_VARIABLE, esperando T_STRING en ... en línea 76

¡Gracias! Matt

+1

Niza pregunta ...... –

+0

Usted está utilizando el [ * Funciones variables *] (http://php.net/manual/en/functions.variable-functions.php) mal, necesita ser una variable, no una cadena y variable. – hakre

Respuesta

5

Claro que puedes, pero, por desgracia, es necesario utilizar call_user_func() para lograrlo:

require_once 'template.php'; 
foreach (array("javascript","script","css") as $tag) { 
    echo call_user_func('template\\'.$tag); 
} 

espacios de nombres en PHP son bastante nuevo. Estoy seguro de que en el futuro, lo arreglarán para que ya no necesitemos call_user_func().

+2

Se necesita un parámetro. He aquí cómo hacer eso. echo call_user_func ('template \\'. $ Tag, $ params); – Matt

1

tratar con

// Main php file 
require_once 'template.php'; 
foreach (array("javascript","script","css") as $tag) { 
    call_user_func("template\\$tag"); // As of PHP 5.3.0 
} 

// template.php 
namespace template; 

function javascript() { return "Hello from javascript"; } 
function css() { return "Hello from css"; } 
function script() { return "Hello from script"; } 

usted tiene alguna información here

+0

'::'? Realmente ... Alguien no hizo su tarea o simplemente no entiende la diferencia entre un espacio de nombres y un miembro estático de una clase. –

+0

¡Gracias! ¡Solo un poco alejado! Agradezco la ayuda sin embargo. – Matt

+0

@Andrew tenías razón. Lo arruiné cuando pegué el código. gracias –

7

Esto también funciona, no hay necesidad de call_user_func, sólo tiene que utilizar la función de Variable functionsDocs:

require_once 'template.php'; 

$ns = 'template'; 
foreach (array('javascript', 'script', 'css') as $tag) { 
    $ns_func = $ns . '\\' . $tag; 
    echo $ns_func(); 
} 
+0

Esto también es más rápido. Ver documentos php. – Rudie

0

probar este

$p = 'login'; 
namespace App\login; 
$test2 = '\App\\'.$p.'\\MyClass'; 

$test = new $test2; 
Cuestiones relacionadas