2009-08-09 3 views
11

Zastanawiam się, czy istnieje sposób wywoływania funkcji zmiennych z przestrzeniami nazw. Zasadniczo próbuję analizować tagi i wysłać je do funkcji szablonu, aby mogli uczynić html`Funkcje zmiennych z przestrzeniami nazw w PHP

Oto przykład: (używam 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"; } 

Wciąż dostaję błąd Parse: błąd składni, nieoczekiwany T_VARIABLE, oczekiwanie na T_STRING w ... w linii 76

Dzięki! Matt

+1

Nicea pytanie ...... –

+0

Używasz [ * Zmienne funkcje *] (http://php.net/manual/en/functions.variable-functions.php) źle, musi to być zmienna, a nie ciąg i zmienna. – hakre

Odpowiedz

5

pewno można, ale niestety, trzeba użyć call_user_func() do osiągnięcia tego celu:

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

Przestrzenie nazw w PHP są dość nowy. Jestem pewien, że w przyszłości to naprawią, więc nie będziemy już wymagać call_user_func().

+2

Potrzebowałem parametru. Oto jak to zrobić. echo call_user_func ("szablon \\". $ Tag, $ params); – Matt

1

spróbuj

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

masz jakieś info here

+0

'::'? Naprawdę ... Ktoś albo nie odrabiał pracy domowej, albo po prostu nie rozumiał różnicy między przestrzenią nazw a statycznym członkiem klasy. –

+0

Dzięki! Tylko nieznacznie off! Doceniam jednak pomoc. – Matt

+0

@Andrew miałeś rację. Zepsułem to, gdy wkleiłem kod. dziękuję –

7

To będzie także działać, nie ma potrzeby call_user_func, wystarczy użyć Variable functionsDocs cechę:

require_once 'template.php'; 

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

Jest to również szybsze. Zobacz dokumentację php. – Rudie

0

Spróbuj

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

$test = new $test2;