Ir para conteúdo

POWERED BY:

Arquivado

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

William M

[Resolvido] Chamar uma função a partir de uma String

Recommended Posts

Olá pessoal estou tentando criar uma classe usando reflection para setar valores em variaveis e para recuperar valoes de variaveis

Gostaria de saber como posso chamar uma função/metodo através de uma string.

Eu ja consegui recuparar o nome dos métodos, agora gostaria de executar esses métodos

Segue exemplo:

class Pessoa{
private $nome
private $idade;

public function getNome(){
return $this->nome;
}
public function getIdade(){
return $this->idade;
}
}

public SuperDAO{
public setValores($ob){
$arrayMetodos = obtemMetodos();
foreach ($metodos as metodo){
$obj->metodo();//aqui esta o problema eu consegui pegar os metodos agora como eu chamo ele
//eu tenho o nome da classe, peguei com reflection e tenho o nome do método, mas tudo isso 
//como string, agora eu quero executar
}
}
}

Desde já agradecido

William Miranda

Compartilhar este post


Link para o post
Compartilhar em outros sites

Hi.

 

Então, pra isso, há a função eval() do PHP:

http://www.php.net/manual/pt_BR/function.eval.php

 

Creio que ficaria algo do tipo:

foreach($metodos as metodo){
	eval("$obj->" . $metodo . "()");

Btw, não creio que seja uma boa prática.

Devem haver outros meios de se fazer isso. x)

 

[]'s

Compartilhar este post


Link para o post
Compartilhar em outros sites

Primeiro, esse diacho de código funciona? Imagem Postada

 

Dá uma olhada nele indentado:

 

// Essa primeira classe está certa
class Pessoa {

private $nome;
private $idade;

public function getNome(){
return $this->nome;
}

public function getIdade(){
return $this->idade;
}
}

// Aqui começa a confusão

public SuperDAO {

public setValores($ob) {

$arrayMetodos = obtemMetodos();

foreach($metodos as metodo) {

$obj->metodo();
}
}
}

Aparentemente, setValores() é um método de uma classe chamada SuperDAO. Mas SuperDAO não é uma classe. Cadê a palavra-chave class antes do nome.

 

Ao contrário, tem um public, que define a visibilidade de um método ou propriedade. Classes não tem visibilidade.

 

Continuando, no método setValores(), há o parâmetro $ob. Onde você usa ele? Levando em conta que ele seria o objeto do contexto para a chamada do método, o parâmetro deveria ser $obj, pois é a partir dele que o método está sendo invocado.

 

Descendo mais um pouco, de onde vêm obtemMetodos() é uma função e não um método, logo pressupõe-se que já tenha sido declarada, talvez, através de um arquivo incluído.

 

Pelo que falou, você usaou Reflection para listar os métodos. Então você usou algo relacionado a OO, enfiou o resultado numa função procedural e está usando de volta em outra classe? Santa gambiarra, hein? Imagem Postada

 

Mas vá lá.

 

Pra terminar a leva, você faz:

 

foreach($metodos as metodo) { ...

Cadê o cifrão de metodo (depois do as)

 

Tem MUITA coisa a ser corrigida aí. Eu apontei algumas porque eu mesmo não sei tudo. Mas pelo menos consertando essas o código vai, pelo menos, rodar.

Compartilhar este post


Link para o post
Compartilhar em outros sites

FVOX valeu cara eu não lembrava da função eval.

Btw, não creio que seja uma boa prática.

Devem haver outros meios de se fazer isso. x)

Quanto a boa prática cara, estou tentando fazer um framework de persistencia para mim, sei que tem um monte por aí, mas como sou programador Java estou me aventurando com php, pois é uma linguagem que curto desde a época da faculdade.

A minha intensão é criar um Dao genérico, com injeção de dependencia, ou seja, eu crio uma instancia do classe GenericDAO passando no construtor o (Bean), ou melhor, a classe que só possui get e set, poderia ser um VO também, e com essa classe ele pegar os valores contidos nos getter , os nomes dos atributos e montar as querys basicas (CRUD), acho que vai ficar bem legal, inicialmente vou fazer assim mesmo, só para funcionar depois vou ver se disponibilizo para a galera dá uma melhorada pra mim.

Vou ver se faço um mini PHPHibernate......kkkkkkkkkkkkkkkkkkkkkkkkkk

Quem sab com a ajuda da galera eu não chegue lá

 

IMAGGENS

Primeiro, esse diacho de código funciona?

Quanto ao codigo era ficticio, só para vcs entenderem a muinha necessidade.Fiz na hora aqui dentro do editor de post, nem verifiquei se estva certo.

Mas mesmo assim obrigado Galera.

:clap: :clap: :clap: :clap: :clap: :joia: :joia: :joia: :joia: :joia: Imagem Postada

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não estou certo se essa sua declaração pode ser dada como aviso de Resolvido. Foi?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não estou certo se essa sua declaração pode ser dada como aviso de Resolvido. Foi?

 

RESOLVIDO

Agora está melhor ??

É que eu não consegui mudar o titulo do POST para colocar como Resolvido, mas é bom a gente fazer uma interpretação de texto !

Compartilhar este post


Link para o post
Compartilhar em outros sites

Publicamente, que acredito que é humanamente mais ético, peço desculpas por uma possível, se é que existente, má interpretação quanto ao termo "diacho" que usei e que foi, propositalmente ou não, evidenciado na citação de sua penúltima resposta.

 

Em momento algum tive a intenção empregar um termo coloquialmente corriqueiro, de meu dia-a-dia, de forma ofensiva e muito menos depreciativa.

 

Porém...

 

...mas é bom a gente fazer uma interpretação de texto !

Interpretar texto é mutio diferente de interpretar smileys, que em nada comprovam a veracidade de uma sentença.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Publicamente, que acredito que é humanamente mais ético, peço desculpas por uma possível, se é que existente, má interpretação quanto ao termo "diacho" que usei e que foi, propositalmente ou não, evidenciado na citação de sua penúltima resposta.

 

Em momento algum tive a intenção empregar um termo coloquialmente corriqueiro, de meu dia-a-dia, de forma ofensiva e muito menos depreciativa.

 

Porém...

 

 

...mas é bom a gente fazer uma interpretação de texto !

Interpretar texto é mutio diferente de interpretar smileys, que em nada comprovam a veracidade de uma sentença.

 

Cara não faça tempestade em copo d'agua eu acho que você não leu a minha primeira mensagem toda. Eu havia agradecido ao VFox pois não lembrava da função eval.

Fiz um quote sobre a questão que ele me perguntou de boas praticas, depois agradeci a você, mesmo você não tendo me ajudado em nada, ao contrario só criticou e não prestou atenção no titulo.

Forum é para troca de informações, uns perguntam outros respondem as duvidas requisitadas pelo criador do topico.

Seja mais efetivos em suas resposta, reponda apenas aquilo que será util.

O post ja esta assinado como resolvido agora contenha-se em ficar falando coisas que não são relativas ao post.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Senhores,

 

Como o problema já foi resolvido, estou fechando o tópico.

 

William, caso tenha alguma coisa à dizer, por favor, o faça via MP; Pode ser para mim ou qualquer moderador.

 

Abraços.

 

Imagem Postada

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.