Ir para conteúdo

POWERED BY:

Arquivado

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

Diego Medeiros

[Resolvido] Passar variável dinâmica para classe de importação

Recommended Posts

Olá amigos!

 

Recentemente aderi à Programação Orientada a Objetos e algumas coisas ainda não estão claras para mim. Vamos a um exemplo:

 

Antigamente eu costumava declarar uma variável na página a fim de "pré configurar" um arquivo incluído. Ex:

 

<?php
$totalRegistros = 10;
include("noticias.php");
?>

 

Quando iniciei a POO criei uma classe de sistema contendo uma função de inclusão (substituindo o include) para verificar se o o arquivo existe, se o diretório é válido, etc. Minha classe se chama "sys" e minha função "inclui". Ex:

 

<?php
sys::inclui("noticias.php");
?>

 

O problema é que estou tentando fazer como antes (pré configurar o include) porém o arquivo incluído desta forma não reconhece as variáveis da página. Nota: NÃO POSSO utilizar a variável como parâmetro da função, pois não há um número definido de variáveis e elas costumam mudar de nome dependendo da página. Ex:

 

 

<?php
$totalRegistros = 10;
$mostrarLinks = 1;
$mostrarAutor = 0;

sys::inclui("noticias.php");

?>

 

 

Já tentei passar via uma Array, mas sem sucesso:

 

 

<?php

sys::inclui("noticias.php", array($totalRegistros = 10, $mostrarAutor = 1, $rss = 0));

?>

 

 

Acredito que o caminho é a forma acima, mas mesmo importando este array para dentro da classe, não consigo fazer o arquivo incluído reconhecê-las. Preciso desta solução pois já construí um grande sistema baseado nestes princípios e fica complicado refazer tudo. Alguém poderia me dar uma luz? Obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá, seria legal se você mostrasse uma parte da função "inclui" para ter uma idéia, mas tenta passar o array assim

 

<?php

sys::inclui("noticias.php", array("totalRegistros" => 10, "mostrarAutor" => 1, "rss" => 0));

?>

 

ao invés do jeito como está fazendo. Abraço

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá, seria legal se você mostrasse uma parte da função "inclui" para ter uma idéia, mas tenta passar o array assim

 

<?php

sys::inclui("noticias.php", array("totalRegistros" => 10, "mostrarAutor" => 1, "rss" => 0));

?>

 

ao invés do jeito como está fazendo. Abraço

 

Olá Wolg,

 

Obrigado pelo retorno!

 

Minha dúvida não é nem tanto como passar as variáveis, mas sim fazer o arquivo incluído incorporá-las. Veja:

 

Minha função:

 

static public function inclui($arquivo, $opcoes=0){ 
	if(file_exists($arquivo)){
		if($opcoes!=0){
			//como fazer aqui para o arquivo abaixo importar as vars?	
		}
		include($arquivo);
		}else{
		self::msg(sprintf('Não foi possível importar o arquivo %s',  $arquivo),'alerta');	
		}
}




sys::inclui("noticias.php", array("totalRegistros" => 10, "mostrarAutor" => 1, "rss" => 0));





Compartilhar este post


Link para o post
Compartilhar em outros sites

Ah sim, entendi agora o que quer fazer, me diga, esse arquivos que você quer incluir são classes? (você vai fazer tudo orientado a objetos né?), porque se forem, você pode usar a função __autoload, ela carrega automaticamente todas as classes que for instanciar, se quiser eu ajudo a fazer, mas só funciona com classes, se for pra incluir outros arquivos php que não sejam classes eu te ajudo de outra forma.

Compartilhar este post


Link para o post
Compartilhar em outros sites

if(file_exists($arquivo)){

se o sistema esta sendo feito por você, pq você verifica se o arquivo existe???

esso é tipico de FW e 100% necessário pois muita gente usa e sem ler o manual ai fica facil 'debugar', mas não no seu caso, ja que você sabe o que esta incuindo

 

 

if($opcoes!=0){
    // aqui você vai fazer um loop para pegar os itens da array e setar os valores
}

 

é essa a duvida?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara, você tem que declarar essas variáveis dentro da própria classe onde está a função. Veja um exemplo:

 

class Pessoa() {

public totalRegistros = 10;

public function inclui() {
 //Código para a função inclui
 }

public function acesso() {
 echo $this->totalRegistros;
}

}

 

Agora é o seguinte. Para você utilizar essa variável dentro da classe, você deve chamá-la pelo $this->nomedavariavel.

Você pode também editar a variável fora da classe. Veja:

 

<?php

$pessoa = new Pessoa();

$pessoa->totalRegistros = 15;

?>

 

A partir deste ponto, o valor da variável totalRegistros passou a ser 15.

 

Tenta fazer isso e vê se dá certo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá Diego, tudo bom?

 

Você pode passar as variáveis através de um array no método de inclusão do arquivo, como funciona a maioria dos frameworks.

 

Seria igual um dos códigos que você postou:

 

sys::inclui('noticias.php', array($totalRegistros = 10, $mostrarAutor = 1, $rss = 0));

 

Dentro do método você faz o seguinte:

 

static public function inclui($arquivo, $variaveis = array()))
{ 
if (file_exists($arquivo))
{
	if(count($variaveis) > 0)
	{
		extract($variaveis);
	}
	include($arquivo);
}
else
{
	self::msg(sprintf('Não foi possível importar o arquivo %s', $arquivo),'alerta'); 	
}
}

 

Como você pode ver o segredo está no uso da função extract. ;)

 

Um abraço!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigado pelas respostas, pessoal!

 

@Wolg,

Esse código faz parte de um sistema que estou criando para desenvolvimento rápido, com o mesmo propósito de Frameworks que tem por aí. Assim, o que importo é o arquivo-pai referente a um módulo específico de conteúdo, como notícias, vídeos, etc... Ou seja, não são clsses.

 

 

@criatividade zero,

Estou verificando se o arquivo existe porque estou construindo uma framework que importa módulos de conteúdo, portanto não será utilizado em apenas 1 site mas em dezenas deles (ou seja, módulos dinâmicos). Não quero utilizar um simples include() sem verificação pois dependendo do momento quero que minha classe interrompa o código, gere log de erros ou faça algo a fim de melhorar a segurança, tudo dependento do projeto em questão.

Quanto ao loop para pegar valores eu já fiz isso (usando o foreach), mas o fato é: usar "echo"?? usar "return"?? usar "extract"?? Nenhum deles faz o arquivo importado reconhecer as variáveis (veja o exemplo no fim do post).

 

@vinicvo,

Obrigado pela explicação. Mas o que tento fazer é justamente passar as variáveis sem definí-las, pois se referem a um sistema importação de "módulos" sendo que todos estes "módulos" utilizam a mesma classe. Exemplo:

 

sys::modulos("noticias", $totalRegistros = 10, $mostrarAutor = 1, $rss = 0)

sys::modulos("videos", $comentarios = 0, $autoStart= 1, $wmode = "transparent")

 

@Leozitho,

Acredito que você foi quem chegou mais perto da solução, mas infelizmente não funcionou.

 

Vejam o código completo coma contribuição de Leozitho, talvez fique mais claro:

 

static public function inclui($arquivo, $opcoes){ 
	if(file_exists($arquivo)){
		 if(count($opcoes) > 0)
               {
                       extract($opcoes); //não funciona...
               }
		include($arquivo);

		}else{
			self::msg(sprintf('Não foi possível importar o arquivo %s',  $arquivo),'alerta');	

		}
}





sys::inclui("modulos/noticias/index.php", array($totalRegistros = 10, $mostrarAutor = 1, $rss = 1));





Compartilhar este post


Link para o post
Compartilhar em outros sites

bom, eu tenho um loop que monta um array em um caso semelhante

 

for (...)
{
Sys::$MinhaVar[$var[0]] = $var[1];
}

 

depois chamo a variavel com

Sys::$MinhaVar['item01']

 

 

ou

você poderia criar uma classe de registro para isso

for (...)
{
$this-> SetaValor( $item , $valor );
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Leozitho,

Acredito que você foi quem chegou mais perto da solução, mas infelizmente não funcionou.

 

Que estranho não ter funcionado, pois eu utilizo exatamente dessa forma em um framework que eu desenvolvi e funciona corretamente.

 

Será que é pelo fato do seu método ser estático?

 

Assim que eu tiver tempo dou uma testada aqui pra ver se consigo ajudar.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olha, testei aqui e assim funcionou (apesar de achar bem feio)...

 

<?php
class Sys {
/**
 * 
 * Método que inclui o arquivo
 * @param string $arquivo
 * @param array $argumentos valores a serem passados para o arquivo
 */
static public function inclui($arquivo, array $argumentos = array()) {
	if (file_exists ( $arquivo )) {
		extract ( $argumentos );
		include ($arquivo);

	} else {
		self::msg ( sprintf ( 'Não foi possível importar o arquivo %s', $arquivo ), 'alerta' );

	}
}

}
Sys::inclui ( 'teste.php', array ('primeira' => 10, 'segunda' => 20 ) );
// no arquivo teste.php
<?php
echo 'Primeira - ',$primeira;
echo '<br/>Segunda - ',$segunda;

 

Saída:

Primeira - 10

Segunda - 20

 

Carlos Eduardo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olha, testei aqui e assim funcionou (apesar de achar bem feio)...

 

O que você achou feio Matias? Usar assim de forma estática sem instanciar o objeto ou por passar os dados via array pra depois tranformar em variável?

 

Eu montei um mini framework simples que eu utilizo em alguns projetos pequenos e uso dessa forma. Inclusive eu me inspirei no CodeIgniter para usar dessa forma, que é um framework bastante conhecido e de fácil aprendizado que eu também costumo utilizar.

 

No CodeIgniter seria assim:

 

$data['titulo'] = 'Título da página';
$data['conteudo'] = 'Testando 1234...';

$this->load->view('nome-da-view', $data);

 

E na view seria:

 

<html>
<head>
<title><?php echo $titulo; ?></title>
</head>
<body>
<h1><?php echo $titulo; ?></h1>
<p><?php echo $conteudo; ?></p>
</body>
</html>

 

Um abraço!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Resolvido! :clap: Obrigado a todos!

 

 

@Matias,

Obrigado pela contribuição! Seu exemplo resolveu o problema.

 

@criatividade zero,

Grato pela dica, eu não havia pensado desta forma, certamente faria desta forma se não encontrasse a solução...

 

@Leozitho,

Seu exemplo também estava correto! Na pressa eu não vi que faltou declarar a array() como parâmetro da função, e isso fez o código quebrar.

 

Exatamente como você, estou criando um sistema semelhante ao CodeIgniter, porém mais adaptado às minhas necessidades...

 

Sucesso a todos! :lol:

Compartilhar este post


Link para o post
Compartilhar em outros sites

Resolvido! :clap: Obrigado a todos!

Que bom que resolveu! :D

 

Exatamente como você, estou criando um sistema semelhante ao CodeIgniter, porém mais adaptado às minhas necessidades...

Você faz muito bem em construir seu próprio sistema, certamente você irá aprender muito com essa experiência. ;)

 

Um abraço!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olha, testei aqui e assim funcionou (apesar de achar bem feio)...

 

O que você achou feio Matias? Usar assim de forma estática sem instanciar o objeto ou por passar os dados via array pra depois tranformar em variável?

 

Nenhum nem outro, Leozitho. Acho feio passar valores assim de um arquivo para o outro, via include. Pegando o exemplo que você deu, utilizando o Zend Framework:

 

// Controller
$this->view->titulo = 'Título da página';
$this->view->conteudo = 'Testando 1234...';

Na View:

<html>
<head>
<title><?php echo $this->titulo; ?></title>
</head>
<body>
<h1><?php echo $this->titulo; ?></h1>
<p><?php echo $this->conteudo; ?></p>
</body>
</html>

 

Acho bem mais bonito e elegante assim. Mas acho que é mais uma questão de gosto do que qualquer coisa, então... :)

 

Carlos Eduardo

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.