masi 22 Denunciar post Postado Abril 25, 2014 Olá galera do imaster. Não sei se é certo fazer um tópico com várias questões, mas não vi um porquê de ser errado. Sempre programei de forma procedural, mas resolvi atualizar um sistema meu para orientação a objeto. Eu e grande maioria de estudantes tem dúvidas sobre POO, então, resolvi fazer uma lista interminável pequena de dúvidas que respondidas podem ajudar a todos. Algumas dúvidas é mais uma questão gosto pessoal, mesmo assim, ficarei grato se compartilharem algumas técnicas. - - - Nomenclaturas e organização - - - Nomenclaturas das classes é um problema Digamos que eu tenha a seguinte classe class Cliente_oficina // (essa é uma nomenclatura) { #estrutura# } class Cliente.oficina // (essa é outra nomenclatura) { #estrutura# } class ClientesOficinas // (mais um tipo de nomenclatura) { #estrutura# } A - Existe uma padronização adequada? Devo usar o plural ou singular para classes, metodos , etc? Podem indicar alguma regra de nomenclatura que eu possa usar para todo o meu projeto, não apenas para classes, mas também para os métodos, variáveis, entre outros? -------------------------------------------------------------------------------------------------------------------------------------------------------- 2 - Organizar arquivo... Quando se trata de várias classes, não sei a forma correta de organizar. // Arquivo usuario.class.php // Nesse arquivo só vai existir a classe Usuario, apenas ela e nada mais. class Usuario { #estrutura# } // Arquivo usuario.class.php // Nesse arquivo pode existir várias classes. class Usuario { #estrutura# } class UsuarioRegistro { #estrutura# } A - E agora? Para eu manter as boas práticas no meu projeto, devo ou não devo ter várias classes por arquivo? -------------------------------------------------------------------------------------------------------------------------------------------------------- - - - POO + banco de dados = dor de cabeça (pelo menos para mim) - - - Esse é uns dos meus maiores problemas, cansei de fazer tentativas frustradas :( ... Vamos para primeiro problema: 1 - Estrutura de uma classe para banco de dados. Ok, ok. Tem vários tópicos perdidos por aí falando sobre isso ou coisa semelhante, mas meu problema é mais especifico. :sleep: Essa é uma das minhas classes para bd em mysqli <?php class Database { const HOST = "localhost"; const USER = "root"; const PW = ""; const DATABASE = "sistema"; protected $mysqli; // metodo construtor function Database() // Aqui devo usar o __construct ou o mesmo nome da classe?? { $this->mysqli = new mysqli(self::HOST, self::USER, self::PW, self::DATABASE ); if (mysqli_connect_errno()) { printf("Falha na conexão com o banco de Dados.", mysqli_connect_error()); } } /** * Aqui embaixo está o meu maior problema e motivo principal desse tópico. */ function select($query, $bind) { $select = $this->mysqli->prepare($query); $select->bind_param('s', $bind); $select->execute() } // Supondo que o parametro usado passado para o query é $query = "select senha from usuarios where login = ?"; $bind = "Joao"; $conexao = new Database; $conexao->select($query,$bind); // Beleza, a minha function acima fez a requisição ao BD. } ?> Ok, mas como retornar os dados da consulta? Devo criar uma outra método contendo um while e armazenar o resultado em uma variável? Não tem uma método mais simples? da uma força ae, pf. :grin: Compartilhar este post Link para o post Compartilhar em outros sites
Riberry 13 Denunciar post Postado Abril 25, 2014 Para a primeira pergunta, sobre padrão de nomenclatura: Leia sobre as PSRs 1 e 2: https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-1-basic-coding-standard.md https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-2-coding-style-guide.md Acho que para nome de classes, use sempre UpperCamelCase, com a primeira letra de cada palavra sempre em maiúsculo. Exemplo: class ProgramandoOrientado{} Para funções, use o formato lowerCamelCase, com a inicial da primeira palavra em minúsculo, e nas palavras seguintes, com a inicial em maiúsculo. Exemplo: function fabricarCarro(){} Para padronizar legal, utilize lowerCamelCase para as variáveis também. Referente 'a várias classes por arquivo, prefira colocar cada classe em um arquivo separado, assim pode utilizar o Autoloading sem dor de cabeça. cada arquivo com o mesmo nome da classe. E quanto à última pergunta, acho que tem meios melhores de se fazer isto, mas, nessa tua estrutura, no método select(), logo após o $select->execute(), você deve retornar um $select->fetchAll(): function select($query, $bind) { $select = $this->mysqli->prepare($query); $select->bind_param('s', $bind); $select->execute(); return $select->fetch_assoc(); } Acho a sintaxe do PDO melhor... De qualquer forma, estude o manual do Mysqli no site do PHP. Compartilhar este post Link para o post Compartilhar em outros sites
Marcos Xavier 189 Denunciar post Postado Abril 25, 2014 Uma ótima fonte de consulta http://br.phptherightway.com Compartilhar este post Link para o post Compartilhar em outros sites
masi 22 Denunciar post Postado Abril 25, 2014 Perfeito, era isso mesmo o que eu precisava entender. Obrigado Para fechar aqui function Database() // Aqui devo usar o __construct ou o mesmo nome da classe?? Estou dando umas pesquisada sobre, mas gostaria de ler a sua opinião. :D Compartilhar este post Link para o post Compartilhar em outros sites
Thomas Piedade 21 Denunciar post Postado Abril 25, 2014 Use __construct, O propósito dele é esse; Compartilhar este post Link para o post Compartilhar em outros sites
Gabriel Jacinto 74 Denunciar post Postado Abril 25, 2014 Sobre a conexão, estude alguns patterns que podem te ajudar, como o AbstractFactory. Do jeito que você está fazendo, quebra uma regra do princípio S.O.L.I.D.: OCP: Repare que se você quiser se conectar outro banco de dados, você vai ter que abrir a classe e editá-la.Quanto à nomenclatura, Riberry já disse sobre PSR 1 e 2. E outra coisa: estude sobre encapsulamento e visibilidade: function select($query, $bind) //PÃÃÃÃÃ - ERRADO E sim, não se usa mais o nome da classe em um método para informar que deve ser usado quando houver uma instância, e sim __construct. Compartilhar este post Link para o post Compartilhar em outros sites
Riberry 13 Denunciar post Postado Abril 25, 2014 O nome da classe como construtor é padrão de outras linguagens, como o Java por exemplo. use o __construct() para este propósito. Aliás, vi que você deu um print em caso de erro na conexão, mas nunca retorne nada no método construtor. Como o próprio nome do método diz, ele é um construtor e deve ser usado somente para isto, para construir sua classe. Aproveitando o gancho do Gabriel, estude bastante, mesmo, sobre os tópicos: - Encapsulamento; - Abstração; - Princípios SOLID; Linksrecomendados: Aborda OOP em geral: http://forum.imasters.com.br/topic/392735-php-orientado-a-objetos/ http://pla.net.br/categoria/oop/ SOLID: http://robsoncastilho.com.br/tag/solid/ http://brizeno.wordpress.com/2011/12/28/design-de-software-introducao/ http://brizeno.wordpress.com/category/design-de-software/solid/ Compartilhar este post Link para o post Compartilhar em outros sites