2009-08-09 9 views
11

Mi chiedo se esiste un modo per chiamare le funzioni variabili con gli spazi dei nomi. Fondamentalmente sto cercando di analizzare i tag e inviarli a funzioni template in modo che possano rendere html`Funzioni variabili con spazi dei nomi in PHP

Ecco un esempio: (sto 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"; } 

continuo a ricevere errore di analisi: errore di sintassi, T_VARIABLE imprevisto, in attesa di T_STRING in ... on line 76

Grazie! Matt

+1

Nizza domanda ...... –

+0

Stai usando il [ * Funzioni variabili *] (http://php.net/manual/en/functions.variable-functions.php) sbagliato, deve essere una variabile, non una stringa e una variabile. – hakre

risposta

5

Certo che puoi, ma purtroppo, è necessario utilizzare call_user_func() per raggiungere questo obiettivo:

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

namespace in PHP sono abbastanza nuovo. Sono sicuro che in futuro lo aggiusteranno, quindi non avremo più bisogno di call_user_func().

+2

necessario un parametro. Ecco come farlo. echo call_user_func ('template \\'. $ Tag, $ params); – Matt

1

provare 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"; } 

avete qualche info here

+0

'::'? Davvero ... Qualcuno non ha fatto i compiti o semplicemente non ha capito la differenza tra un namespace e un membro statico di una classe. –

+0

Grazie! Solo leggermente fuori però! Apprezzo l'aiuto però. – Matt

+0

@Andrew avevi ragione. L'ho incasinato quando viene incollato il codice. grazie –

7

Questo sarà anche funzionare, senza bisogno di call_user_func, basta usare la funzione Variable functionsDocs:

require_once 'template.php'; 

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

Anche questo è più veloce. Vedi documenti php. – Rudie

0

Prova questa

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

$test = new $test2;