tags:

views:

1911

answers:

5

How can I dynamically invoke a class method in PHP? The class method is not static. It appears that

call_user_func(...)

only works with static functions?

Thanks.

+1  A: 
call_user_func(array($object, 'methodName'));

For more details, see the php callback documentation.

Neil Williams
+10  A: 

It works both ways - you need to use the right syntax

//  Non static call
call_user_func( array( $obj, 'method' ) );

//  Static call
call_user_func( array( 'ClassName', 'method' ) );
Peter Bailey
+4  A: 

You mean like this?

<?php

class A {
    function test() {
        print 'test';
    }
}

$function = 'test';

// method 1
A::$function();

// method 2
$a = new A;    
$a->$function();

?>
yjerem
+3  A: 

$class = 'foo'; $method = 'bar'; $static = 'blah';

$class->$method() and $class::$static() are faster then call_user_func_array() so try to use them unless you don't know how many arguments your going to be passing to the method.

David
A: 

EDIT: I just worked out what you were trying to ask... ah well.. will leave my comments in anyway. You can substitute names of classes and methods with variables if you like..(but you are crazy) - nick


To call a function from within a class you can do it one of two ways...

Either you can create an instance of the class, and then call it. e.g.:

$bla = new Blahh_class();
$bla->do_something();

or... you can call the function statically.. i.e. with no instance of the class. e.g.:

Blahh_class::do_something()

of course you do need to declare that your function is static:

class Blahh_class {   
    public static function do_something(){
        echo 'I am doing something';
    }
}

If a class is not defined as static, then you must create an instance of the object.. (so the object needs a constructor) e.g.:

class Blahh_class {
    $some_value;

    public function __construct($data) {
        $this->$some_value = $data;
    }

    public function do_something() {
         echo $this->some_value;
    }
}

The important thing to remember is that static class functions can not use $this as there is no instance of the class. (this is one of the reasons why they go much faster.)

Bingy