Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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!
>
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.
oi amigo, dá uma lida aqui:
http://wbruno.com.br/2011/04/29/afinal-e-orientacao-objetos/
http://wbruno.com.br/2011/04/20/afinal-e-interface-oop/
você vai entender.
>
oi amigo, dá uma lida aqui:
http://wbruno.com.br/2011/04/29/afinal-e-orientacao-objetos/
http://wbruno.com.br/2011/04/20/afinal-e-interface-oop/
você vai entender.
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!
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();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();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.
Vinicios:
Cara, adorei a explicação, vou ler o seu link e depois respondo aqui o que aconteceu com minha "massa cinzenta". xD
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?
Private não é contra hackers, segurança contra modificação dos dados por código fora da classe.
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();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;
} $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.
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.
O conceito de OO é meio complexo no começo. Com o tempo, as coisas começam a ficar um pouco óbvias!
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]
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.
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?
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.
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 .
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á.
Mas , como alguém que quer pegar estes dados pode fazer isso , sendo que ele não tem acesso ao código ?
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.
olha eu de novo!...
Estou recriando os passos do curso, e vou comentando cada linha. Mas não estou conseguindo criar uma definição para o que está acontecendo aqui:
$chave1 = new chave(); //dizemos que esta variavel é a class chave
$chave1->segredo = 789;//atribuimos um valor para a caracteristica "segredo"
$fechadura = new fechadura();//dizemos que esta variavel é a class "fechadura"
$fechadura->destranca( $chave1);//Execultamos a função "destranca" e...
Então, estes comentarios estão certos? No ultimo , entendi que ele está executando a função, mas o que este parâmetro "$chave1" realmente quer dizer?
Vamos lá.
$chave1 = new chave(); //dizemos que esta variavel é a class chave
ela não É a classe chave, e sim uma instancia.
mais ai você pergunta a diferença, e é bem simples.
se ele fosse a classe em si você teria que criar varias classes iguais para passar valores diferentes.
e como ela é uma instancia(cópia) do seu objeto você pode criar a instancia dela várias vezes e passar valores diferentes.
$chave1 = new chave();
$chave1->segredo = 789;
echo $chave1->segredo;
$chave2 = new chave();
$chave2->segredo = 10;
echo $chave2->segredo;
saída
>
789
10
se isso fosse a classe em si não daria certo.
é uma característica o seu segredo porém é mais comum chamar de propriedade.
para fechadura vale a mesma coisa, é uma instancia e não a classe.
e sim você chama a função destranca que esta na classe fechadura.
o que acontece é que como parâmetro você não esta usando um valor especifico e sim passando um objeto do tipo chave.
imagino que seu método destranca esteja algo:
public function destranca(chave $chave)
por que você esta dizendo para o método que ele só vai aceitar objetos chaves e então se alguém tentar passar um clips ou palito de dente não vai ter retorno.
procure mais sobre encapsulamento e visibilidade pois quando agente trabalha com parâmetros é comum criarmos getters e setters por questão de segurança.
auhsaushaushuhsuahs, estou sorrindo "atoa" :D, pois não imaginava como uma linguagem de programação pode ser tão perto da realidade. beleza, entendi a sua explicação, to continuando o estudo aqui...
Vinicius Rangel
Para mim fica meio confuso , como cara poderia fazer isso em tempo de execução. Mas , como que eu faria para impedir ele de fazer isso. Entendo que se eu pedir o um número pelo id , será inteiro , então eu faço essa validação. Porém e se for uma string que possa variar e tudo mais ?
Bem, tem este codigo lá no curso(link), que tá dando errado. esta faltando a class Eu, mas ele não explicou como se faz ela.
interface Projetil { //dizemos que tenho um projetil
}
//Dizemos o que pode ser nosso projetil
class Pau implements Projetil {
}
class Pedra implements Projetil {
}
class Sapato implements Projetil {
}
//dizemos que temos um alvo, que tem um função que é, acertar um projetil
interface Alvo {
public function acerta( Projetil $projetil );
}
//dizemos o que pode ser nosso alvo
class Gato implements Alvo {
public function acerta( Projetil $projetil ) {
echo 'Miiiaaaaaauuuuuuuuuuuuu !!!!!';
}
}
class Cao implements Alvo {
public function acerta( Projetil $projetil ) {
echo 'Aaaaauuuuuuuuuuu !!!!!';
}
}
class Parede implements Alvo {
public function acerta( Projetil $projetil ) {
echo 'plof !!!!!';
}
}
$gato = new Gato();
$cao = new Cao();
$parede = new Parede();
$pau = new Pau();
$pedra = new Pedra();
$sapato = new Sapato();
$eu = new Eu();
$eu->atira( $pau , $gato );
$eu->atira( $sapato , $cao );
$eu->atira( $pedra , $parede );
retorna:
>
Fatal error: Class 'Eu' not found in...
Tentei fazer ela, mas ainda não consigo isso.
Fiz até aqui:
class Eu{
public function atira(){
}
}dei uma lida rápida no que a galera ai acima postou
não vi nada falando sobre herança de classe para intender sobre pq usar public, private ou protected
so a arrumação q tipo digamos q vamos fazer visualização de usuarios
fariamos a classe cliente que poderia ver no site (x)
dpois fariamos a classe funcionario q é filha de cliente e herda as propriedades logo ela pode ver (x) e adicionariamos a ela o (y)
e teriamos o administrador que por sua vez é filho de funcionario e pode ver (x)e (y) e a ele seria adicionado (z)
sendo assim seria meio q uma pirâmide de cabeça para baixo
tipo....
o cliente q seria o q tem menos visão estaria na parte pontuda da piramide pq tem menos visão logo menos espaço, em seguida o funcionario ficaria no meio, e na base o adm
deu pra intender :ermm:/>/>
ou do jeito q eu falei ficou confuso? :huh:/>/>
ISSO SORE HERANÇA DE CLASSE...
I... agora q eu vi
o cara acima falo disso mesmo xD
xXxWesleyxXx
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.
-