How do I dynamically invoke a class method in PHP?

后端 未结 9 1022
时光取名叫无心
时光取名叫无心 2020-12-08 01:52

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 st

相关标签:
9条回答
  • 2020-12-08 02:19

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

    0 讨论(0)
  • 2020-12-08 02:27

    This may be useful as a substitute

    class ReferenceContainer {
    
        function __construct(CallbackContainer $callbackContainer) {
    
            //Alternatively you can have no parameters in this constructor and create a new instance of CallbackContainer and invoke the callback in the same manner        
            //var_dump($this->callbackContainer);
            $data = 'This is how you parse a class by reference';
            $callbackContainer->myCallback($data);
    
        }
    
    }
    
    class CallbackContainer {
    
        function __construct() {}
    
        function myCallback($data) {
    
            echo $data."\n";
    
        }
    
    }
    
    $callbackContainer = new CallbackContainer();
    $doItContainer = new ReferenceContainer($callbackContainer);
    
    0 讨论(0)
  • 2020-12-08 02:31

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

    //  Non static call
    call_user_func( array( $obj, 'method' ) );
    
    //  Static calls
    call_user_func( array( 'ClassName', 'method' ) );
    call_user_func( 'ClassName::method' ); // (As of PHP 5.2.3)
    
    0 讨论(0)
  • 2020-12-08 02:31

    You mean like this?

    <?php
    
    class A {
        function test() {
            print 'test';
        }
    }
    
    $function = 'test';
    
    // method 1
    A::$function();
    
    // method 2
    $a = new A;    
    $a->$function();
    
    ?>
    
    0 讨论(0)
  • 2020-12-08 02:31

    As of PHP7, you use an array-like way:

    // Static call only
    [TestClass::class, $methodName](...$args);
    
    // Dynamic call, static or non-static doesn't matter
    $instance = new TestClass;
    [$instance, $methodName](...$args);
    

    Just replace the class name with TestClass, the method name with $methodName and the method arguments with ...$args. Note that, in the later case, it doesn't matter that the method is static or non-static; PHP will call it automatically.

    0 讨论(0)
  • 2020-12-08 02:33
    call_user_func(array($object, 'methodName'));
    

    For more details, see the php callback documentation.

    0 讨论(0)
提交回复
热议问题