Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

M4n0w4r

[Resolvido] Chamar um funcão nativa do PHP

Recommended Posts

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

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

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

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.