Ir para conteúdo

Arquivado

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

masi

PHP - Orientação a Objeto

Recommended Posts

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

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

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

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

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

×

Informação importante

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