Ir para conteúdo

POWERED BY:

Arquivado

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

Maykel-ctba

Inserção de classes de modo dinâmico (method_exists)

Recommended Posts

Fala galera!

 

Estou criando um CMS particular, e gostaria de automatizar o máximo possível a manutenção de um cliente para outro. Através de um código simples, consegui com que sejam incluidos os arquivos de classe necessários para o funcionamento do sistema:

 

	// * Busca todos os arquivos da pasta de classes
	$diretorioClasse = 'comum/class';
	$arrayClasses = array();
	
	if ($handle = opendir($diretorioClasse))
	{
		while (false !== ($file = readdir($handle)))
		{
			if(strpos($file,".class.php"))
			{
            	include($diretorioClasse."/".$file);
				$arrayClasses[] = str_replace(".class.php","",$file);
        	}
		}
		closedir($handle);
	}

 

Até aqui, beleza. Como podem ver, gerei um array com o nome das classes para que eu possa utilizá-los para gerar um menu (Algumas classes possuem menu e outras não).

 

Porém, estou tentando agora utilizar esse array para chamar alguns métodos nas classes e não estou conseguindo, podem me ajudar?

 

for ($i = 0; $i < count($arrayClasses); $i++)
						{
							$objSideBar.$arrayClasses[$i] = new $arrayClasses[$i]();
							
							if(method_exists($objSideBar.$arrayClasses[$i],"MontaMenu"))
							{
								$objSideBar.$arrayClasses[$i]->MontaMenu();
							}
							
						}

 

 

 

O erro que está dando:

 

 

  • Catchable fatal error: Object of class Backup could not be converted to string in/Applications/XAMPP/xamppfiles/htdocs/sistema/sidebar.php on line 11

 

PS: Backup é o nome de uma das classes. Como é a primeira que é vem do array, está dando problema nela.

 

PS2: O array está imprimindo:

 

 

 

  • Array ( [0] => Backup [1] => Email [2] => Log [3] => MySQL [4] => Secao [5] => Sessao [6] => Usuario )

Compartilhar este post


Link para o post
Compartilhar em outros sites

Oi @Vinicius!

 

A solução parece ser válida. Mas neste caso, eu fico a merce de um problema. Desta maneira, não consigo detectar quais classes tem a função MontaMenu(). E eu não preciso passar parâmetros para a função, aí se eu deixo o segundo atributo em branco, ele dá erro (é obrigatório pelo jeito).

 

@dedas O que seria isso?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom, desta maneira deu certo perfeitamente! Tive que fazer uma verificação antes apenas para ver se a função existe :)

 

if (is_callable(array($arrayClasses[$i],"MontaMenu")))
{
	echo call_user_func_array(array($arrayClasses[$i],"MontaMenu"), array());
}

 

 

Vou dar uma lida sobre o Autoload!

 

@Evandro eu precisava concatenar naquele caso! Até onde sei, o ponto é o caractere da concatenação ;-)

Compartilhar este post


Link para o post
Compartilhar em outros sites
@Evandro eu precisava concatenar naquele caso! Até onde sei, o ponto é o caractere da concatenação ;-)

a partir do momento que você concatena passa a virar uma string, realmente pode ser esse o erro

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Vinicius Ahhh entendi. Pode ser mesmo. O erro tratava de algo assim mesmo, mas eu não sabia converter a string para... função. Não sabia nem se era isso a se fazer, haha.

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Evandro eu precisava concatenar naquele caso! Até onde sei, o ponto é o caractere da concatenação ;-)

Sim é o caractere de concatenação mesmo. O problema, ali, já foi especificado pelo erro:

 

 

Catchable fatal error: Object of class Backup could not be converted to string in/Applications/XAMPP/xamppfiles/htdocs/sistema/sidebar.php on line 11

 

 

 

 

Não foi possível converter uma instância de [inline]Backup[/inline] para string. Isso acontece, primeiramente, porque a classe Backup não implementa o método mágico __toString

 

Segundo, acredito que tenha havido uma interpretação incorreta da precedência dos operadores do PHP. O que pode levar a efeitos colaterais futuramente.

 

Veja, na seguinte linha

$objSideBar.$arrayClasses[$i] = new $arrayClasses[$i]();
a ordem de processamento é a seguinte
  • $arrayClasses[$i]
  • new $arrayClasses[$i]()
  • $arrayClasses[$i] = new $arrayClasses[$i];
  • $objSideBar.$arrayClasses[$i]
Supondo que os valores de [inline]$objSideBar[/inline] e [inline]$arrayClasses[$i][/inline] fossem simplesmente A e B, você acabaria com uma linha assim:
'a'.'b';

O que, obviamente, não faz sentido algum.

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.