tags:

views:

48

answers:

5

I have a class like this

class someclass{
  public function somemethod(){}
}

Now I have an array:

$somearray['someclass']  = new someclass();
$somearray['somemethod'] = 'somemethod';

How can I fire them, I tried the following:

$somearray['someclass']->$somearray['somemethod']();

usign this I get the following error:

Fatal error: Method name must be a string in ......................

Anyone have an idea on how to do this?

A: 

Try $somearray['someclass']->{$somearray['somemethod']}();

Lotus Notes
When I do this I get: Method name must be a string
Saif Bechan
Have you verified that `$somearray['somemethod']` actually contains a string?
thetaiko
I've tested that this works. Just make sure that it is a string.
Lotus Notes
A: 

I cannot reproduce the error with the code provided (As @webbiedave pointed out the syntax is correct).

However you could cast the method name to a string before using it to ensure the method name is a string. This will ensure that even it is a user defined object with a __toString() method, it will be converted into its string representation.

$somearray['someclass']->{(string)$somearray['somemethod']}();
Yacoby
I tried this, and I get another error:Call to a member function () on a non-object
Saif Bechan
@Saif you have an issue elsewhere in your code. This indicates that `$somearray['someclass']` is not set or null. Also `$somearray['somemethod']` is not set or is null.
Yacoby
Yes the fault was somewhere else. Everything is ok now even without the casting. Thanks for your time.
Saif Bechan
+1  A: 

If it doesn't want to work that way (and I agree it should), you could try:

call_user_func(array($somearray['someclass'], $somearray['somemethod']));
dnagirl
+1 Nice method this works also. The code I used worked also, I had some other mistake in my code. But this is definitely a nice alternative.
Saif Bechan
A: 

The following code was tested and seems to be want you want:

<?php


class someclass{
  public function somemethod(){ echo 'test'; }
}


$somearray['someclass']  = new someclass();
$somearray['somemethod'] = 'somemethod';

$somearray['someclass']->{$somearray['somemethod']}();

?>
andreas
A: 

How about this:

foreach (get_class_methods(get_class(new someclass()) as $method) {
    $method();    
}
Gutzofter