Ir para conteúdo

POWERED BY:

Arquivado

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

Cassio Talle

[Resolvido] Acessar função dinamicamente

Recommended Posts

Olá gostaria de saber como eu posso acessar o uma função dinâmicamente.

 

Como é feito com o com uma string

 

$nome_da_string = "xpto";  
$$nome_da_string = "teste";  
echo $xpto; // Retorna teste;

 

Agora como eu faria isso com uma função ou método.

 

Eu suponho que pra função funcionaria mais ou menos assim...

 

function teste1(){
  echo "moestre isso";
}
$nome_da_funcao = "teste1";
$$nome_da_funcao();

 

Alguém saberia me dizer como eu faço isso? tanto pra função quanto pra método de um objeto?

 

Obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá gostaria de saber como eu posso acessar o uma função dinâmicamente.

 

Bom amigo, o PHP é uma linguagem dinâmica, e como tal possui várias formas de fazer isso que você precisa.

Como vou mostrar todas as formas vou usar para a primeira etapa as duas funções abaixo:

 

function par( $valor ){
    printf( "O número %s é par\n" , $valor );
}

function impar( $valor ){
    printf( "%s é impar\n" , $valor );
}

Agora a primeira forma (é a que você quase conseguiu implementar):

printf( "Primeira forma de chamar uma função dinamicamente\n" );
for ( $i = 0 , $t = 10 ; $i < $t ; $i++ ){
    $funcao = ( ( $i % 2) == 0 ) ? "par" : "impar";

    $funcao( $i );
}

A saída será:

Primeira forma de chamar uma função dinamicamente
O número 0 é par
1 é impar
O número 2 é par
3 é impar
O número 4 é par
5 é impar
O número 6 é par
7 é impar
O número 8 é par
9 é impar

A segunda forma é:

printf( "Segunda forma de chamar uma função dinamicamente\n" );
for ( $i = 0 , $t = 10 ; $i < $t ; $i++ ){
    $funcao = ( ( $i % 2) == 0 ) ? "par" : "impar";

    call_user_func( $funcao , $i );
}

Com call_user_func() você chama uma função e passa em seguida todos os argumentos para ela

call_user_func( "funcao" , "arg1" , "arg2" , "arg3" );

Porém, existem alguns casos em que não é possível determinar o número de argumentos para passar para uma função, nesses casos usa-se call_user_func_array()

printf( "Terceira forma de chamar uma função dinamicamente\n" );
for ( $i = 0 , $t = 10 ; $i < $t ; $i++ ){
    $funcao = ( ( $i % 2) == 0 ) ? "par" : "impar";

    call_user_func_array( $funcao , array( $i ) );
}

A diferença de call_user_func_array está apenas na forma de passar os argumentos para a função, no call_user_func_array você passa uma matriz em vez de passar todos os argumentos separados por virgula.

Além de chamar funções dinamicamente, o PHP permite também chamar classes dinamicamente, classes e seus métodos. Para os próximos exemplos usarei as duas classes abaixo:

 

class Exemplo {
    public function par( $valor ){
        printf( "Exemplo: O número %s é par\n" , $valor );
    }

    public function impar( $valor ){
        printf( "Exemplo: %s é impar\n" , $valor );
    }
}

class Teste {
    public function par( $valor ){
        printf( "Isso é um teste: O número %s é par\n" , $valor );
    }

    public function impar( $valor ){
        printf( "Isso é um teste: %s é impar\n" , $valor );
    }
}

Para chamar classes dinamicamente você faz exatamente igual se fosse chamar uma função:

printf( "Usando a primeira forma para chamar uma classe e método dinamicamente\n" );
for ( $i = 0 , $t = 10 ; $i < $t ; $i++ ){
    $classe = $i < 5 ? "Exemplo" : "Teste";
    $metodo = ( ( $i % 2 ) == 0 ) ? "par" : "impar";

    $teste = new $classe();
    $teste->$metodo( $i );
}

A saída será:

 

Exemplo: O número 0 é par
Exemplo: 1 é impar
Exemplo: O número 2 é par
Exemplo: 3 é impar
Exemplo: O número 4 é par
Isso é um teste: 5 é impar
Isso é um teste: O número 6 é par
Isso é um teste: 7 é impar
Isso é um teste: O número 8 é par
Isso é um teste: 9 é impar

Já em call_user_func e call_user_func_array existe uma pequena diferença. Por se tratar de um método de uma classe, você deve passar para call_user_func o nome da classe também:

 

call_user_func( array( "Classe" , "metodo" ) , "arg1" , "arg2" , "arg3" );
call_user_func_array( array( "Classe" , "metodo" ) , array( "arg1" , "arg2" , "arg3" ) );

Usando call_user_func:

printf( "Usando a segunda forma para chamar uma classe e método dinamicamente\n" );
for ( $i = 0 , $t = 10 ; $i < $t ; $i++ ){
    $classe = $i < 5 ? "Exemplo" : "Teste";
    $metodo = ( ( $i % 2 ) == 0 ) ? "par" : "impar";

    call_user_func( array( $classe , $metodo ) , $i );
}

E call_user_func_array:

printf( "Usando a segunda forma para chamar uma classe e método dinamicamente\n" );
for ( $i = 0 , $t = 10 ; $i < $t ; $i++ ){
    $classe = $i < 5 ? "Exemplo" : "Teste";
    $metodo = ( ( $i % 2 ) == 0 ) ? "par" : "impar";

    call_user_func( array( $classe , $metodo ) , $i );
}

Bom, é isso..

Compartilhar este post


Link para o post
Compartilhar em outros sites

Posso reabrir a questão aqui?

 

em termos de desempenho. é melhor usar call_user_func | call_user_func_array ou chamar a função ,ou o método,

como $obj->$method() | Classe::$method().. ?

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.