2012-10-14 11 views
9

Mam metoda, która uprościła wygląda następująco:

class Foo { 

    public function bar($id) { 
     // do stuff using $this, error occurs here 
    } 

} 

Wywołanie to tak działa świetnie:

$foo = new Foo(); 
$foo->bar(1); 

Jednakże, jeśli zgłoszę go przy użyciu call_user_func_array() coś takiego:

call_user_func_array(array("Foo", "bar"), array('id' => 1)); 

które powinien być równe, pojawia się następujący błąd:

Fatal error: Using $this when not in object context in

($this jest niezdefiniowany)

dlaczego tak jest? Czy jest coś, czego mi brakuje? Jak mam to zrobić, aby nadal używać $this w wywołanej metodzie?

Odpowiedz

14

array("Foo", "bar") jest równa Foo::bar(), czyli metody statycznej - to ma sens, ponieważ $foo nigdzie nie jest używany, a tym samym PHP nie może wiedzieć, które instancja w użyciu.

To, czego potrzebujesz, to array($foo, "bar") w celu wywołania metody instancji.

Zobacz listę różnych kalendarzy pod numerem http://php.net/manual/en/language.types.callable.php.


Trzeba także przekazać argumentów tablicy indeksowanej zamiast tablicy asocjacyjnej, tj array(1) zamiast array('id' => 1)

+0

Tylko dla rekordu istnieje druga pomyłka w jego kodzie 'array ('id '=> 1) 'powinien raczej być' tablica (1) 'sądząc po definicji" bar " – Mahn

+0

Hah! Powinienem to przewidzieć, nie sądziłem, że to takie proste. Dzięki za tonę! Jeśli chodzi o twoją edycję: to literówka, napisał ten kod w oknie SO-ask :-). Dzięki jeszcze raz! – Zar

Powiązane problemy