Ir para conteúdo

Arquivado

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

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,

Compartilhar este post


Link para o post
Compartilhar em outros 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...

Compartilhar este post


Link para o post
Compartilhar em outros 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

Compartilhar este post


Link para o post
Compartilhar em outros 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

Compartilhar este post


Link para o post
Compartilhar em outros 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í:

 

Compartilhar este post


Link para o post
Compartilhar em outros 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!

Compartilhar este post


Link para o post
Compartilhar em outros 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;

 

 

Compartilhar este post


Link para o post
Compartilhar em outros 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?

Compartilhar este post


Link para o post
Compartilhar em outros sites

  • Conteúdo Similar

    • Por mateus.andriollo
      Boa tarde,
      Tenho alguns campos numéricos q ao fazer uma select gostaria q retornasse uma legenda
       
      exemplo:
      Status: 0=Inativo / 1=Ativo Condição: 1=Funcionando / 2=Em manutenção / 3=Manutenção Interna   
      Seria algo assim, tenho varias tabelas com estes campos... mas tenho q ficar usando replace.
      Existe uma forma de criar uma função para isso? Nem q na função eu tenha que setar nome do campo, ficando assim:
      Legenda('Status',cadastro.status) 
    • Por Luiz Henrique
      Olá pessoas,
       
      Tenho uma classe e dentro dela várias chamadas para métodos de acordo com a necessidade em outra classe (para obter dados DB), como são muitas e vou duplicar os arquivos, para ganhar tempo queria colocar o nome da classe em uma variável porém não funciona.
       
      use Class1; class Class2 { public $className = 'Class1'; ... $dados = $this->className::function(); // não funciona } Era para gerar isso:
      $dados = Class1::function();
      Se eu der um echo $this->$className, ele me retorno o nome da Class1 porém para executar um método dentro da Class1 não vai, diz que a classe Class1 não existe!
      Tem alguma forma de funcionar isso?
       
      Obrigado.
    • Por janir.matheus
      Bom dia,
       
      Preciso de ajuda ajuda para resolver o problema de SIGSEGV, basicamente tennho um zconection dentro de uma classe e recebo erro quando tento acessá-lo. Segue um trecho da classe:
      unit unt_classconexao; {$mode objfpc}{$H+} interface uses Classes, SysUtils, ZConnection, ZDataset; type { tConexao } tConexao = class private public vConector : TZConnection; function Listar_Usuarios:TZReadOnlyQuery; procedure Conectar_Banco; end; implementation { tConexao } function tConexao.Listar_Usuarios: TZReadOnlyQuery; var zrquery : TZReadOnlyQuery; begin Conectar_Banco; try zrquery := TZReadOnlyQuery.Create(nil); zrquery.Connection := vConector; zrquery.SQL.Clear; zrquery.SQL.Text := 'SELECT * from tbl_profissionais'; zrquery.Open; Listar_Usuarios := zrquery; finally end; end; procedure tConexao.Conectar_Banco; begin //vConector := TZConnection.Create(nil); vConector.HostName := 'localhost'; vConector.Port := 3306; vConector.Database := 'Caps'; vConector.Protocol := 'mysql-5'; vConector.User := 'root'; vConector.Password := ''; vConector.Connected := true; end; end. Após isso tento fazer uso dessa classe para popular um DBGrid:
      unit unt_frmprincipal; {$mode objfpc}{$H+} interface uses Classes, SysUtils, DB, Forms, Controls, Graphics, Dialogs, Menus, DBGrids, ZConnection, unt_classconexao; type { Tfrm_principal } Tfrm_principal = class(TForm) DataSource1: TDataSource; DBGrid1: TDBGrid; MainMenu_frmPrincipal: TMainMenu; MenuItem_AplicativoSair: TMenuItem; N1: TMenuItem; MenuItem_AplicativoLogin: TMenuItem; MenuItem_Aplicativo: TMenuItem; procedure MenuItem_AplicativoLoginClick(Sender: TObject); private public vConexao : tConexao; end; var frm_principal: Tfrm_principal; implementation {$R *.lfm} { Tfrm_principal } procedure Tfrm_principal.MenuItem_AplicativoLoginClick(Sender: TObject); begin //vConexao := tConexao.Create; DataSource1.DataSet := vConexao.Listar_Usuarios; end; end. A mensagem de erro que recebo dá a entender que o problema ocorre logo que o zconnection começa a ser configurado, como vocês podem ver pelos trechos comentados eu tentei instanciar o componente também sem sucesso. Não tenho experiencia com POO e tenho certeza que estou cometendo um erro bobo, então peço uma explicação sobre como resolver isso. Agradeço de antemão a quem puder me ajudar.
       
      PS. Estou usando o Lazarus.
    • Por ernestovm
      Bom dia.
      Descobri, depois de muito trabalho, um problema esquisito. Tenho duas imagens que chamam funções JavaScript determinadas. Uma funciona e a outra não. Isso no Firefox. No Chrome as duas funcionam perfeitamente. Alguém conhece alguma gambiarra para fazer o Firefox funcionar? Segue os códigos:
      HTML:
      <img src="images/ic_abrir.png" width="70" height="70" onClick="abre_notificacao(<? echo "'".$us_codigo."','".$item."'"; ?>);" style="cursor:pointer" id="p_imagem-<? echo $item; ?>" name="p_imagem-<? echo $item; ?>">
       <img src="images/ic_excluir.png" width="70" height="70" onClick="excluir_notificacao(<? echo "'".$us_codigo."'"; ?>);" style="cursor:pointer">
      JAVASCRIPT:
      <script type="text/javascript">
          function abre_notificacao(codigo,indice) {
              $("#p_imagem-"+indice).attr("src","images/ic_abrir_ok.png");
              $("#ver-"+indice).css("display", "block");
          }
          function excluir_notificacao(codigo) {
              $.post("excluir_notificacao.php", {codigo: codigo}, function(resposta) {
                  confirm(resposta+" ("+codigo+")");
              });
              location.reload();
          }

      </script>
      A Função abre_notificacao(codigo,indice)  funciona perfeitamente nos dois browsers.
      A Função excluir_notificacao(codigo) só funciona no Chrome.
      Obrigado pela luz
    • Por unset
      Olá, estou começando a usar o twig template e estou com uma dúvida e não encontrei a resposta também não sei se é possível mais espero que seja possível
       
      Bom eu tenho um arquivo com várias funções, como eu faço para chamar essas funções no HTML?
       
      Não funciona assim {{ funcao() }}
×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.