Ir para conteúdo

POWERED BY:

Arquivado

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

xXxWesleyxXx

Por que usar classes?

Recommended Posts

Olá pessoal, como vocês já devem ter entendido, eu não sei o por que das classes. Consegui exemplos onde se confirma o login de usuário. Achei legal, mas um pouco redundante e mais complexo; nisso eu penso, para que eu vou complicar uma coisa simples, que é logar um usuário? Então gostaria da explicação dos experientes para solucionar as seguintes duvidas:

 

* O que são classes no php?

* O que são objetos?

* O que quer dizer "estanciar uma classe(ou objeto)"?

* Por que usar, qual é sua importância?

* Mesmo coisas "pequenas" é recomendado fazer com classes?

* Classes deixam um site mais seguro?

* Qual seria um bom tutorial na internet para ensinar o básico a respeito?

 

 

Isso pessoal... Desde já agradeço!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu fiz essa mesma pergunta a algum tempo atrás

 

Não vou responder tudo, mas vou deixar algo para facilitar o motivo de usar.

 


  •  
  • Primeiro não use em tudo, use para algo que seja usado para diversas tarefas (como usa classe mysql).
  • A principal vantagem das classes é o compartilhamento de variáveis entre as funções e o melhor você pode tornar essa váriavel public, protected, private e const, tornando assim sua aplicação mais segura contra falhas "externas".
  • Outra vantagem que posso dizer é a organização de uma aplicação, certamente é bem mais fácil se guiar em uma classe bem organizada do que em um monte de funções.

Compartilhar este post


Link para o post
Compartilhar em outros sites

1 O que são classes no php?

2 O que são objetos?

3 O que quer dizer "estanciar uma classe(ou objeto)"?

4 Por que usar, qual é sua importância?

5 Mesmo coisas "pequenas" é recomendado fazer com classes?

6 Classes deixam um site mais seguro?

7 Qual seria um bom tutorial na internet para ensinar o básico a respeito?

 

1 - uma abstração da realidade, ou seja você esta transpondo algo do seu dia a dia para um modelo computacional sendo q você so vai colocar as propriedades e operações relevantes.

 

2 - é a representação de uma classe com valores.

 

3 - instanciar um objeto significa criar ele.

 

4 - reuso de codigo e organização mais simples do q funções, entre outras coisas.

 

5 - sim.

 

6 - não existe relação nenhuma.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

Ola Bruno, agradeço suas referenças, porem, li o primeiro e entendi tudo, ou quase. Mas o segundo, iniciou um Nó no meu cerebro, que to sentindo cheiro de queimado! hehehee, brincadeira a parte... Vou dizer o que entendi, e se você, ou outro, puder confirmar ou corrigir, agradeço(obs.: Tem algumas perguntas no meio de tudo isso, então nem tudo eu realmente entendi!).

 

1 - Classe, seria uma espercie de array, que ao invez de armazenar varios valores, como int e string, armazena funções;

2 - Funções seria "ações" que o php faz, como consultas, atualizações etc, ou de uma maneira mais superficial: faz um login por exemplo;

3 - Até aqui, a vantagem principal é a organização, terei um codigo mais limpo, com informações separadas por "categoria"(Estou tentando elaborar um ótica á respeito);

4 - Para criar uma class, faz:

 

class NomeDaClasse { FUNÇÕES }

 

5 - Para criar funções, de login por exemplo, faz:

 

public function logar() { LOGAR }

 

(Esses "()" eu não entendi para que serve, sempre são vazios?)

 

("public", pelo que eu entendi, declara quem (não sei quem!) pode acessar essa classe ou função, neste caso todos podem acessar, pois é publica.)

 

6 - Ás variáveis das funções, são objetos (Não tenho certeza);

 

7 - Para usalos, primeiro chamamos a classe assim:

 

$Classe = new NomeDaClasse;

 

8 - Depois, chamamos uma função dessa classe, que por sua vez irá executar algo:

 

$Classe = new NomeDaClasse;

$Classe -> logar();

 

(O "->", quer dizer que estou referindo a um objeto, mas neste caso, objeto seria a função em sí?)

 

(Eu já vi em outro artigos o "$this->", o que quer dizer, quando se usa, qual é a diferença?)

 

----------//----------//----------//----------//----------//----------//----------

 

Ok! Até aqui, acho que entendi uma boa parte, já estou arriscando uns testes. Mas no que eu realmente me confundi, é a INTERFACE, que é citada no segundo link. Eu entendi:

 

9 - Usa-se interface para padronizar um sistema de classe;

 

10 - Á vantagem é que, mudanças no sistema são mais fazeis, como mudar de banco de dados por exemplo, e compreensão também fica melhor, assim todos, inclusive eu, poderá continuar ou modificar o sistema sem medo de errar;

 

11 - Meu problema: Nas explicações do autor do artigo, ele substituí DUAS palavras em português por UMA inglês, eu até apoio a ideia, afinal programação é em inglês, mas para mim isso não é a solução para padronizar o RACIOCÍNIO do sistema, nos meu um programador que lê em português, irá entender o que esta sendo feito, pois é organizado e comentado. Mas afinal, o que ele realmente fez, para todos considerar o sistema, do exemplo, mais organizado?

 

----------//----------//----------//----------//----------//----------//----------

É isso, pessoal, pesso mais um pouco da umilde atenção de vocês, por favor! Se poderem elabora um exemplo simples de classes, um sem interface e o outro com, eu agradeço. Estou criando um jogo, e estou com medo de ir por caminhos estreitos, difíceis de voltar!

Compartilhar este post


Link para o post
Compartilhar em outros sites

1 - Classe, seria uma espercie de array, que ao invez de armazenar varios valores, como int e string, armazena funções;

 

você pode até pegar o conceito mas não confuda, uma classe tem propriedades e funções enquanto o array tem índices e valores.

 

Funções seria "ações" que o php faz, como consultas, atualizações etc, ou de uma maneira mais superficial: faz um login por exemplo;

 

função e/ou método é sim a ação no caso de um login você teria um método chamado logar onde você faria toda lógica.

 

(Esses "()" eu não entendi para que serve, sempre são vazios?)

 

serve para passar parâmetros, exemplo no sistema de login.

 

class teste {
public function logar($usuario, $senha){
   return "Meu usuário é {$usuario} e minha senha é {$senha}";
 }
}

$login = new teste();
$login->logar("Vinicius1932", "12345678");

 

saída

Meu usuário é Vinicius1932 e minha senha é 12345678

 

e isso já responde sobre a instancia do objeto

 

$login = new teste();

quando faço isso eu estou criando uma copia do objeto para poder trabalhar com o mesmo, então eu poderia mostrar aquela frase varias vezes chamando minha classe varias vezes.

 

(O "->", quer dizer que estou referindo a um objeto, mas neste caso, objeto seria a função em sí?)

 

ele indica com o que você ira trabalhar da sua classe.

então isso:

 

$login = new teste();
$login->logar("Vinicius1932", "12345678");

 

estou criando a referencia da minha classe teste e depois eu falo que no meu objeto teste que agora é a var login vai ter um método chamado logar que recebe 2 parâmetros.

 

(Eu já vi em outro artigos o "$this->", o que quer dizer, quando se usa, qual é a diferença?)

 

o $this é para trabalhar dentro do objeto, imagine sua classe teste e você vai usar o login e a senha do usuário em mais de um método.

 

class teste {
public $usuario; //propriedade
public $senha;

 public function logar(){ //método ou função
     return "Meu usuário é {$this->usuario} e minha senha é {$this->senha}";
 }
}

$login = new teste();
$login->usuario = "vine10"; //assim chamando uma propriedade, sem o uso das ()
$login->senha = "1234";
$login->logar(); //assim chamando uma função com o ()

 

e o retorno será

Meu usuário é vine10 e minha senha é 1234

 

agora você pode implementar

 

class teste {
public $usuario; //propriedade
public $senha;

 public function isEqual(){
    if($this->usuario == 'vine10'){
      return "igual";
     } else{
      return "não é";
      }
 }

 public function logar(){ //método ou função
     return "Meu usuário é {$this->usuario} e minha senha é {$this->senha}";
 }


}
$login = new teste();
$login->usuario = "vine10"; //assim chamando uma propriedade, sem o uso das ()
$login->senha = "1234";
$login->isEqual(); // ira verificar se o login é igual
$login->logar(); //assim chamando uma função com o ()

 

perceba que só dizemos qual usuário é 1 vez e o programa se encarrega de chamar ele em 2 método diferentes, coisas que não aconteceria se o parâmetro for passado para função e não for uma propriedade da classe.

 

 

bom meu amigo para finalizar eu digo que existe uma enorme diferença entre CLASSES e OBJETOS, primeiro entenda como funciona uma classe para trabalhar com objetos, a interface é algo extremamente avançada e é a pior dúvida que tive até hoje apesar de ACHAR que já foi resolvido(não sei pq não coloquei em prática), mas aqui vai uma dica bacana:

 

 

http://forum.imasters.com.br/forum/159-curso-de-php/

 

começa do 1.1 e você vai começar entender.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bem, estou estudando aqui, mas de deparei com mias um duvida(novidade...), entendi sobre Encapsulamento, mas não o por que fazer? É para segurança, por que eu devo tornar uma class "private", o que ganho com isso. Se for algo de segurança, como um "haker" por exemplo, pode se aproveitar de classes publicas?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Isso aí é erroneamente chamado de encapsulamento. O real nome disso aí é PROTEÇÃO DE DADOS.

 

Imagine você programando no velho estilo procedural e precisa de que algo seja disponibilizado entre várias funções. Para não ter que ficar passando parâmetros, você vai e declara uma variável global.

 

Suponha que você quer controlar o número de registros por página na hora de listar diferentes conteúdos e que esse número deve ser o mesmo para todos os conteúdos por alguma razão.

Você faria assim:

 

$registrosPorPag = 10;

function funcao1() {
global $registrosPorPag;
// blablabla
algumafuncao($registrosPorPag);
}

funciton funcao2() {
global $registrosPorPag;
// blablablablablablal
algumaoutrafuncao($registrosPorPag);
}

 

Beleza, essa variável $registrosPorPag deve ser um inteiro pra funcionar direito. Entretanto, no PHP, nada de impede de em certa parte do código você fazer:

$registrosPorPag = 'indefinido';

 

A partir daí, todas as funções que utilizarem essa variável vão ter esse valor inválido a partir dela. Claro que esse exemplo é meio absurdo, foi só pra ilustrar, mas o uso de variáveis globais é ruim porque você nunca lembra todos os lugares no qual ela é utilizada. Alterar seu valor pode quebrar todo o sistema.

 

Mesmo escrito de forma procedural, o intuito do seu código é "modularizado", separando operações em diferentes funções (isso é o tal do encapsulamento, o ato de agrupar os comandos que realizam uma certa operação em um bloco bem definido, como uma função, um simples while pode ser considerado encapsulamento).

 

Entretanto, como no exemplo da variável global que citei, é meio complicado fazer isso em sistemas procedurais, mas não é impossível. Sistemas operacionais inteiros são escritos em C procedural, sem utilizar nenhuma classe.

 

Com a orientação a objetos, fica mais fácil reduzir a sucetibilidade de uma variável a mudanças, sem no entanto reduzir sua visibilidade (falei grego, né?)

 

Através das palavras chaves public, protected e private (que fique claro que isso só é assim em algumas linguagens, como PHP, Java e C++, em outras, utilizam-se outros meios), você pode definir quem pode "ver" uma variável e alterar seu conteúdo.

 

Quando uma variável ou método é private, ela só será visível DENTRO da classe que a define:

class Foo {
private $bar = 'bar';
}

$foo = new Foo();
echo $foo->bar; // vai dar erro

 

Quando uma variável ou método é protected, ela é visível DENTRO da classe que a define e de classes relacionadas a ela através de HERANÇA:

class A {
protected $a = 'blabla';
}

class B extends A {
public function showA() {
   	echo $this->a;
}
}

$b = new B();
$b->showA(); // Ok
$b->a // Fatal error

 

Quando uma variável ou método é public, ela é visível DE QUALQUER LUGAR:

class Foo {
public $bar = 'bar';
}

$foo = new Foo();
echo $foo->bar;
$foo->bar = 'foo';

 

Nisso já dá pra perceber que propriedades públicas são uma má prática, uma vez que deixa livre a alteração do conteúdo da mesma.

 

Mas se a variável é private ou protected, como eu faço pra alterar seu valor se eu quiser?

É aí que entram os chamados métodos de acesso, ou setters e getters.

class Foo {
public $bar = 'bar';
public function getBar() {
   	return $this->bar;
}
public funciton setBar($newVal){
   	if(is_string($newVal)) {
       	$this->bar = $newVal;
   	}
}
}

 

Através desses métodos de acesso, você pode controlar os valores que podem ser atribuídos á propriedade $bar.

 

Dessa forma, a variável será visível fora da classe, mas não será acessível.

 

Se for algo de segurança, como um "haker" por exemplo, pode se aproveitar de classes publicas?

Não, meu caro Padawan... Hackers dificilmente terão acesso ao seu código PHP, a estrutura de programação do PHP não importa. O problema é outra coisa, tem a ver em como você trata as entradas de dados do usuário.

Compartilhar este post


Link para o post
Compartilhar em outros sites

apesar disso eu encaro mesmo como lógica.

 

parece que você esta vendo OO e então a dica que fica é: "Traga o problema para o mundo real".

 

nos exemplos do curso que te passei ele faz um exemplo de uma porta com uma chave para abrir e então fica bem lógico.

todo mundo tem o segredo da chave e então na classe chave o segredo é publico já na porta só ela tem o segredo, resumindo:

 

Segredo da chave qualquer um pode ter, ou seja, qualquer um pode por qualquer coisa na fechadura.

Segredo da porta, apenas a porta tem para se proteger que qualquer coisa abra.

Compartilhar este post


Link para o post
Compartilhar em outros sites

O conceito de OO é meio complexo no começo. Com o tempo, as coisas começam a ficar um pouco óbvias!

Compartilhar este post


Link para o post
Compartilhar em outros sites

POO não deixa a aplicação mais segura ou mais fragil, a segurança provem de quem programa e ñ do programa em si.

 

A real utilização do oo alen da organização (isso te criar nomes sugestivos, ou seja nada de ingles) a reutilização do proprio.Criar classes para fazer coisas simples realmente torna as coisas mais redundantes e complexas, porem para fazer coisas complexas as coisas se torna mais simples e clara.[coisas]

Compartilhar este post


Link para o post
Compartilhar em outros sites

eu prefiro escrever tudo em inglês para padronizar, é muito mais elegante nada impede.

 

sobre o OO temos que levar em conta que ele é um CONCEITO, ou seja, depende da forma de como você faz e não quais ferramentas você usa.

Compartilhar este post


Link para o post
Compartilhar em outros sites

hum... entendi, minha "perseguição" com os hackers, é devido a criação de um jogo, como já avia citado, recentemente descobri sobre mysql_injection, então fiquei com medo, mas isso é assunto para outra hora.

Bem, então, tornar algo publico ou não, é apenas para evitar que EU faça alguma CAGADA(desculpe os termos) no código?

No mais, a ideia inteira de class, é para me organizar? E/ou eventualmente deixar o código melhor para outros?

eu prefiro escrever tudo em inglês para padronizar, é muito mais elegante nada impede.

É melhor escrever em inglês ou não? Uma empresa de TI, por exemplo, eles tem este padrão?

 

Sendo isso, vou dar continuidade nos estudos(desse do link mesmo), mais duvidas volto aqui, beleza?

Compartilhar este post


Link para o post
Compartilhar em outros sites

cara um tem suas preferencias, EU prefiro em inglês pelo fato da linguagem ser em inglês e então quando eu abrir de novo daqui um tempo mesmo que eu não me lembro eu vou ler aquilo como uma frase sem aquela bagunça da palavra PT.

 

exemplo:

 

$name = "Luiz Vinicius";
$array_name = explode(" ", $name);
if($name[0] == "Luiz"){
echo $name[0];
}

 

PT

$nome = "Luiz Vinicius";
$array_nome = explode(" ", $name);
if($nome[0] == "Luiz"){
echo $nome[0];
}

 

pelo menos eu tenho muito mais facilidade em ler do primeiro jeito e no final das contas é mais elegante, cai melhor a escrita.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Aproveitando aqui , como ou com oque nos devemos preocupar para a segurança do sistema ? A nível de código ? Também estou em constante estudo sobre OO. E xXxWesleyxXx belo tópico , a galera que respondeu aqui me tirou muitas dúvidas também .

Compartilhar este post


Link para o post
Compartilhar em outros sites

Encapsulamento, e a visibilidade.

 

procurar não deixar itens importantes na URl como ID de usuário, ID de compra e caso necessário sempre trate.

 

o segredo é tratar TODO tipo de dado, qualquer virgula inserida em seu site você precisa saber de onde veio e por que foi parar lá.

Compartilhar este post


Link para o post
Compartilhar em outros sites

imagina que você tenha uma página em que o usuário visualize todas suas compras

 

então você faz a consulta com os dados da URl no caso GET

 

$sql = "SELECT * FROM compras WHERE id_usuario = {$_GET['id']}";

 

se o cara trocar o número que esta lá ele visualiza todo conteúdo e pode fazer alterações, fora que seu sistema ficaria vulnerável a QSL Injection e poderia retornar o nome da sua tabela e da sua DB no caso.

 

quando trabalha com POST já é um pouco mais complicado mas com o chrome em nossas vidas é muito fácil alterar o que será enviado e então você precisa sempre ter certeza de que esse dado que veio de uma requisição é justamente do tipo que você esperava.

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.