Jump to content
ndias

Function Include Class POO

Recommended Posts

eu gostaria de criar uma classe para incluir partes de html dentro do meu layout

 

para isso eu queria fazer algo do tipo:

 

class Includes
{
    private $include;
    
    public function inc()
    {
        include_once "include/".$this->include.".phtml";
    }

}

e <?php echo $include->bottom_master;?> no meu html 

 

como sou novo em orientação a objetos, não estou conseguindo fazer essa simples coisa.

 

poderiam me dizer aonde estou errando, por favor?

 

obrigado,

Share this post


Link to post
Share on other sites
1 hora atrás, Progjunior Daniel disse:

O atributo $includes é private, então você tem que setar ele primeiro. Você está fazendo isso?

Sim!

 

$includes = new Includes;

 

Mas eu queria fazer isso dentro da classe, se possível...

Share this post


Link to post
Share on other sites

Se instanciar a classe Includes

e chamar o método inc(); com um var_dump verá que não retorna nada. Porque?

Porque atributo privado $include não possui valor algum

 

Você pode fazer assim:

<?php
class Includes {

    private $include;

    public function inc($parametro) {
        $this->include = $parametro;
        return ("include/{$this->include}.phtml");

    }
}

Para executar ficaria assim. O método vai buscar na pasta include o arquivo "um_arquivo_qualquer.phtml"

$objeto = new Includes();
include($objeto->inc('um_arquivo_qualquer'));

 

Então há uma forma que acho melhor de executar isso. Pois isso é algo corriqueiro então nada melhor que usar métodos estáticos, e incrementar o método de forma a que ele seja automatizado em encontrar arquivos nem que estejam e diretórios diferentes, veja como fica:

<?php
class Includes {

    public static function inc($file) {
        $Dir = [
            'template',
            'etc'
        ];
        $incGet = null;
        if (isset($file)) {
            foreach ($Dir as $folders) {
                if (!$incGet && file_exists(__DIR__ . '/include/' . $folders . '/' . $file . '.phtml')) {
                    $incGet = true;
                    return (__DIR__ . '/include/' . $folders . '/' . $file . '.phtml');
                }
            }
        }
        if (!$incGet) {
            return (__DIR__ . '/404.phtml');
        }
    }

}

Interessante não? O método entra busca por arquivos nas pastas "template" & "etc" que estão dentro da pasta "include".

Se o arquivo existe retorna ele, caso contrário retorna um outro arquivo para personalizar o erro.

Para executar fica assim, desde-que já tenha dado include no arquivo que contém a classe (Classes estáticas não precisam criar objetos para elas) 

include (Includes::inc('teste'));

Nesse caso a classe se responsabiliza por encontrar o arquivo teste.phtml dentro de includes/template ou em includes/etc

Se entendeu você pode colocar quantas pastas quiser como diretório de busca

  • Gostei 1

Share this post


Link to post
Share on other sites

muito obrigado todos vocês pela ajuda a explicação.

 

estou com uma outra dúvida, caso possam me ajudar de novo, por favor.

 

quero recuperar um valor de um atributo passado dentro de uma classe?

 

Por ex:

 

class Class
{
    public $cor;

    public function cor(){
        if(basename(getcwd()) == 'index'){
            $this->cor = '654321';
        }else{
             $this->cor = '123456';
        }
    }
}

Para recuperar estou tentando fazer assim.

 

$obj = new Class();
echo $obj->cor;

mas o var_dum retorna null

Share this post


Link to post
Share on other sites

@ndias É porque tanto o método como a atributo tem os mesmos nomes.

No caso aí o php está chamando o método, porém o método não retorna nada só preenche o valor de um atributo.

 

Como o atributo é publico você poderia mudar o nome dele, ou mesmo o nome do método, tanto faz. Basta que acione o método para executar, pós então você pode mostrar o atributo.

class MyClass {
    public $cor;

    public function metodoCor() {
        $this->cor = 'blablabla';
    }
}

////////
$obj = new MyClass();
$obj->metodoCor(); // Para preencher o atributo

echo ($obj->cor);

Para o método retornar valor basta que adicione o retorno dentro do método, só que esse não é a ideia quando se usa atributos públicos pois os mesmos podem ser manipulados externamente.

$this->cor = 'blablabla';
return ($this->cor);

 

Para não alongar muito a conversa, de uma lida nessa postagem que fiz, tem vários exemplos de como trabalhar com isso aí:

 

Share this post


Link to post
Share on other sites
19 minutos atrás, Omar~ disse:

@ndias É porque tanto o método como a atributo tem os mesmos nomes.

No caso aí o php está chamando o método, porém o método não retorna nada só preenche o valor de um atributo.

 

Como o atributo é publico você poderia mudar o nome dele, ou mesmo o nome do método, tanto faz. Basta que acione o método para executar, pós então você pode mostrar o atributo.


class MyClass {
    public $cor;

    public function metodoCor() {
        $this->cor = 'blablabla';
    }
}

////////
$obj = new MyClass();
$obj->metodoCor(); // Para preencher o atributo

echo ($obj->cor);

Para o método retornar valor basta que adicione o retorno dentro do método, só que esse não é a ideia quando se usa atributos públicos pois os mesmos podem ser manipulados externamente.


$this->cor = 'blablabla';
return ($this->cor);

 

Para não alongar muito a conversa, de uma lida nessa postagem que fiz, tem vários exemplos de como trabalhar com isso aí:

 

 

Mesmo trocando o nome do método, e adicionando o retorno dentro do método, não rolou! retorna nulo!

Share this post


Link to post
Share on other sites
12 minutos atrás, ndias disse:

 

Mesmo trocando o nome do método, e adicionando o retorno dentro do método, não rolou! retorna nulo!

agora rolou!

 

fiz assim:

 

class MyClass {
    public $cor;

    public function __construct() {
        $this->cor = 'blablabla';
    }

	public function metodoCor() {
        return $this->cor;
    }
}

////////
$obj = new MyClass();
$obj->cor;

 

 

Share this post


Link to post
Share on other sites

agora uma pergunta de leigo: essa classe eu fiz para utilizar em diversas páginas....páginas essas cujo trechos estão separados por includes...

 

no procedural, eu conseguia nas includes recuperar as variáveis da página...

 

na orientação a objetos eu tenho q instanciar a classe em todas includes?

Share this post


Link to post
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

  • Similar Content

    • By sergiosfpereira
      Boa tarde a todos,
       
      Estou estudando MVC e me deparei com a seguinte situação:

      Tenho uma View que precisa receber dados de dois Models diferentes, então no controller desta View eu tenho a função abaixo:
      public function teste($id) { $this->view->a = $this->getOneA($id); $this->loadModel('b'); $this->view->b = $this->model->getOneB($id); $this->view->render('app/teste'); } O cenário acima me retorna o esperado, pega os dados de A e de B e os deixa disponiveis para a View.
       
      Está correto utilizar esse método ?
       
      Se sim, eu deveria carregar o Model "b" no __construct do controller "a"  ou diretamente na função do controller "a" como neste exemplo?
       
      Se não, qual a melhor maneira de obter dados de diferentes Models?
       
      OBS: todos os controllers são filhos do controller principal e todos os models são filhos do model principal.
       
      E me perdoem se eu estiver falando bobagem, como disse, estou aprendendo e a finalidade aqui é didatica e agradeço a quem puder contribuir.
    • By Gustavo Menezes
      Bom Dia amigos, duvidas nesse script...
      id em
      <a class="page-scroll" e resposta para
      <input type="text" mas o valor de resposta esta em outra
      <div class="container" É aqui que me gera a duvida
      get no caso o
      document.getElementById("acao") que vai esta apontando la na
      <a class="page-scroll" vai me retorna com valor
      $( "resposta").val( text ); segue abaixo todo o script em que ponto errei
      $( "a" ).click(function() {                     var text = $( this ).text();                     document.getElementById("acao").id = "01";                 $( "resposta").val( text ); tenho uma duvida em fazer para ele me retorna esse valor na
      <input type="text" que no caso recebo do script e me da o valor
      $( "resposta").val( text ); help ai ✌  
    • By mamotinho
      Olá, estou com dúvidas , eu tenho a seguinte execução 
       
      SELECT SUM(Cash) as soma FROM CashAccount Eu estou querendo pega o resultado desta consulta em PHP
      tipo
       
      $result = $pdo->query("SELECT SUM(Cash) as soma FROM CashAccount"); echo $result; Mais não sei como fazer aparece o mesmo resultado que é exibido quando eu faço a execução da query no SQL, por favor alguém poderia me informar como eu poderia está fazendo.
    • By Alberto Nascimento
      i("calcula").onclick = function(){ Este comando depois que eu atualizei meu servidor para PHP 7.2 não quer mais funcionar.
    • By Alexandre Lex
      Boa tarde pessoal,
       
      Eu sou iniciante em programação PHP, e estou com dificuldades em entender um comportamento. Já dei uma pesquisada pelo fórum mas não encontrei um assunto semelhante. Estou desenvolvendo um projeto onde estou organizando as páginas em pastas separadas.
       
      Ilustração:
       
      -Root
       -css
           - config.css
       -img
           - imagem01.jpg
      - js
           - config.js
       -conteudo01
            - pagina01.php
       -conteudo02
      footer.php
      header.php
      index.php
       
      O que ocorre é que dentro da pasta conteudo01, dentro do arquivo pagina01.php eu uso a função include_once para chamar as páginas principais do root normalmente. Até ai tudo bem, o problema é que o servidor não está carregando os conteudos das demais pastas. Já fiz de tudo e um pouco até o presente momento dentro dos limites do meu conhecimento, mas sem sucesso. Gostaria da ajuda dos senhores para a resolução do meu problema. Sou grato desde já.
       
      Atenciosamente,
       
      Alexandre Figueiredo
×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.