Jump to content

[Resolvido] OOP (ajuda)


Volans
 Share

Recommended Posts

Boas,

Eu comecei à relativamente pouco tempo a tentar trabalhar com classes e já vi o quão simples elas são e o quão simples tornam o nosso trabalho.

Mas eu tenho um problema... Imaginemos o seguinte:

File template.class.php:

<?php

class Template
{
 function display($tpl_name)
 {
	 $tpl_path = "templates/" . $tpl_name . ".php";

	 if(file_exists($tpl_path))
	 include($tpl_path);
	 else
	 echo 'ERRO: Problema ao inicializar o template. O ficheiro não existe!';
 }
}

$tpl = new Template;
?>

File index.php

<?php

include('template.class.php');

$tpl->display(header);

$tpl->display(content); /* com uma condiçao que não vou meter agora */

$tpl->display(footer);

?>

File content.php

<?php

include('class.template.php');

$tpl->display(inicio_exemplo);

?>

Quando eu chamava o ficheiro class.template.php no content.php ele ia dar erro porque estava a redeclarar a classe... Como é que posso contornar esse erro e fazer com que apenas seja necessário chamar a class.template.php uma única vez?

Cumpz

Link to comment
Share on other sites

Dá-me este erro se eu fizer com o require_once():

Fatal error: Call to a member function display() on a non-object in C:\xampp\htdocs\Templates\inicio.php on line 6

Se utilizar o include():

Fatal error: Cannot redeclare class Template in C:\xampp\htdocs\Includes\class.template.php on line 4

Não há uma maneira de ter que chamar o ficheiro apenas uma vez, num só ficheiro e utilizar depois noutros ficheiros? Tipo interligar os ficheiros... Eu já vi isso em diversos sistemas feitos em PHP mas não sei fazer...

Link to comment
Share on other sites

Regra geral, apenas no index.php incluis (require_once) todas as classes que precisas; isto sem autoload.

Pelo que percebi pelo teu código, queres incluir o ficheiro content.php dentro da class Template. Todos os ficheiros que incluis dentro do método display, ficam limitados ao escopo desse método; ou seja, se quiseres chamar a classe Template, ou a variavel $tpl, deves usar:

$this->display('inicio_exemplo'); // isto pode entrar em recursividade infinita, cuidado!

Seja como for, precisas passar dados dinâmicos para esses templates e uma forma de alcançares isso é (um método bastante usado):

...
function display($tpl_name, $dados = array())
         {
                $tpl_path = "templates/" . $tpl_name . ".php";

                if(file_exists($tpl_path)) {
                   extract($dados);
                   include($tpl_path);
                }
                else
                   echo 'ERRO: Problema ao inicializar o template. O ficheiro não existe!';
         }
...
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.