Dan
Dan

Reputation: 4150

PHP Using a variable when calling a static method

I have three classes that all have a static function called 'create'. I would like to call the appropriate function dynamically based on the output from a form, but am having a little trouble with the syntax. Is there anyway to perform this?

$class = $_POST['class'];
$class::create();

Any advice would be greatly appreciated.

Thanks.

Upvotes: 4

Views: 6348

Answers (5)

Pascal MARTIN
Pascal MARTIN

Reputation: 401182

If you are working with PHP 5.2, you can use call_user_func (or call_user_func_array) :

$className = 'A';

call_user_func(array($className, 'method'));

class A {
    public static function method() {
        echo 'Hello, A';
    }
}

Will get you :

Hello, A


The kind of syntax you were using in your question is only possible with PHP >= 5.3 ; see the manual page of Static Keyword, about that :

As of PHP 5.3.0, it's possible to reference the class using a variable. The variable's value can not be a keyword (e.g. self, parent and static).

Upvotes: 8

dnagirl
dnagirl

Reputation: 20446

What you have works as of PHP 5.3.

ps. You should consider cleaning the $_POST['class'] since you cannot be sure what will be in it.

Upvotes: 2

Galen
Galen

Reputation: 30180

use call_user_func

heres an example from php.net

class myclass {
    static function say_hello()
    {
        echo "Hello!\n";
    }
}

$classname = "myclass";

call_user_func(array($classname, 'say_hello'));
call_user_func($classname .'::say_hello'); // As of 5.2.3

$myobject = new myclass();

call_user_func(array($myobject, 'say_hello'));

Upvotes: 1

Seb
Seb

Reputation: 25157

I believe this can only be done since PHP 5.3.0. Check this page and search for $classname::$my_static to see the example.

Upvotes: 0

Ian P
Ian P

Reputation: 12993

I may be misunderstanding what you want, but how about this?

switch ($_POST['ClassType']) {
    case "Class1":
        $class1::create();
        break;
    case "Class2":
        $class2::create();
        break;
    // etc.
}

If that doesn't work, you should look into EVAL (dangerous, be careful.)

Upvotes: -2

Related Questions