Odniesienie do wewnętrznej metody z metody dodanej dynamicznie

0

Cześć, wszystkim, mam taki kod:

Klasa:

class MyClass {
  function addMethod($nazwa, $metoda){
    $this->{$nazwa} = $metoda;
  }

  public function __call($nazwa, $a){
    return call_user_func($this->{$nazwa}, $a);
  }

  public function funkcja_wewnetrzna(){
    return 'HELLO';
  }
}

Kod:

$my = new MyClass();

$nowa_metoda = function($a){
  return funkcja_wewnetrzna();
};

$my -> addMethod("test", $nowa_metoda);

echo $my->{"test"}();

W jaki sposób mogę się odnieść dynamicznie dodaną metodą "test" do "funkcja_wewnetrzna"? Powyższy kod zwraca:

Call to undefined function funkcja_wewnetrzna()
4

Próbujesz w funkcji anonimowej uruchomić metodę która jest w klasie. Nie da się.
Zrób funkcja_wewnetrzna jako statystyczną i odpal MyClass::funkcja_wewnetrzna() wtedy zadziała. (ale to jest static, bez instancji obiektu itp).

2

A ja bym powiedział by nie robić w ten sposób w ogóle. Nie wiem jaki probelm chcesz rozwiązać, ale może są na to lepsze metody.

2

Jeśli chcesz po prostu się odnieść do różnych funkcji po nazwie, to możesz to zrobić tak:

<?php

$functions = [
  'greeting' => function (): void {
    echo "Welcome friend! " . $argument;
  },

  'bye' => function (): void {
    echo "Bye!";
  },

  'inspect' => function (): void {
    var_dump($argument);
  }
];

$name = 'greeting'; // albo 'bye', albo 'inspect'
$function = $functions[$name];
$function();

To byłby najlepszy sposób żeby to zrobic.

Jeśli jednak bardzo chcesz zrobić to w sposób w który podałeś, to nie możesz zawołać funkcja_wewnetrzna bez klasy (bo to jest funkcja w klasie). Musisz ją wywołać na jakimś obiekcie, np tak:

<?php

class MyClass
{
    function addMethod($nazwa, $metoda)
    {
        $this->$nazwa = Closure::bind($metoda, $this);
    }

    public function __call($nazwa, $a)
    {
        return call_user_func($this->$nazwa, $a);
    }

    public function funkcja_wewnetrzna()
    {
        return 'HELLO';
    }
}

$my = new MyClass();

$my->addMethod("test", function ($a) {
    return $this->funkcja_wewnetrzna();
});

echo $my->{"test"}(2);

Przy czym to rozwiązanie jest słabe, bo np nie jesteś w stanie z zrobić żeby funkcja_wewnetrzna() była prywatna, więc bardzo odradzałbym Ci takie podejście. Najlepiej by było gdybyś napisał co chcesz osiągnąć.

1 użytkowników online, w tym zalogowanych: 0, gości: 1