Ir para conteúdo

Arquivado

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

Wesley Balestrini

"Visibilidade e Encapsulamento"

Recommended Posts

Olá pessoal!

Estava assistindo a uma vídeo aula(colocarei ela logo abaixo) , sobre oop no php. Ele me mostrou dois exemplos de como fazer conexão com MySQL, usando class, sendo uma deixando as propriedades publicas e outra privado. Sobre a minha ótica, não mudou nada, só aumentou o código não consegui "ver" a real funcionalidade disso! Mas sei que deve haver, se não ninguém usaria! Segue os dois exemplos:

Exemplo 1 (publico)

//Class

class ConexaoMysql {

      public $servidor;
      public $usuario;
      public $senha;
      public $BancoDeDados;

      public function conectar(){
            mysql_connect($this->servidor, $this->usuario, $this->senha)or die (mysql_error());      
      }

      public function selecionarDB(){
            mysql_select_db($this->BancoDeDados) or die (mysql_error());    
      }
}
//página do php

require("ConexaoMysql.class.php");

$conexao = new ConexaoMysql;
$conexao->servidor = 'localhost';
$conexao->usuario = 'root';
$conexao->senha = '';
$conexao->BancoDeDados = 'Banco';
$conexao->conectar();
$conexao->selecionarDB();


Até aqui, ele diz que da certo( e dá), mas também diz que não é recomendado usar deste jeito, pois "alguém pode modificar os valores das propriedades", (algo próximo á isso). Eu li este conceito em vários lugares(aqui no fórum por exemplo) mas ainda não o entendi! No vídeo, ele faz o seguinte:

Exemplo 2 (protegido)

//Class

class ConexaoMysql {

      protected $servidor;
      protected $usuario;
      protected $senha;
      protected $BancoDeDados;

      public function__construct($servidor, $usuario, $senha, $BancoDeDados){
            $this->servidor     =  $servidor;
            $this->usuario      = $usuario;
            $this->senha        = $senha;
            $this->BancoDeDados = $BancoDeDados;    
      }

      public function conectar(){
            mysql_connect($this->servidor, $this->usuario, $this->senha)or die (mysql_error());      
      }

      public function selecionarDB(){
            mysql_select_db($this->BancoDeDados) or die (mysql_error());    
      }
}
//pagina no php
require("ConexaoMysql.class.php");

$conexao = new ConexaoMysql('localhost', 'root', '', 'Banco');
$conexao->conectar();
$conexao->selecionarDB();


Minha duvida é: O que mudou, além da maneira de fazer é claro! Por que fazer de um jeito ou de outro? Por que o segundo é melhor?

 

Vídeo:

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

OO é conceitual

quando vc diz

 

 

usando class

vc já perde tudo, em OO não existe class e sim objetos.

 

O conceito aplicado nesse exemplo é que:

Propriedades são características do objeto

enquanto métodos criam ações sobre essas características.

um exemplo seria um get e um set.

 

Um propriedades não se define, métodos definem elas.

e o uso do protected eu fico com a mesma resposta do cristianoolv

Compartilhar este post


Link para o post
Compartilhar em outros sites

PHP disponibiliza 3 visibilidades: Public, protected e Private.

 

O public, você pode acessar o método/propriedade na própria classe, na classe filha e fora da classe.

O protected, você pode acessar o método/propriedade na própria classe e na classe filha.

O private, você pode acessar o método/propriedade apenas na própria classe.

 

O motivo pelo qual o cara do vídeo usou protected nas propriedades da classe é exatamente o que o @cristianoolv falou :)

Compartilhar este post


Link para o post
Compartilhar em outros sites

A maioria das funções mysql_* tem um último argumento opcional que permite a você escolher qual o link de conexão você usará para executar as operações. Isso permite que você tenha mais de um link aberto ao mesmo tempo para, por exemplo, trabalhar com dois ou mais banco de dados em paralelo.

 

Você já está fazendo errado por usar dessas funções. O próprio manual mostra um alerta em vermelho enorme dizendo que não se deve usar tais funções, mas esse não é o ponto para o tópico.

 

O ponto é que propriedades públicas são públicas (ah vá, é mesmo?).

 

Ser pública quer dizer que você pode modificar a partir de qualquer lugar da aplicação apenas por setar novos valores.

 

Como você vai conectar sempre que necessário, invocando esse método ConexaoMysql::conectar(), e o link de conexão criado com essa função é mantido, o que você acha que acontece se alguém ou alguma coisa, acidentalmente ou não, trocar um dos valores desse objeto?

 

Nem precisa pensar muito. É óbvio que após a dita modificação, á próxima chamada ao método de conexão irá falhar pois o valor estará errado.

 

Você deixar como protected já te previne quanto a isso, mas nesse código é desnecessário pois nenhuma outra classe está estendendo essa uma.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bem, acho que estou entendendo... unindo a explicação de todos, chego a seguinte conclusão:

 

Dependendo do objeto(corrijam-me se eu estiver enganado), auguem/coisa pode "estragar" ele(classe), e quando for reutiliza-lo, no mesmo sistema, não dará certo!

 

É isso?

 

O que estava me confundindo, erá a parte em que, ele instancia(é assim que fala?) a classe do objeto $conexao(ele é o objeto?), e lhe passa os valores para as propriedades, como "localhost". Pensei "Oras, se no exemplo 1 e no 2 ele passa os valores por fora da classe, então deu na mesma!" Agora, refletindo um pouco, acho que estou entendo...

 

Mas, inda não estou conseguindo visualizar, nestes exemplos, onde exatamente um "acidente" pode "ferrar" com a class. Podem dar um exemplo?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não entendi bem a questão desse tópico... mas parece que você que uma atualizada nesses exemplos.

 

 

Além de não usar mais o driver mysql, preferindo mysqli ou PDO e usando Prepared Statements, você deve também usar Exceções ao invés de die.

 

Quanto a visibilidade de objetos, essa informação consta no manual.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bem, acho que estou entendendo... unindo a explicação de todos, chego a seguinte conclusão:

 

Dependendo do objeto(corrijam-me se eu estiver enganado), auguem/coisa pode "estragar" ele(classe), e quando for reutiliza-lo, no mesmo sistema, não dará certo!

 

É isso?

 

O que estava me confundindo, erá a parte em que, ele instancia(é assim que fala?) a classe do objeto $conexao(ele é o objeto?), e lhe passa os valores para as propriedades, como "localhost". Pensei "Oras, se no exemplo 1 e no 2 ele passa os valores por fora da classe, então deu na mesma!" Agora, refletindo um pouco, acho que estou entendo...

 

Mas, inda não estou conseguindo visualizar, nestes exemplos, onde exatamente um "acidente" pode "ferrar" com a class. Podem dar um exemplo?

Não tem nada que obrigue voce definir esses atributos, logo alguem que não tenha conhecimento da classe pode simplesmente "esquecer" de definir um, e logo não dara certo.veja:

 


$conexao = new ConexaoMysql;
$conexao->servidor = 'localhost';
$conexao->usuario = 'root';
$conexao->BancoDeDados = 'Banco';
$conexao->conectar();
$conexao->selecionarDB();

 

Um exemplo na vida real:

Voce sabe mexer no computador, sem precisar saber o que ele faz, agora imagine que voce pegue uma faca e uma lupa, e abre o processador, simplesmente vai dar rnerda...

Compartilhar este post


Link para o post
Compartilhar em outros sites

cristianoolv, entendi onde vc quer chegar...obrigado pela resposta!

 

agora...

Não entendi bem a questão desse tópico... mas parece que você que uma atualizada nesses exemplos.

 

 

Além de não usar mais o driver mysql, preferindo mysqli ou PDO e usando Prepared Statements, você deve também usar Exceções ao invés de die.

 

Quanto a visibilidade de objetos, essa informação consta no manual.

 

Eu realmente estou desatualizado, veja bem, meu curso de php, foi em 2011, e mesmo assim não me passaram sobre classes e muito menos oop! Eu ainda usava "phptriad", e usava "<?" ao envés de "<?PHP" para iniciar o código!!!

 

Mas agora, isso me leva á uma boa pergunta, desde o meu curso, venho "tropeçando" em novos métodos de programar em php, como vocês fazem para se manter atualizado. Cursos? Fóruns? Amigos?

 

Existe um lugar que, sempre me manterá informado das novas tecnologias web? Um site ou fórum mas que não me obrigue a "tropeçar" na novidade, seria como um site de noticias diárias, exemplo: "Hoje a w3c lança o HTML5", ai eu iria procurar na web o que é isso.

 

ps.: Á respeito do escopo do tópico, ele já está respondido, muito obrigado a TODOS que responderam! Irei usar suas respostas para me aprofundar no assunto! Obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu sempre estou no fórum, no trabalho eu já avisei que é um site que eu deixo aberto 24 hrs.

 

Eu sempre estou me metendo nos tópicos (perguntando e respondendo), e é o que mantém minha cabeça sempre em funcionamento.

Eu não tenho medo de escrever alguma "bobagem" pois sei que um profissional vai bater com as minhas ideias e vamos argumentar e se eu estiver errado ele vai me explicar o que aconteceu.

 

é o jeito que a minha mente trabalha e acho uma ótima técnica já que todo OO que eu aprendi eu não consegui usar ainda (Usando um "framework" no qual codo muito pouco) mas eu estou sempre perguntando e debatendo as ideias sobre o assunto e até agora tenho me saído muito bem teoricamente.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu concordo plenamente com o Vinicius um ponto muito inteiressante de estar sempre ativo no forum é que as vezes você uma duvida de um usuario e você tambem não conheçe sobre o assunto mais acha ele bem inteiressante que você acaba pesquisando sobre este assunto tanto para respoder para o usuario e tambem para querer aprender sobre aquele assunto.

Eu assim como você ainda não sei quase nada de OO vendo as publcações do forum me ajudou muito com os passos que venho dando para aprender OO tanto que até comprei livros que foi o pessoal do próprio forum indicou.

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.