M4n0w4r 0 Denunciar post Postado Fevereiro 24, 2010 Olá galera do bem :) Gostaria de passar uma função nativa do PHP como parâmetro de outra função, e essa função nativa não deve ser executada na chamada da outra função e sim no seu escopo. chamaFuncao (is_int ("Olá")); // A função "is_int" não pode ser chamada agora function chamaFuncao ($funcao) { if ($funcao) { // Agora sim chama a função echo "Ok !"; } else { echo "Too Bad :("; } } Com os meus conhecimentos consigo apenas com funções de usuários: function e_numero ($entrada) { if (! is_int ($entrada)) return false; return true; } function chamaFuncao ($funcao, $parametros) { if (! call_user_func ($funcao, $parametros)) return false; // Agora sim está chamando no escopo local return true; } chamaFuncao ("e_numero", "Olá :)") or exit ("Too Bad :("); echo "Ta tudo bem agora :)"; Vlwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww Compartilhar este post Link para o post Compartilhar em outros sites
Matias Rezende 50 Denunciar post Postado Fevereiro 24, 2010 Olha, não entendi qual a utilidade disto, mas olha só... <?php function chamaFuncao($funcao, $argumentos) { if(!call_user_func($funcao, $argumentos)) return false; else return true; } // true var_dump(chamaFuncao ('is_array', array('teste','teste2'))); // false var_dump(chamaFuncao ('is_array', 'não array')); Funcionou perfeitamente, apesar de, como eu disse, não entender a utilidade. Carlos Eduardo Compartilhar este post Link para o post Compartilhar em outros sites
João Batista Neto 448 Denunciar post Postado Fevereiro 24, 2010 Apenas completando, Ao definir o nome de uma função à uma variável você poderá chamá-la como função: $teste = 'is_int'; var_dump( $teste( 10 ) ); //bool(true) No seu caso você poderia simplesmente passar esse nome de função como o Carlos disse no tópico anterior. Além da função call_user_func_array existe a call_user_func onde você em vez de passar os parâmetros como uma matriz você os passa como parâmetros da call_user_func: function executa( $funcao , $valor ){ return call_user_func( $funcao , $valor ); } var_dump( executa( 'is_int' , 10 ) ); //bool(true) No PHP 5.3 existe uma nova possibilidade que são as Closures: $teste = function( $valor ){ var_dump( $valor ); }; $teste( 10 ); //int(10) Com elas, você pode passar diretamente uma função anônima para outra função: function executa( $funcao , $valor ){ $funcao( $valor ); } executa( function( $valor ){ var_dump( $valor ); } , 10 ); //int(10) Existe também a possibilidade de executar um objeto como função no 5.3, utilizando o método mágico __invoke: class Funcao { public function __invoke( $valor ){ var_dump( $valor ); } } $teste = new Funcao(); $teste( 10 ); E assim você pode passar o objeto para a função que irá executá-lo: class Funcao { private $nome; public function __construct( $nome ){ $this->nome = $nome; } public function __invoke( $valor ){ echo 'O objeto com nome "' , $this->nome , '" está sendo executado como função com o valor: ' , $valor , PHP_EOL; return $valor; } } function executa( $funcao , $valor ){ return call_user_func( $funcao , $valor ); } $teste = new Funcao( 'Meu Objeto' ); var_dump( executa( $teste , 10 ) ); A saída: O objeto com nome "Meu Objeto" está sendo executado como função com o valor: 10 int(10) Compartilhar este post Link para o post Compartilhar em outros sites
M4n0w4r 0 Denunciar post Postado Fevereiro 25, 2010 Muito obrigado pelas respostas, minda dúvida foi sanada :) Compartilhar este post Link para o post Compartilhar em outros sites