CrazyLOL 2 Denunciar post Postado Maio 1, 2014 Comecei a trabalhar com o POO até para deixar algo mais profissional os meus desenvolvimentos, porém eis que surge uma dúvida. Fiz uma classe chamada Clientes, nela coloquei todos os Set e Get das minhas variaveis, fiz 4 funcoes, salvar() ,deletar() e alterar()., load() Até ai ok. Quando eu quero trazer a informação de 1 cliente eu uso a função load no qual popular minhas variaveis para usar o Get, tranquilo. A dúvida surgiu no seguinte caso, preciso mostrar todos os meus clientes para o meu usuário, antes eu simplesmente executava uma Query e utilizava um "while(mysql_fetch_array())" nos dados da minha query e exibia. Porém usando o POO como que posso fazer algo mais dinamico e fácil também para ser utilizado futuramente. Devo criar outra função por exemplo "carregar dados()" e nela fazer a forma que usava anteriormente? Estou meio perdido nisso. Agradeço a ajuda antecipadamente! ;) Compartilhar este post Link para o post Compartilhar em outros sites
cahe7cb 27 Denunciar post Postado Maio 1, 2014 Separe sua classe Clientes em duas interfaces: Uma estática para representar TODA a tabela e outra interface não-estática para representar os dados de um único cliente: <?php class Clientes { // Interface estática public static getAll(){} public static getById(){} // Interface não estática public salvar(){} public deletar(){} public alterar(){} } Usando: $cliente = Clientes::getById(15); $cliente->deletar(); Compartilhar este post Link para o post Compartilhar em outros sites
CrazyLOL 2 Denunciar post Postado Maio 1, 2014 Entendi, nesse caso o getAll eu usaria a forma de antes certo? Usando o while e etc.. Compartilhar este post Link para o post Compartilhar em outros sites
cahe7cb 27 Denunciar post Postado Maio 1, 2014 Sim, ela retornaria uma array de objetos da classe "Clientes", algo como: public static function getAll() { $data = array(); // SELECT * FROM TABLE while($c = mysql_fetch_array()) $data[] = new Clientes($c); return $data; } Compartilhar este post Link para o post Compartilhar em outros sites
CrazyLOL 2 Denunciar post Postado Maio 1, 2014 Eu nunca usei dessa maneira, como ficaria a exibição dos valores depois? Compartilhar este post Link para o post Compartilhar em outros sites
cahe7cb 27 Denunciar post Postado Maio 1, 2014 Nesse caso poderia dar uma descrição mais detalhada de como funciona sua atual classe "Clientes"? Compartilhar este post Link para o post Compartilhar em outros sites
Gabriel Jacinto 74 Denunciar post Postado Maio 1, 2014 Você poderia criar uma classe como uma entidade e uma classe para as funções de armazenamento (Storage/DAO). <?php class Cliente{ //Setters and getters } <?php class ClientesDAO{ public function fetchOne( Cliente $cliente ){} /** * Get all clients * * @return array * @throws AnyException case something fail */ public function fetchAll(){ try{ $stmt = $this->pdo->prepare( sprintf( 'SELECT * FROM `%s`', $this->table ) ); $stmt->execute(); return $stmt->fetchAll(); }catch( \PDOException $e ){ throw new AnyException( $e->getMessage() ); } } //Other storage methods (create, remove, update, etc.) } E por favor, não há necessidade alguma de static methods, nesse caso só serve pra ocupar mais memória. Compartilhar este post Link para o post Compartilhar em outros sites
Williams Duarte 431 Denunciar post Postado Maio 1, 2014 Sugiro estudar este link, antes de sair "programando" em POO. Você poderia criar uma classe como uma entidade e uma classe para as funções de armazenamento (Storage/DAO). E por favor, não há necessidade alguma de static methods, nesse caso só serve pra ocupar mais memória. Mais memória do este padrão oculpa? Compartilhar este post Link para o post Compartilhar em outros sites
Gabriel Jacinto 74 Denunciar post Postado Maio 1, 2014 "Mais memória do este padrão oculpa?" - ficou meio sem sentido isso :lol: Não sei se essa resposta é a que você espera, porque não entendi sua pergunta: Toda vez que usa-se um static method, é criada uma nova instancia da classe, ocupando o espaço na memória de um instancia toda (ou algo assim) e ele tem uma queda de performance. Nesse post eles até fazem uma comparaçãozinha do tempo de execução: Performance of static methods vs. functions (há também o teste com objetos). Meu argumento sobre não usar anterior pode estar errado, me baseei no que li uma vez, mas é fácil saber quando usar static methods e não é dessa maneira que o cache7b usou. Esse aqui é bom artigo sobre isso. Compartilhar este post Link para o post Compartilhar em outros sites
mau rs 37 Denunciar post Postado Maio 2, 2014 Eu nunca usei dessa maneira, como ficaria a exibição dos valores depois? Sim, ela retornaria uma array de objetos da classe "Clientes", algo como: public static function getAll() { $data = array(); // SELECT * FROM TABLE while($c = mysql_fetch_array()) $data[] = new Clientes($c); return $data; } Você faz um foreach, ou se for mais cômodo: while($c = mysql_fetch_array()): // faz um echo aqui mesmo endwhile; Compartilhar este post Link para o post Compartilhar em outros sites
Williams Duarte 431 Denunciar post Postado Maio 2, 2014 Errata: *Mais memória que este padrão ocupa? - No caso o DAO. Antes de continuar, deixo bem claro que prevaleça a opinião do Gabriel Jacinto Estou meio na correia e não vou estender o assunto, aqui tem um bom conteúdo sobre este pattern DAO, um padrão muito utilizado em java, desenvolvi por 02 anos com este pattern, então posso dizer que, só não é mais difícil a manutenção, do que a programação procedural. Praticamente temos que descarregar a VO ou DTO, utilizava VO "gets e setters" em cima da DAO, ocupando memória desnecessária, não vou nem falar do acoplamento que é difícil. Não recomendo a ninguém, mas esta é minha opinião. Vou de MVC class ClienteController extends AppController { public function FunctionName() { try { //Exemplo rápido sem uso de gets e setters $nome = Tools::getValue('Nome'); //filtros $dados = array(); //tabela, campos, etc $this->Cliente->save($dados); } catch (Exception $e) { } } } Compartilhar este post Link para o post Compartilhar em outros sites
Riberry 13 Denunciar post Postado Maio 2, 2014 @Williams Duarte, Posso estar equivocado, mas MVC não interfere em nada nesse quesito. MVC é "apenas" a separação de camadas e responsabilidades. Neste seu exemplo, você usou estático para fazer um "getter dinâmico", acredito. Mas isso também vai causar alto acoplamento e ainda vai deixar sua classe difícil de ser testada. Na minha opinião, mais ainda que utilizando DTO. Com DTO você pode diminuir o acoplamento simplesmente usando dependency injection. Dependendo do caso, nem precisa criar os setters, pode usar o construtor para substituí-los. No seu exemplo também tem um erro de design (talvez pela correira ou por ser apenas um exemplo): A herança mal utilizada. Da maneira que foi escrito, você diz que um controller é uma model, o que é errado, ainda mais se falando de MVC, onde as camadas e responsabilidades estariam sendo misturadas... Aqui mais um texto sobre estáticos: http://stackoverflow.com/questions/7026507/why-are-static-variables-considered-evil Estáticos tem o seu uso, mas acho que a melhor maneira de usá-los, é na criação de outros objetos, do contrário, você mata todo o princípio da orientação à objetos, que é justamente trabalhar com objetos. Corrijam-me caso esteja equivocado. Abs Compartilhar este post Link para o post Compartilhar em outros sites
Williams Duarte 431 Denunciar post Postado Maio 2, 2014 @Riberry na correria aqui, e sem dormir até o momento, faltou algumas coisinhas ali, quando editei você ja tinha respondido. class ClienteController extends AppController { public function FunctionName() { try { } catch (Exception $e) { } } } @Williams Duarte, Neste seu exemplo, você usou estático para fazer um "getter dinâmico", acredito. Mas isso também vai causar alto acoplamento e ainda vai deixar sua classe difícil de ser testada. Na minha opinião, mais ainda que utilizando DTO. Se isso não for dinâmico: public static function getValue($key, $default_value = false) { if (!isset($key) || empty($key) || !is_string($key)) return false; $ret = (isset($_POST[$key]) ? $_POST[$key] : (isset($_GET[$key]) ? $_GET[$key] : $default_value)); if (is_string($ret) === true) $ret = urldecode(preg_replace('/((\%5C0+)|(\%00+))/i', '', urlencode($ret))); return !is_string($ret)? $ret : stripslashes($ret); } E não entendi onde é difícil de ser testada, Bom essa não é dúvida do rapaz, estender o tópico fica completamente desnecessário. Compartilhar este post Link para o post Compartilhar em outros sites
cristianoolv 93 Denunciar post Postado Maio 2, 2014 Para isso eu uso DAO...pesquise sobre, talvez poderá ser util.. Compartilhar este post Link para o post Compartilhar em outros sites
Stratocaster 85 10 Denunciar post Postado Maio 2, 2014 Estude sobre princípios SOLID, por exemplo responsabilidade única Você tem a classe cliente, ela representa um cliente. Porque ela faz acesso ao banco? Compartilhar este post Link para o post Compartilhar em outros sites
CrazyLOL 2 Denunciar post Postado Maio 4, 2014 Agradeço a ajuda de todos, e usando a orientações e dicas de cada um que postou eu reformulei minhas classes. Porém estou encontrando um pequeno problema e aproveitando este topico aberto estarei postando aqui. Separei meus arquivos em 3 partes. 1 -> processo ( Onde coloco as chamadas do meu jquery com o PHP e executo os metodos que as classes possui ) 2 -> Classe onde possuo as informações 3-> Classe DAO onde faz as conexões. Como citei usei as dicas de cada um que foram realizadas aqui, mas encontrei um problema, na hora que eu utilizo o metodo "set" para adicionar algum valor por exemplo "setDescricao" e tento retornar usando o getDescricao ele me retorna vazio, o que eu fiz de errado? Para entender melhor o que fiz abaixo está meus 3 arquivos. processoCategorias.php (Responsavel para fazer a chamada do jquery com as Classes) <?php include_once '../_inc/config.inc.php'; include_once '../_classes/Categorias.php'; include_once '../_classes/CategoriasDAO.php'; include_once '../_classes/Funcoes.php'; $Categorias = new Categorias(); $CategoriasDAO = new CategoriasDAO(); $Funcoes = new Funcoes(); $acao = (int)$_POST['acao']; switch($acao){ //buscar case 1: break; //adicionar case 2: //variaveis $dados_form = $_POST['data']; $dados_php = array(); //variavel para retorno jquery e php $json = array("sucesso" => "","erro" => ""); //converterndo para array os dados do Form parse_str($dados_form,$dados_php); //variavel para controle de erro $erro = ''; //adicionado separadamente os valores foreach ($dados_php as $key => $value){ //verifico se os campos foram preenchidos, se sim já adiciono nos SETTERS $erro .= $key == 'm_departamento' && empty($value) ? 'É necessário informar o departamento desda Categoria<br>' : $Categorias->setCodDepartamento($value); $erro .= $key == 'm_descricao' && empty($value) ? 'É necessário informar o nome desta categoria<br>' : $Categorias->setDescricao($value); $key == 'm_categoria_pai' ? $Categorias->setCodCategoria($value) : NULL; } //se a variavel erro estiver vazia executa as funcoes; if(empty($erro)){ /*//verifico se o cod_categoria foi selecionado se sim então é uma sub_categoria que irei criar if(!empty($Categorias->getCodCategoria())){ //sub categoria }else{ //nova categoria $result = $CategoriasDAO->saveCategoria(); if($result == "TRUE"){ $json['success'] = "Nova categoria criada com sucesso"; }else{ $json['erro'] = $result; } } */ }else{ //retornando erro json $json['erro'] = $erro; //$a = json_encode($json); //echo ($json); echo $Categorias->getDescricao(); } echo $Categorias->getDescricao(); break; } ?> Classe Categorias.php <?php class Categorias{ public $cod_categoria; public $descricao; public $cod_departamento; public $cod_categoria_sub; public function __construct(){ # } public function setCodCategoria($a){ $this->cod_categoria = $a; } public function getCodCategoria(){ return $this->cod_categoria; } public function setCodCategoriaSub($a){ $this->cod_categoria_sub = $a; } public function getCodCategoriaSub(){ return $this->cod_categoria_sub; } public function setDescricao($a){ $this->descricao = $a; } public function getDescricao(){ return $this->descricao; } public function setCodDepartamento($a){ $this->cod_departamento = $a; } public function getCodDepartamento(){ return $this->cod_departamento; } } ?> Minha classe DAO <?php include_once 'Categorias.php'; include_once 'Conexao.php'; class CategoriasDAO extends Conexao{ // public function __construct(){ } /** * Função para retornar todos os dados de uma tabela */ public function loadAll(){ } public function loadId($id){ } public function saveCategoria(Categorias $c){ try{ $Query = "INSERT INTO `categoria` ( `descricao`, `cod_departamento`) VALUES ( '".$c->getDescricao()."', ".$c->getCodDepartamento().");"; $this->setSQL($Query); if($this->mQuery()){ return "TRUE"; }else{ return $this->getErr(); } }catch(Exception $e){ throw $e; } } } ?> Agradeço já ajuda de todos. :) Compartilhar este post Link para o post Compartilhar em outros sites