tags:

views:

440

answers:

3

Hey all,

I'm wondering if there is a way to call variable functions with namespaces. Basically I'm trying to parse tags and send them to template functions so they can render html`

Here's an Example: (I'm using 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"; }

I keep getting Parse error: syntax error, unexpected T_VARIABLE, expecting T_STRING in ... on line 76

Thanks! Matt

+1  A: 

try with

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

you have some info here

Gabriel Sosa
`::`? Really... Someone either didn't do their homework or simply has no understanding of the difference between a namespace and a static member of a class.
Andrew Moore
Thanks! Only slightly off though! I appreciate the help though.
Matt
@Andrew you were right. I messed it up when is pasted the code. thank you
Gabriel Sosa
+2  A: 

Sure you can, but unfortunately, you need to use call_user_func() to achieve this:

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

Namespaces in PHP are fairly new. I'm sure that in the future, they will fix it so we won't require call_user_func() anymore.

Andrew Moore
Thanks a lot!
Matt
Needed a parameter. Here's how to do that.echo call_user_func('template\\'.$tag, $params);
Matt
+2  A: 

This will also work:

require_once 'template.php';

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