PHP Using a variable when calling a static method

后端 未结 5 614
故里飘歌
故里飘歌 2021-01-14 01:55

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 hav

相关标签:
5条回答
  • 2021-01-14 02:29

    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).

    0 讨论(0)
  • 2021-01-14 02:29

    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.

    0 讨论(0)
  • 2021-01-14 02:31

    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.)

    0 讨论(0)
  • 2021-01-14 02:37

    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.

    0 讨论(0)
  • 2021-01-14 02:48

    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'));
    
    0 讨论(0)
提交回复
热议问题