Ir para conteúdo
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

  • Gostei 1

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

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora

  • Conteúdo Similar

    • Por PeeWee
      Estou há horas com um problema no meu código, tenho a pagina Auth.php onde há algumas function que funcionam normalmente, porém a seguinte apresenta problemas.
      function getMemberNivel($nivel) {
              $db_handle = new DBController();
              $query = "Select * from members where nivel = ?";
              $result = $db_handle->runQuery($query, 's', array($nivel));
              return $result;
          }
       
      Na Index.php faço a chamada dela da seguinte forma:
       
      $teste = $auth->getMemberByUsername($nivel);
       
      Ocorre que preciso utilizar a variavel $teste, só que exibe erro como se a variavel nao existisse. As demais variaveis vindas da pagina funcionam normalmente. 
      Espero que algum dos colegas possa me ajudar. 
    • Por ment0r
      Bom dia amigos, tudo bem?
       
      Sou novo em POO e estou com algumas dificuldades.
      Tenho um método de uma classe que é bem simples, ele busca todos os campos da tabela USUARIO (Firebird 2.0) e retorna o array com elas. Só que a não consigo exibi-los com while.
       
      Sem o método eu faria:
      while($array = ibase_fetch_object($query)){ echo $array->ID; echo "<br>"; echo $array->ID; // E por aí vai... } public function selectAllUsers(){ $select = "select * from USUARIO"; $query = ibase_query($select); $array = ibase_fetch_object($query); return $array; } Só que com o array não consigo. Não sei como usar o while com esse array retornado.
       
      Por favor, se alguém puder me ajudar... serei grato.
      Um abraço a todos.
       
    • Por Falcon89
      Antes de minha dúvida, deixo algumas considerações:
      - Estou em nível de aprendizagem, então, talvez a idéia e o script possa parecer bem "amador"
      - A dúvida não corresponde nada a função ou biblioteca Date, o ano utilizado é ficticio, no caso começando no ano de valor 1;
      - A minha dúvida se relaciona a POO, a utilização do Python como ilustração é meramente ilustrativa.

       

      Vamos a dúvida:
      Então eu criei uma classe chamada tempo com atributo ano, e uma classe pessoa com apenas os atributos em questão, a data de nascimento e a idade. O que eu queria que acontecesse, se possivel, era que ao instanciar uma nova pessoa, ela pegasse o ano atual do objeto 'tempo' já instanciado, e jogasse como ano de nascimento, e já setasse a idade da pessoa, subtraindo o ano atual do objeto tempo pela data de nascimento, fica meio confuso para explicar vou tentar dar um exemplo:
      Supondo que criei o 'tempoObj', que tem o valor do 'tempoObj.ano=1', nesse periodo eu instancio um objeto 'pessoaObj', então eu queria que essa pessoa pegasse o valor do ano que no caso seria 1 e jogasse na "pessoaObj.data_nascimento"que agora teria o valor de 1 e ano atual que também seria o mesmo valor e já setando atravéz da subtração a 'pessoaObj.idade' como 0, em tempo de execução, chamando a funçao avancar_ano() umas 3 vezes, o valor do ano atual seria 'tempoObj.ano = 4', nesse caso a idade dessa pessoa teria que seria 3, porem ao passar "tempoObj.ano" como argumento para data de nascimento e ano atual, ele sempre irá passar o mesmo valor para ambos fazendo com que a idade sempre seja 0.
       Nesse caso existe alguma forma que o valor seja passado para o metodo data_nascimento, some ao instanciar a classe pessoa, e o que o valor recebido so ano do tempoObj seja correspondente ao ano que esta armazenado no tempoObj.ano no momento de execução.
      Já tentei varias formas e sempre chego na mesma, se ficou entendido a questão e se é que existe uma solução, alguém tem essa solução? Desde já agradeço, e peço desculpa se não fui tão claro ao apresentar o problema. 
    • Por camargo.2018
      Tou com um erro no meu script e não sei identificar erra pra ele exibir a imagem do usuário mas isso não está acontecendo
       
      Error:

       
      funcao.php:
      function ver_avatar($nick){ include 'str_get_html.php'; $url = "http://pt.clubcooee.com/users/view/".$nick; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 15); curl_setopt($ch, CURLOPT_TIMEOUT, 15); $return = curl_exec($ch); curl_close($ch); $html = str_get_html($return); $res = $html->find('.m33 img'); $imgLink = $res[0]->attr['src']; return $imgLink; } str_get_html.php:
      <?php function str_get_html($str, $lowercase=true, $forceTagsClosed=true, $target_charset = DEFAULT_TARGET_CHARSET, $stripRN=true, $defaultBRText=DEFAULT_BR_TEXT, $defaultSpanText=DEFAULT_SPAN_TEXT) { $dom = new simple_html_dom(null, $lowercase, $forceTagsClosed, $target_charset, $stripRN, $defaultBRText, $defaultSpanText); if (empty($str) || strlen($str) > MAX_FILE_SIZE) { $dom->clear(); return false; } $dom->load($str, $lowercase, $stripRN); return $dom; } ?> menu.php:
      <div class="usr-nav"> <img src="<?php $veavt = ver_avatar($usr); echo $veavt; ?>" class="img-usr"> <p class="name-usr">Nome do Usuário</p> </div>  
      Me Ajudem mas rápido possível pfvrrrr
    • Por camargo.2018
      Não faz upload de jeito nenhum esse e o código que tentei (Pfvr me ajuda :D):
       
      Html:
      <div class="conteudo">     <form enctype="multipart/form-data" action="?pag=upload-programetes" method="POST">     <input type="hidden" name="MAX_FILE_SIZE" value="999999999999999" />     Enviar novos Programetes: <input name="userfile" type="file" />     <input type="submit" value="Enviar arquivo" /> </form></div> Php:
      if($_GET['pag'] == "upload-programetes"){ $upload = upload_programetes($_FILES); echo $upload; } função:
      function upload_programetes($up){ $uploaddir = $_SERVER["DOCUMENT_ROOT"].'/programetes/'; $uploadfile = $uploaddir . basename($up['userfile']['name']); if (move_uploaded_file($up['userfile']['tmp_name'], $uploadfile)) {     return "Arquivo válido e enviado com sucesso.\n"; } else {     return "Possível ataque de upload de arquivo!\n"; } }  
×

Informação importante

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