Как вызвать нестатический метод из статического метода того же класса?

Я работаю над PHP кодом.

Вот пример кода, объясняющего мою проблему:

class Foo {

    public function fun1() {
             echo 'non-static';   
    }
    public static function fun2() {
        echo "static" ;
        //self::fun1();
        //Foo::fun1(); 
    }
}

Как я могу вызвать нестатический метод из статического метода?

Примечание: Обе функции используются по всему сайту, что неизвестно. я не может вносить какие-либо изменения в их статическую/нестатическую природу.

Ответ 1

Вы должны создать новый объект внутри статического метода, чтобы получить доступ к нестатическим методам внутри этого класса:

class Foo {

    public function fun1()
    {
        return 'non-static';
    }

    public static function fun2()
    {
        return (new self)->fun1();
    }
}

echo Foo::fun2();

Результатом будет non-static

Позднее редактирование. Как видно из интереса к передаче переменных в конструктор, я опубликую обновленную версию класса:

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');

Результат будет foo - bar

Ответ 2

Основное отличие состоит в том, что вы можете вызвать статические методы для класса, не создавая экземпляр объекта этого класса. Итак, в своем статическом методе попробуйте

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

Но я не понимаю, как это будет иметь смысл в любом контексте.