Sobre Orientado a Objeto em PHP – php mysql orientação-a-objetos

Pergunta:


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?

Autor da pergunta André Silveira Machado

Resposta :

Você pode passar a conexão apenas uma vez, na instanciação da classe, e guardá-la numa propriedade. Algo assim:

// Nomes de classe costumam ter iniciais maiúsculas
class Autenticacao {

    // Propriedade
    private $conexao;

    // Construtor
    function Autenticacao($conexao) {
        $this->conexao = $conexao;
    }

    // Exemplo de uso em um método qualquer
    function dados($sql) {
        return $this->conexao->query($sql);
    }
}

// Instanciação e uso
$auth = new Autenticacao($conexao);
$auth->dados("SELECT 1");

TL;DR

Métodos de classe estão sujeitos às restrições de escopo tal como funções. Para que um recurso no escopo global, externo, funcione no escopo local, do método, você tem que globalizar a variável (não faça isso!) ou injetar por meio de um parâqmetro.


Não vou entrar no mérito de que o que você tem codificado não tem nada a a ver com Orientação a Objetos, então, me atendo unicamente ao problema que você demonstrou, sugiro a você ler sobre Escopo de Variáveis.

Métodos de uma classe são funções, não adianta ninguém tentar argumentar. E se são funções, estão sujeitos às “limitações” (entre aspas pois não e uma limitação de fato) de escopo, local e global.

Muito provavelmente “antes funcionava” por não haver uma classe envolvida ou de alguma forma você localizava (não no sentido de encontrar) o escopo da variável $conexao.

Você quase fez certo ao injetar a instância da conexão na classe ao invés de usar a palavra-chave global ou o array superglobal $GLOBALS. Você errou quanto ao onde que, ao invés de ter sido no método, deveria ter sido no construtor da classe, atribuindo à uma propriedade, assim este ficaria disponível para todos os métodos da classe sem a necessidade de injetar toda hora, em cada método.

Fonte

Related Posts:

Qual a diferença entre AppCompatActivity e Activity? – android android-activity
Pergunta: Qual a diferença da AppCompatActivity para Activity ? A partir de qual versão a AppCompatActivity foi adicionada ao Android? Autor da pergunta Luhhh A diferença reside ...
Como abreviar palavras em PHP? – php string
Pergunta: Possuo informações comuns como nome de pessoas e endereços, e preciso que elas contenham no máximo 30 caracteres sem cortar palavras. Exemplo: 'Avenida Natalino João Brescansin' ...
Qual é a finalidade de um parêntese vazio numa declaração Lambda? – c# expressões-lambda característica-linguagem
Pergunta: Criei um exemplo de uma declaração Lambda sem argumentos, entretanto, estou com duvidas referente a omissão do parêntese vazio () na declaração. Veja o exemplo: class ...
Boas práticas para URI em API RESTful – api rest restful
Pergunta: Estou com dúvida em relação às URIs de alguns recursos da api que estou desenvolvendo. Tenho os recursos projetos e atividades com relação 1-N, ...
Dúvidas sobre a integração do MySQL com Java – java mysql netbeans
Pergunta: Estou criando um sistema no NetBeans, utilizando a linguagem Java e o banco de dados MySQL. Escrevi o seguinte código para realizar a conexão ...
Qual é a finalidade da pasta Model do framework Inphinit? – php inphinit
Pergunta: No Inphinit micro-framework existe a pasta Model que fica dentro da pasta application, e nela é onde ficam as classes, mas eu estou muito ...
Uso do ‘@’ em variáveis – javascript typescript coffeescript
Pergunta: Vejo em algumas linguagens que compilam para javascript, como TypeScript e CoffeeScript, o uso do @ em variáveis, como também, casos em que o ...
Qual tamanho máximo um arquivo JSON pode ter? – json arquivo
Pergunta: Vou dar um exemplo para conseguir explicar minha duvida: Preciso recuperar informação de imagens vindas de uma API, esse banco de imagens me retorna JSON's ...
O que é Teste de Regressão? – terminologia engenharia-de-software testes
Pergunta: Na matéria de Teste de Software o professor abordou um termo chamado Teste de Regressão, isto dentro da disciplina de teste de software. Sendo ...
O que é um construtor da linguagem? – php característica-linguagem
Pergunta: Em PHP, já li e ouvi várias vezes a respeito dos Construtores da Linguagem. Os casos que sempre ouvi falar deles foi em casos ...
Função intrínseca para converter numérico para string – cobol
Pergunta: Estou a tentar saber se existe alguma função intrínseca do COBOL para converter um data numérico para string sem precisar usar a cláusula REDEFINES: ( ...
Porque usar implements? – java android
Pergunta: Qual a diferença entre usar btn.setOnClickListener(new OnClickListener() { e public class MainActivity extends Activity implements OnClickListener{ Estive fazendo um curso de Android e meu professor falou que ...
O que é XHTML e quando deve ser usado? – html xml xhtml
Pergunta: O que eu sei é que o XHTML precisa ser XML válido. Isso implica, por exemplo, que todas as tags precisam ser fechadas. Por ...
Uma placa aceleradora de vídeo pode melhorar o desempenho não-gráfico? [fechada] – desempenho
Pergunta: Para desenvolver em Ruby on Rails, eu utilizo aqui uma máquina virtual do VirtualBox com Ubuntu Server 14.04 sem interface gráfica instalada. Recentemente descobri uma ...
Concat() VS Union() – c# .net
Pergunta: Qual a diferença entre Concat() e Union() ? Quando usar Concat() e quando usar Union() ? Somente pode ser usado em list ? ...

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *