How to call non-static method from static method of same class?

后端 未结 3 1559
暗喜
暗喜 2021-01-31 07:36

I am working on PHP code.

Here is the sample code to explain my problem:

class Foo {

    public function fun1() {
             echo \'non-static\';   
         


        
相关标签:
3条回答
  • 2021-01-31 08:07

    Asnwer selcted as correct solves problem. There is a valid use case (Design Pattern) where class with static member function needs to call non-static member function and before that this static members should also instantiate singleton using constructor a constructor.

    Case: For example, I am implementing Swoole HTTP Request event providing it a call-back as a Class with static member. Static Member does two things; it creates Singleton Object of the class by doing initialization in class constructor, and second this static members does is to call a non-static method 'run()' to handle Request (by bridging with Phalcon). Hence, static class without constructor and non-static call will not work for me.

    0 讨论(0)
  • 2021-01-31 08:11

    The main difference would be that you can call static methods for a class without having to instantiate an object of that class. So, in your static method try

    Foo $objInst = new Foo();
    $objInst->fun1();
    

    But I don't see how this would make any sense in any context.

    0 讨论(0)
  • 2021-01-31 08:12

    You must create a new object inside the static method to access non-static methods inside that class:

    class Foo {
    
        public function fun1()
        {
            return 'non-static';
        }
    
        public static function fun2()
        {
            return (new self)->fun1();
        }
    }
    
    echo Foo::fun2();
    

    The result would be non-static

    Later edit: As seen an interest in passing variables to the constructor I will post an updated version of the class:

    class Foo {
    
        private $foo;
        private $bar;
    
        public function __construct($foo, $bar)
        {
            $this->foo = $foo;
            $this->bar = $bar;
        }
    
        public function fun1()
        {
            return $this->foo . ' - ' . $this->bar;
        }
    
        public static function fun2($foo, $bar)
        {
            return (new self($foo, $bar))->fun1();
        }
    }
    
    echo Foo::fun2('foo', 'bar');
    

    The result would be foo - bar

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