Jump to content
marcelobbt

PHPOO - Forma correta

Recommended Posts

Comecei a aprender PHP por conta própria e estudei diversos materiais. Com o tempo comecei a usar a programação orientada a objetos, ou pelo menos achei que estava usando. De uns tempos para cá, comecei a ficar em dúvida se estaria fazendo da forma correta. Então busquei outros materiais, revi os antigos e veio uma dúvida que não consegui resposta e gostaria de saber se podem me ajudar.

 

Quando pego uma série de registros de um banco de dados, devo coloca-los num único objeto, ou criar um objeto para cada registro?

 

Para clarear minha pergunta segue mais detalhes de como faço até hoje.

Eu utilizo o CodeIgniter e então criei um model chamado CRUD onde obtenho os valores desejados de qualquer tabela do banco de dados, por exemplo, usando a função abaixo:

 

public function SelecionaTodos ($tabela) {
	return $this->db->get($tabela);
}

Até este ponto está tudo num único objeto. Mas vamos dizer que vou trabalhar com os dados da tabela "aluno". Então queria pegar os dados que essa função retorna e jogar na classe Aluno para fazer as rotinas do sistema. Aí que vem a dúvida se devo jogar os valores todos como um array, ou crio um objeto para cada registro retornado, enfim, gostaria de ouvir a opinião dos especialistas ou mais experientes. 

 

Share this post


Link to post
Share on other sites

É melhor ter vários módulos, cada um com sua devida responsabilidade, do que um módulo com várias responsabilidades!

 

Hoje você retorna um array, amanhã precisa retornar um json, vai ficar alterando o CRUD?

É meio obvio que corre o risco de quebrar a aplicação.

 

Você pode resolver isso criando uma classe que faz o intermediação entre o Controller e a Model, que é o Repositorio. Já que CI usa a arquitetura MVC.

 

Em 03/04/2017 at 07:45, marcelobbt disse:

Eu utilizo o CodeIgniter e então criei um model chamado CRUD onde obtenho os valores desejados de qualquer tabela do banco de dados, por exemplo, usando a função abaixo:

Ruim do Ci é isso, ninguém segue um padrão. O que mais vemos é aplicação + pra - do que - pra + com o Ci.

 

Só não faça isso em um repositório.

 

<?php

class UsuarioRepositorio
{

    public function selecionaTodos($tabela) {
        return $this->db->get($tabela);
    }    
    

}

 

Muito menos abstrair algo que já fora abstraído.

Exemplo:

<?php

class UserRepository
{

    public function getAll() {
        return $this->model->all();
    }


}

Erro muito comum que vejo por ai.

Fora as bizarrices de criar pacotes deste pattern e com assinaturas de métodos.

  • +1 1

Share this post


Link to post
Share on other sites

Marcelo, se você esta se referindo a retornar um \PDO::FETCH_ASSOC  ou  \PDO::FETCH_OBJ ou algo correlato, ao meu ver, já que estamos trabalhando com orientação a objetos, faz mais sentido ter uma coleção de objetos do que de arrays, a não ser que você tenha um bom motivo para retornar um array.
 

  • +1 1

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 Paulo Correia
      Tenho uma dúvida, ou acho que estou fazendo errado (rsrsrsrs).

      Seria assim, numa classe que seria a Pai (em arquivo separado) eu teria 
      o construct que faria os setters numas váriaveis private, mais ou menos 
      assim:

      <?

      namespace UmNomeQualquer;

      class Pai {

           protected $_var;

           public function __construct($var) {

               $this->_var = $var;

           }

      }

      ?>

      E numa outra que seria a Filha(o) (em arquivo separado) eu leria esta 
      variável, certo?

      <?

      namespace UmNomeQualquer;

      class Filha extends Pai {

           public function mostra() {

               return $this->_var;

           }

      }

      ?>

      Mas quando eu vou testar dá erro falando que não passei todos os 
      argumentos ao construtor:

      <?

      include "pai.php";
      include "filha.php";

      use Nome\Pai;
      use Nome\Filha;

      $pai = new Pai("123");

      $filha = new Filha();

      echo $filha->mostra();

      ?>

      Mensagem de erro:

      PHP Fatal error:  Uncaught ArgumentCountError: Too few arguments to 
      function Nome\Pai::__construct(), 0 passed in test.php on line 11 and 
      exactly 1 expected in pai.php:8
      Stack trace:
      #0 test.php(11): Nome\Pai->__construct()
      #1 {main}
         thrown in pai.php on line 8

      Onde estou errando??

      Não é para não repetir o código, (DRY), isto não inclui as variáveis??

      Desde já agradeço,

      Paulo
    • By Fábio.info7
      Boa tarde a todos, gostaria de uma ajuda, estou desenvolvendo um pequeno sistema de cadastro de clientes assinastes de um certo pacote de serviços, preciso que ao cadastrar o cliente, automaticamente o sistema grave a data do cadastro e atribui + 30 dias onde esta será a data de vencimento(após os primeiros 30 dias), até aí tudo bem, tudo funcionando, porém preciso também que o sistema liste os clientes em que a data do vencimento está se aproximando(faltando 5 dias para o vencimento), então determinei que o sistema lista os clientes que estão a 5 dias do vencimento, então então peguei a data de cadastro e atribuí + 25 dias, agora que vem o problema, na hora de listar esses clientes cuja data de vencimento se aproxima eu recebo a seguinte mensagem "Warning: Invalid argument supplied for foreach()", sou novo em php OO e não estou conseguindo resolver essa questão, vou deixar aqui a função que criei e a chamada da função também:
       
       
      public function proximosVencimentos(){         //DATA DA ASSINATURA/CADASTRO         $dt_assinatura = $this->assinatura;                  //PEGA A DATA DA ASSINATURA E ACRESCENTA + 30 DIAS (VAI VIRAR A DATA DO VENCIMENTO APÓS 30 DIAS)         $vencimento = date('Y-m-d', strtotime("+30 days" . strtotime($dt_assinatura)));                  //PEGA A DATA DA ASSINATURA E ACRESCENTA + 25 DIAS          $vencimento_proximo = date('Y-m-d', strtotime("+25 days" . strtotime($dt_assinatura)));                                     require 'conexao.php';             $sql = "select * from dados where current_date() between dt_vencimento_proximo = :dt_vencimento_proximo AND dt_vencimento = :dt_vencimento ";             $stmt = $conn->prepare($sql);             $stmt->bindParam(":dt_vencimento_proximo", $vencimento_proximo);             $stmt->bindParam(":dt_vencimento", $vencimento);                                         if($stmt->execute()== TRUE){                 return $stmt->fetchAll(PDO :: FETCH_OBJ);              }else{                 $mensagem = "Não há dados a serem exibidos.";                 return $mensagem;              }        }    
      ABAIXO O TRECHO ONDE EU CHAMO ESSA FUNÇÃO
      foreach ($listadados->proximosVencimentos() as $key => $valor){       echo $valor->nome; }    
    • By junior almeida
      Tenho uma duvida sobre php + orientação a objetos.
      estou desenvolvendo um sistema, na parte de login o usuário entra com os dados de e-mail e senha e um método faz uma consulta no banco para ver se os dados que foi digitados estão corretos
      apos estar correto grava o id em uma sessao e armazeno o objeto gerado da consulta em uma variável usando o método setResultado, na pagina de usuario pego a sessao do id e faço uma consulta no banco passando o id e utilizo o método getResultado para pegar o objeto da consulta que me retorna. ate ai tudo bem mas me gerou uma duvida se outra pessoa fizer um login os dados que estavam armazenados na variável resultados vão ser perdidos ou os dados de variáveis ficam salvos em alguma especie de cookies.
       
      exemplo: pessoa A fez o login seus dados foram setados em uma variável resultado logo em seguida a pessoa B faz o login ela também tem seus dados setados na variável resultado, os dados da pessoa A foi perdido ou ele fica salvo em algum lugar.
       
      não sei se ficou confuso mas se alguém puder me tirar essa duvida.
    • By Misael Silva
      Olá, membros do forum, gostaria de saber de um livro de PHP que ensina-se a desenvolver códigos php de um loja virtual, um e-commerce, ate encontrei esse  livro https://www.thiengo.com.br/e-commerce-com-php-e-mysql, porém descobri que não é orientado a objeto, um ponto que ficou a desejar, vocês tem dicas de outros livros semelhantes? Agradeço!
    • By Will871
      Boa tarde, galera.
      Sou novato no PDO, e estou tendo uma dúvida sobre como receber a variável de conexão do banco de dados em um método.
      Tenho o seguinte código:
       
      banco.php
      <?php try {     $BD_host = "localhost";     $BD_banco = "jacyfash_loja";     $BD_usuario = "root";     $BD_senha = "";     $conn = new PDO("mysql:host=".$BD_host.";dbname=".$BD_banco, $BD_usuario, $BD_senha); } catch (PDOException $i) {     die("Erro: <code>" . $i->getMessage() . "</code>"); } usuario.php
      <?php require_once 'banco.php'; class valida{     function login(){                  }          function cadastro(){         $nome = $_POST['nome'];         $usuario = $_POST['usuario'];         $email = $_POST['email'];         $senha = $_POST['senha'];         $sql = "INSERT INTO cliente(nome, usuario, email, senha) VALUES(:nome, :usuario, :email, :senha)"; //===================================================================================== //Sempre que tento acessar o $conn de dentro de uma function ele retorna erro dizendo que a variável não existe. ( Erro: Undefined variable: conn) //=====================================================================================         $stmt = $conn->prepare($sql);         $stmt->bindParam(':nome', $nome );         $stmt->bindParam(':usuario', $site );         $stmt->bindParam(':email', $email);         $stmt->bindParam(':senha', $senha);     }          function bloqueio(){              } } Já pesquisei muito sobre como fazer isso, mas não consegui nada. Se alguém puder ajudar, agradeço.   ^^
×

Important Information

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