Ir para conteúdo

Arquivado

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

André Wielki

Sobre Orientado a Objeto em PHP

Recommended Posts

Olá, Eu tenho meu arquivo conexao.php com o código abaixo:
$banco_hostname = "localhost";
$banco_usuario="root";
$banco_passwd="";
$banco_nome="banquinho";
$conexao = new mysqli($banco_hostname,$banco_usuario,$banco_passwd,$banco_nome);
Ai no meu arquivo banco.oo.php com as classes (orientado a objeto) eu tenho:
class autenticacao {
    function SignUp($conexao,$nome_post,$email_post,$passwd_post,$k_post,$k) {
        if( (!$nome_post) || (!$email_post) || (!$passwd_post) || (!$k_post) || ($k_post != $k) ){
            header('location:index.php');
        }
        else{
                // VERIFICA SE USUARIO OU EMAIL EXISTE CADASTRADO
                $sql = $conexao->query("SELECT email FROM usuarios WHERE email='$email_post'");
                if ($sql->num_rows==1){
                    echo '<div class="alertaIndexMSG">Ocorreu um erro, este e-mail ja possui um cadastro no banco de dados...</div>';
                }
                else {
                    $acessos=1;
                    $ip=$_SERVER["REMOTE_ADDR"];
                    // INSERE USUARIO AO BANCO DE DADOS
                    $sql = $conexao->prepare("INSERT usuarios SET nome = ?, email = ?, passwd = ?, ip = ?, acessos = ?");
                    $sql->bind_param('ssssi',$nome_post,$email_post,$passwd_post,$ip,$acessos);
                    $sql->execute();
                    $_SESSION["message-signup"]=TRUE;
                    $_SESSION["autenticado"]=$email_post;
                    $_SESSION["usuario"]=$nome_post;
                    header('location:index.php');
                }
        }
    }
}
Ai no meu arquivo index.php eu teria um formulário para o SignUp como exemplo
<html>
<head>
<meta charset="UTF-8">
<title>Titulo</title>
</head>
<body>
 <!-- FORMULARIO DE SIGN UP AQUI -->
</body>
</html>
Ai no meu arquivo que processa o formulário de SignUp eu tenho:
include("conexao.php");
include("banco.oo.php");
if (isset($_POST["signin"])){
    $email=$_POST["email"];
    $passwd=md5($_POST["passwd"]);
    $OO = new autenticacao();
    $OO -> SignIn($conexao,$email,$passwd);
}
Vamos então a minha dúvida/problema:
Eu lembro que antes eu não precisava levar a variavel $conexao sempre em todo $OO -> SignIn($conexao,$email,$passwd); pois a mesma já estava puxando dentro do arquivo banco.oo.php quando inicia a classe acho que como herança da classe todas funções dela acabavam recebendo essa variavel que faz se conectar ao banco quando chama a classe, mas agora nao sei o que fiz errado no banco.oo.php que toda vez que chamo uma função tenho que sair levando essa variavel e recebendo ela lá na função pra se conectar ao banco.
Qual meu erro na orientação a objeto que fiz?
Eu esqueci varias coisas de como trabalhar com php orientado a objeto devido a um tempo parado que fiquei após aprender :/

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara....
esta faltando bastante coisa.

Você não declarou uma visibilidade para sua função.

Você não tem nenhuma propriedade.

O nome do método é SingIn logo o trabalho dele é fazer acesso ao sistema e não validar dados.

Seu método não retorna nada, um dia se você precisar redirecionar para outra página dependendo do usuário você vai começar a ter if's no seu código.

 

SE fosse para passar a conexão para cada objeto o certo seria em um método construtor para ele ficar acessível a todo escopo, e também teria que ser criado um objeto abstrato para criar uma "dependência" nos objetos onde a variável $conexao deveria ser do tipo conexão.

 

A grosso modo você teria que ter algo mais ou menos desse jeito.

$user = new User();
$user->post($_POST);

$login= new Login();
$login->In($user);
//dentro do método In ter métodos que chamam a validação.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se a classe é para autenticação, ela deve herdar de uma classse para acesso ao banco de dados justamente pra evitar ficar passando conexão.

O seu código não está orientado a objetos, falta muito pra isso...

Sugestão:

Criar um arquivo com a classe para conexão do tipo abstract, para que quem quiser conexão tenha que herdar dessa classe e não instância-la.

abstract class Database{
 
 private $db; //Propriedade que recebe a conexão.
 
 public function __construct()
 {
  //aqui obtenha um arquivo de configurações se preferir e faça a conexão com o banco
 }
 
 //Aqui defina métodos para execuções de querys, seja raw ou específicas (insert, update, delete...).






 public function __destruct()
 {
   //aqui você fecha a conexão com o banco de dados
 }
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

Se a classe é para autenticação, ela deve herdar de uma classse para acesso ao banco de dados justamente pra evitar ficar passando conexão.

 

O seu código não está orientado a objetos, falta muito pra isso...

 

Sugestão:

 

Criar um arquivo com a classe para conexão do tipo abstract, para que quem quiser conexão tenha que herdar dessa classe e não instância-la.

 



abstract class Database{
 
 private $db; //Propriedade que recebe a conexão.
 
 public function __construct()
 {
  //aqui obtenha um arquivo de configurações se preferir e faça a conexão com o banco
 }
 
 //Aqui defina métodos para execuções de querys, seja raw ou específicas (insert, update, delete...).






 public function __destruct()
 {
   //aqui você fecha a conexão com o banco de dados
 }
}

DB abstract? Herança???

 

Quer dizer que vc herda a DB a cada model e cria uma nova instancia do PDO

Se voce tiver 10 models vc criou 10 objetos... E se seu model trabalhar com cache vc tem 10 instancias inuteis...

é serio???

Compartilhar este post


Link para o post
Compartilhar em outros sites

DB abstract? Herança???

 

Quer dizer que você herda a DB a cada model e cria uma nova instancia do PDO

Se voce tiver 10 models você criou 10 objetos... E se seu model trabalhar com cache você tem 10 instancias inuteis...

é serio???

 

Quem falou de instância? Quem disse que vai criar 10 objetos? Quem disse que essas 10 models vão ser utilizadas ao mesmo tempo?

 

Uma coisa é herdar outra é instânciar... Acho que você não conheçe a diferença...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Verdade companheiro, eu não sei nada...

Pode conceder seu perdão a este simples vassalo?

 

Só não entendo uma coisa...

Voce escreve esses codigos de sacanagem só aqui no forum, ou você usa eles?

 

. Usar __destruct para terminar a conn - completamente desnecessario ja que o PHP faz isso

. A model vai ter que invocar parent::__construct() e se ela não tiver constructor vai criar a PDO automaticamente

 

Seu conhecimento é bem profundo mesmo

Compartilhar este post


Link para o post
Compartilhar em outros sites

@CL4nG, fazendo isso que você sugere, estamos quebrando o LSP.

 

A maneira correta de fazer é realmente injetando as dependências, ou no método, como o @André está fazendo, como uma propriedade da classe.

 

Embora isso esteja correto, é uma das poucas coisas no código que está de acordo com as boas práticas (isso é uma crítica construtiva, ninguém nasceu sabendo).

 

Sugiro que você dê uma estudada nos princípios SOLID, começando pelo SRP.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Faça com metodo static

 

Classe

<?php
class autenticacao {
public static function SignUp($nome_post,$email_post,$passwd_post,$k_post,$k) {
global $sql;
if( (!$nome_post) || (!$email_post) || (!$passwd_post) || (!$k_post) || ($k_post != $k) ){
header('location:index.php');
}else{
// VERIFICA SE USUARIO OU EMAIL EXISTE CADASTRADO
$sql = $conexao->query("SELECT email FROM usuarios WHERE email='$email_post'");
if ($sql->num_rows==1){
echo '<div class="alertaIndexMSG">Ocorreu um erro, este e-mail ja possui um cadastro no banco de dados...</div>';
}else {
$acessos=1;
$ip=$_SERVER["REMOTE_ADDR"];
// INSERE USUARIO AO BANCO DE DADOS
$sql = $conexao->prepare("INSERT INTO usuarios(nome,email,passwd,ip,acessos) VALUES(?,?,?,?,?)");
$sql->bind_param('1',$nome_post);
$sql->bind_param('2',$email_post);
$sql->bind_param('3',$passwd_post);
$sql->bind_param('4',$ip);
$sql->bind_param('5',$acessos);
$sql->execute();
$_SESSION["message-signup"]=TRUE;
$_SESSION["autenticado"]=$email_post;
$_SESSION["usuario"]=$nome_post;
header('location:index.php');
}
}
}
}
?>

usando

if (isset($_POST["signin"])){
    $email=$_POST["email"];
    $passwd=md5($_POST["passwd"]);
 autenticacao::SignIn($conexao,$email,$passwd);
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Já ouviram falar de Singleton Pattern? Parece que não né!!!


Chega!!! Não tenho tempo pra ficar discutindo com gente que segue modinhas... Eu aprendi a programar e não a seguir modinhas criadas por outros... Sou do tipo que não segue regras bestas...

E ninguém disse que tem que chamar o método construtor da superclasse...

$this->loadDatabase(); já resolve o problema...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Já ouviram falar de Singleton Pattern? Parece que não né!!!

Chega!!! Não tenho tempo pra ficar discutindo com gente que segue modinhas... Eu aprendi a programar e não a seguir modinhas criadas por outros... Sou do tipo que não segue regras bestas...

 

E ninguém disse que tem que chamar o método construtor da superclasse...

 

$this->loadDatabase(); já resolve o problema...

Pelo jeito não gosta de ser corrigido por pessoas mais experientes.

 

 

A maioria que programa em Oo sabe o que é Sigleton e de sua má fama, esta fama veio por causa deste tipo de exemplo:

$this->loadDatabase(); já resolve o problema...

 

e como disse Henrique Barcelos é melhor aplicar a inversão de controle e deixar as instâncias de suas dependências serem injetadas.

 

E se for para usar isso $this->loadDatabase(); use Registry pois sabemos o que está por trás dessa m-e*r.d*a

Compartilhar este post


Link para o post
Compartilhar em outros sites

Já ouviram falar de Singleton Pattern? Parece que não né!!!

Chega!!! Não tenho tempo pra ficar discutindo com gente que segue modinhas... Eu aprendi a programar e não a seguir modinhas criadas por outros... Sou do tipo que não segue regras bestas...

 

E ninguém disse que tem que chamar o método construtor da superclasse...

 

$this->loadDatabase(); já resolve o problema...

Diz que não segue 'regras bestas' e apresenta um Patterrn singleton

Seu singleton consiste em uma classe abstract com um __con. e um __des.

Agora vem com `$this->loadDatabase()`

 

WTF decida-se

Por isso o topico é divertido

Compartilhar este post


Link para o post
Compartilhar em outros sites

Patterrn singleton não é uma regra besta... por isso sigo essa regra...
E se acham que comentários aqui significa o que faço... tá longe de ser...

Eu não estou aqui pra passar meu conhecimento de mão beijada para os outros não... Se eles querem ser bons então eles que encontrem a melhor solução...

Amigo, sou hacker!! Nós não somos de ficar passando receita de bolo ou mostrando como realmente fazemos as coisas...

É bem óbvio que eu não programo assim... Meu nível é elevado, e esse é meu diferencial... Então não vou mostrar meu diferencial pra qualquer um não...

Mas vamos lá noobs.


abstract class DBDriver{

private $database;
private $user;
private $pass;


public function __construct()
{
 //conexão... ou instanciação de um objeto do tipo PDO.
}

//Aqui você pode definir métodos para conexão com vários tipos de banco de dados

}

class DBManager extends DBDriver
{
 

public function insert($table, $dados = array())
{

}

public function select($table, $colunas = '*', $where = '1=1')
{

}

public function update($table, $dados = array(), $where = '1=2')
{

}
}


class Login{

private $db;

public function __construct()
{
     $this->db = new DBManager();
}

public function login($user, $pass)
{
     $result = $this->db->select("usuarios", "username,password", "username = $user");
}
}

Noobs, eu não tenho tempo pra ficar corrigindo erros... vai do jeito que escrevo mesmo...

Compartilhar este post


Link para o post
Compartilhar em outros sites

KKKKK

rapaz, vc é divertidissimo

 

Não é questão de ser hacker ou não, é falta de inteligencia mesmo - vc perde tempo com explicações erroneas... se não quer repassar seu precioso conhecimento, é melhor não perder tempo postando asneiro, pq todo o lixo que vc posta é facilmente refutado.

 

Vc deu sorte que o forum já não é o mesmo a tempos, mas em outra epoca tomaria um ban

Compartilhar este post


Link para o post
Compartilhar em outros sites

#Hacker

 

Até agora não entendi o motivo de declarar a classe DBDriver como abstrata. :pinch:

 

Sendo que no caso acima "Post #13" não há necessidade de coincidir as assinaturas dos métodos em outras classes, é para isso que se declara abstrac em uma classe pai, é forçar que uma classe que herda definida os métodos declarada nela, que no caso a DBDriver.

 

Acho que este #Hacker é estagiário.

 

 

PS.

Eu não estou aqui pra passar meu conhecimento de mão beijada para os outros não... Se eles querem ser bons então eles que encontrem a melhor solução...

Então ainda não conhece o espirito do open source, não sei por qual motivo veio parar no fórum de php!

 

Amigo, sou hacker!! Nós não somos de ficar passando receita de bolo ou mostrando como realmente fazemos as coisas...

Interessante, já fiz parte de uma comunidade e digo que também não é esse o espirito.

 

Ta mais para um Lammer do que para um @Hacker.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Faça com metodo static

Também não. Está mais que errado.

 

@CL4nG, até acredito que você seja um hacker, mas isso tem nada a ver com ter bons skills de programação orientada a objetos. E o contrário também é verdadeiro. Duvido muito que o Martin Fowler ou o Bob Martin saibam como invadir sistemas, como você :thumbsup: .

_______________________________________________

 

@André, embora pareça que não, sign up e sign in são atividades completamente distintas, logo, não deveriam estar na mesma classe.

 

Sign up é uma inserção de informações, com algumas regrinhas a mais (unicidade de nome de usuário/exigências sobre a senha).

 

Sign in envolve autenticação e posterior autorização de usuários.

Compartilhar este post


Link para o post
Compartilhar em outros sites

#Hacker

 

Até agora não entendi o motivo de declarar a classe DBDriver como abstrata. :pinch:

 

Sendo que no caso acima "Post #13" não há necessidade de coincidir as assinaturas dos métodos em outras classes, é para isso que se declara abstrac em uma classe pai, é forçar que uma classe que herda definida os métodos declarada nela, que no caso a DBDriver.

Abstract não é só pra isso!!! Dê uma lida no manual.

PHP 5 introduces abstract classes and methods. Classes defined as abstract may not be instantiated, and any class that contains at least one abstract method must also be abstract. Methods defined as abstract simply declare the method's signature - they cannot define the implementation.

 

http://php.net/abstract

Então ainda não conhece o espirito do open source, não sei por qual motivo veio parar no fórum de php!

Pra noobs não!! Bom achei que aqui não teria somente noobs... Mas como PHP sempre reúne noobs... eu tô caindo fora...

 

Já é a segunda vez que abandono esse forum por causa de noobs que se acham, sem ao menos saber com que tipo de pessoa estão falando...

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ta errado seu exemplo e deixa de mimini cara, cresça!

Pra mim não vai fazer falta, se vai sumir ou não.

 

Aff!!!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Já é a segunda vez que abandono esse forum por causa de noobs que se acham, sem ao menos saber com que tipo de pessoa estão falando...

Não fez falta na 1ª vez e não vai fazer falta na 2ª

E CERTAMENTE não fará falta na 3ª vez

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.