2012-11-13 17 views
12

Sto solo giocando con la funzione call_user_func in PHP e sto ottenendo questo errore quando si esegue questo semplice codice:call_user_func() si aspetta parametro 1 per essere un callback valida

<?php 


class A 
{ 

    public $var; 
    private function printHi() 
    { 

     echo "Hello"; 

    } 

    public function __construct($string) 
    { 
     $this->var = $string; 


    } 

    public function foo() 
    { 

     call_user_func($this->var); 

    } 

} 

$a = new A('printHi'); 
$a->foo(); 


?> 

so che se faccio una funzione esterna alla classe chiamata printHi, funziona bene, ma mi riferisco alla stampa della classe hi e non sono sicuro del motivo per cui "questo" non viene registrato.

+1

'call_user_func_array (array ($ this, 'printHi'), array ($ arg1, $ arg2));' – GBD

risposta

22

$this->var sta valutando a printHi nell'esempio. Tuttavia, quando si chiama un metodo di una classe, è necessario passare la richiamata come un array in cui il primo elemento è l'istanza dell'oggetto e il secondo elemento è il nome della funzione:

call_user_func(array($this, $this->var)); 

Ecco la documentazione su callback valide: http://www.php.net/manual/en/language.types.callable.php

+1

add ', perché è un metodo su $ this, non una funzione globale' e lo farò +1 –

+0

@BobFincheimer Fatto! –

+0

Grazie mille !! Questo ha aiutato e funziona ora. – thed0ctor

1

alternativa alla risposta di Omar, si può anche fare printHi() una funzione statica di classe, in modo da quindi possibile chiamare da call_user_func('A::printHi'), in questo modo:

class A 
{ 

    public $var; 
    public static function printHi() 
    { 

     echo "Hello"; 

    } 

    public function __construct($string) 
    { 
     $this->var = $string; 


    } 

    public function foo() 
    { 

     call_user_func($this->var); 

    } 

} 

$a = new A('A::printHi'); 
$a->foo(); 

Vedi live example

+0

grazie per questa risposta! Lo terrò a mente – thed0ctor

Problemi correlati