• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

kingless

[PHP] Simples tutorial sobre classes do PHP


25 mensagens neste tópico

Neste simples tutorial vou tentar ensinar mais ou menos como utilizar classes de PHP.

Antes de começarem a aprender a trabalhar com classes devem primeiro aprender a trabalhar bem com funções do PHP.

Se já sabem trabalhar com funções então podem continuar.

O que são classes?

Classes são conjuntos de variáveis e de funções que utilizam essas variáveis.

As classes de PHP definem-se da seguinte forma:

class nome_da_classe {

   var $nome_da_variavel = ''; 

   function nome_da_funcao () {

       //O código da função fica aqui

       }
}

As classes para funcionarem precisam de ser "chamadas" para "chamarmos" uma classe temos que utilizar a seguinte sintaxe:

$classe = new nome_da_classe();
$classe->nome_da_funcao();

Vou explicar o código ao pormenor.

class nome_da_classe {

Isto serve para definir uma classe com o nome nome_da_classe. Nós podemos utilizar qualquer nome para definir uma classe.

var $nome_da_variavel = '';

Nós utilizamos var para definirmos uma variável a ser utilizada por 1 ou mais funções dessa classe.

As variáveis definidas na classe funcionam como se fossem variáveis globais ou seja uma variável que eu definir na classe vai poder ser utilizada por todas as funções da classe.

Vou mostrar um pequeno exemplo e para exemplificar nada melhor que a realidade.

class humano {

   var $nome = '';

   function criar( $nome_do_humano ) {

       $this->nome = $nome_do_humano;

   }

   function nome () {

       echo $this->nome;

   }
}

$classe = new humano();
$classe->criar( 'kingless' );
$classe->nome();

Este código vai imprimir

kingless

Imagino que agora estejam a pensar o seguinte: mas para que serve o $this ?

O $this é um objecto predefinido pelo PHP para podermos "chamar" variáveis e funções dentro da classe.

Vou explicar a classe acima ao pormenor para que entendam melhor.

class humano {

Como já devem saber defini a classe com o nome humano.

var $nome = '';

Depois defini uma variável a que eu chamo "variável global da classe" porque esta pode ser utilizada por todas funções da classe... como eu estava a dizer defini uma variável com o nome $nome (que vai "guardar" o nome do humano).

function criar ( $nome_do_humano ) {

Defini uma função criar com a variável $nome_do_humano para que seja o usuário a definir o nome do humano. Quem já sabe trabalhar com funções sabe isso.

$this->nome = $nome_do_humano;

Antes de eu explicar vou perguntar: o que é que fiz aqui?

Se disse que guardei o valor da variável $nome_do_humano na variável da classe para que essa possa ser acedida por qualquer função então acertou porque foi isso mesmo que eu fiz, eu utilizei o $this->nome para guardar o valor de $nome_do_humano na variável que eu chamo "variável global da classe".

function nome() {

Defini a função nome para essa variável retornar o nome do humano.

echo $this->nome;

Vamos ver se estão mesmo a aprender. O que é que este código vai fazer ?

Se disse que este código vai imprimir o valor da variável da classe $nome que foi definida anteriormente então acertou porque é isso mesmo que o código faz. Como se deve lembrar na função criar nós guardamos na variável da classe $nome o valor da variável $nome_do_humano.

$classe = new humano();

O operador new serve para instanciar, o que eu chamo de chamar classe. Neste caso "chamamos" a classe humano utilizando o operador new.

$classe->criar( "kingless" );

Aqui nós "chamamos a função" criar e definimos a variável $nome_do_humano com o valor "kingless" e que será guardado na variável na classe.

$classe->nome();

"Chamei" a classe nome esta função vai imprimir o nome que foi guardado na variável da classe que neste caso é "kingless".

E aqui termina o tutorial espero que este tutorial ajude a entender melhor as classes do PHP.

Caso tenham duvidas, "postem" as duvidas aqui neste tópico.

Achas que falta alguma coisa no tutorial? Envia-me uma MP

Até ao próximo tutorial :thumbsup:

Tutorial por kingless - (31/12/2006)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Embora seja um exemplo existe ali algumas coisas que melhorava! :thumbsup:

Como definiste "var $nome" fora da class podes sacar a variável sem precisar de recorrer à função que criaste (basta $classe->nome).

Assim sendo podes introduzir o "private" de modo a que se justifique a criação da função nome().

Outra coisa que podes evitar é fazeres echo dentro da class, devias fazer return apenas!

De resto gostei do tutorial ;)

EDIT: Outro ponto interessante era referires os construtores... neste caso se qq humano tem um nome deixavas de ter o criar e passavas a dar o nome no momento da criação!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Embora seja um exemplo existe ali algumas coisas que melhorava! :thumbsup:

Como definiste "var $nome" fora da class podes sacar a variável sem precisar de recorrer à função que criaste (basta $classe->nome).

Assim sendo podes introduzir o "private" de modo a que se justifique a criação da função nome().

Este tutorial é apenas para pessoas que só estão a começar a aprender classes agora por isso eu simpliquei o maximo.

E se não sabes o "private" é apenas para PHP 5 ;)

Outra coisa que podes evitar é fazeres echo dentro da class, devias fazer return apenas!

Tas muito enganado não tenho que evitar de utilizar "echo",, sabes qual é a diferença entre "return" e "echo" ?

Se não sabes vou tentar explicar... o  "echo" imprime o resultado o "return" retorna o resultado mas não imprime ou seja se utilizarmos "return" na função, para imprimir o resultado temos que utilizar o echo

exemplo:

return

class a {
function b () {
return "kingless";
}
}

$classe  = new a();
$class->b();  //Não imprime nada porque utilizamos o "return"
echo $class->b(); //Imprime "kingless"  mas como ves tivemos que utilizar echo de uma maneira ou outra

echo

class a {
function b () {
echo "kingless";
}
}

$classe  = new a();
$class->b();  //imprime "kingless"
echo $class->b(); //Imprime "kingless"  

Espero que tenhas percebido a diferença ;)

De resto gostei do tutorial :P

thanks :P

EDIT: Outro ponto interessante era referires os construtores... neste caso se qq humano tem um nome deixavas de ter o criar e passavas a dar o nome no momento da criação!

Meu caro isto é um tutorial para inciantes :P

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ui, vou supor que n me explicaste o que faz o return eheheh! O que eu disse é q é sempre aconselhável fazeres return dentro de classes em vez de echo, se depois quiseres imprimir fazes tu o echo! :thumbsup:

Tirando a do private as outras 2 sugestões que te dei em nada complicam o tutorial, pelo contrário, simplificavam o teu código e colocavam-no mais de acordo com o "standart"! ;)

--- EDIT ---

Em qq tutorial de classes a 1ª coisa que referem é a existência de um construtor não vejo porque dizes que isso não é para principiantes :S

Mas claro, o tutorial é teu, só estava a tentar sugerir melhorias ;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Para iniciantes as tuas sugestões não foram as melhores ;) só iria complicar alguem que estivesse a começar agora. Mas mesmo assim obrigado pelas sugestões :thumbsup:

EDIT: Desculpa lá... mas mostra-me ai um tutorial basico para iniciantes a falar sobre construtores logo de primeira.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Para iniciantes as tuas sugestões não foram as melhores ;) só iria complicar alguem que estivesse a começar agora.

Na tua opinião :thumbsup:

http://www.portugal-a-programar.org/revista-programar/edicoes/Revista_PROGRAMAR_-_4a_edicao_Setembro_2006.pdf

Página 9 e 10

De qq modo basta perguntares a qq pessoa q use classes no dia-a-dia q te vai dizer q antes de falar de funções genéricas dentro de classes referia o construtor ;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Esse tutorial que esta na revista programar não serve para alguem que esta a ouvir falar sobre classes pela primeira vez... Este tutorial que esta na revista é mais para alguém que ja sabe o basico.

Já agora... A função  "__construct" só foi implementada no PHP 5 por isso também não é aconselhado para iniciantes que mal conseguem distinguir as diferenças entre PHP 4 e PHP 5,  depois temos o construtor "extends" que tambem não é aconselhado para um iniciante porque é um bocado mais complicado.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Eu sei disso, alias eu até falei disso no tópico dessa revista...

Mas pronto, já vi que não te vou convencer... nem com a documentação básica do PHP sobre objectos (do PHP 4):

http://pt.php.net/manual/en/language.oop.php

Provavelmente tb vais dizer que não é para quem se inicia... e portanto não sei como querias q te convence-se eheh!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O tutorial que esta no site do PHP é para inciantes  mas é um bocado mais dificil um iniciante aprender classes no site do PHP, não sei se ja reparaste

mas muitas pessoas vão sempre a procura de tutoriais fora do site do PHP.

Já agora não sei se estou a ver mal mas parece que no site do PHP  o construtor não é  as primeira coisa que eles falam :thumbsup: Parece que eles falam na primeira página exactamente aquilo que eu falei aqui apesar de lá não explicar ao pormenor como eu expliquei.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ui é na 3ª linha de texto se ignorares os links e os quadros :thumbsup:

Mas pronto já vi que nem valia a pena ter dito nada... tenho pena q assim seja, mas pronto ;)

O tutorial está "bom" como votei, mas realmente falta pelo menos a referencia ao construtor

Bem, vou bazar... n vou estar aqui até às 00 a argumentar ctg.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Acho que não te referias aos construtores  __sleep e __wakeup  ;) quando disseste  "Outro ponto interessante era referires os construtores... neste caso se qq humano tem um nome deixavas de ter o criar e passavas a dar o nome no momento da criação!" mas pronto... :thumbsup: (só pa xatear)

Bem... vamos deixar deste blah blah ;) Não podemos ficar aqui a argumentar até 2007 lol

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Agora nem percebo o que dizes  :bored:

Quem falou no __sleep e __wakeup? ...

Eu falo na linha:

In PHP 4, only constant initializers for var  variables are allowed. To initialize variables with non-constant values, you need an initialization function which is called automatically when an object is being constructed from the class. Such a function is called a constructor (see below).

De qq modo por mim chega...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ah agora entendi... estavas a falar disto

class humano {
var $nome = 'kingless';

function nome () {
echo $this->nome;
}
}
$class = new humano();
$class->nome();

Se for isso então tudo bem ;)

EDIT: Tu falaste do private que é avançado depois falaste de construtores pensei que estivesses a falar de algo mais avançado como por exemplo  __construct ou extends que também são construtores :thumbsup:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Boas!

Sem querer continuar com a "briga", mas sou forçado a dar razão ao Bruno.

Uma classe é um objecto, e não tem qualquer sentido um objecto existir sem ter sido criado antes. O que faz um construtor? Cria um objecto consoante algumas regras definidas pelo programador de forma a evitar conflitos por falta de inicialização de membros privados e afins.

A explicação do construtor além de ir melhor o tutorial (que me parece bastante intuitivo) também iria evitar algumas perguntas de como criar o objecto, porque tenho de fazer sets, porque não posso fazer logo isto e afins. Se achas que evitar isto é complicar..., lamento mas estou totalmente em desacordo.

Sobre o todos os tutoriais sobre classes para iniciantes referirem construtores..., não posso generalizar, este é um em que não se fala, mas de facto é regra geral dedicar uma secção aos construtores (e destrutores no caso de C++).

De resto, parabéns tanto pela iniciativa como pelo tutorial :thumbsup:

abraços, HecKel

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

@Heckel

A nossa pequena discussão não foi por ele ter razão ou não ter foi um simples mal entendido meu, eu é que entendi mal o primeiro post dele e como disse no post anterior "Se for isso então tudo bem".  :thumbsup:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Votei "Muito Bom" para o tutorial do kingless. Estou de acordo com o kingless no que toca á utilização do __construct() num tutorial para pessoas que se estão a iniciar no PHP. Eu quando li pela primeira vez sobre OOP em PHP também não li sobre o __construct, visto que apresentava apenas como criar uma classe com uma função e como criar um objecto.

Cá está o link em que li pela primeira vez sobre este assunto: http://www.phpdeveloper.org/news/5719.

Seja como for, o tutorial está Muito Bom, a iniciativa de criar este tipo de conteúdos é sempre louvável e espero pelas próximas edições (se quiseres ajudo na realização dos mesmos).

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ah agora entendi... estavas a falar disto

class humano {
var $nome = 'kingless';

function nome () {
echo $this->nome;
}
}
$class = new humano();
$class->nome();

Se for isso então tudo bem :)

EDIT: Tu falaste do private que é avançado depois falaste de construtores pensei que estivesses a falar de algo mais avançado como por exemplo  __construct ou extends que também são construtores :(

Ah, afinal o teu problema era outro... aparentemente não sabes o que é um construtor ;)

O teu exemplo poderia ficar assim:

class humano {
  var $nome;

  function humano($name) {
    $this->name = $name;
  }

  function obtemNome() {
    return $this->nome;
  }
}

$class = new humano("kingless");
echo $class->obtemNome();

O extends não tem nada haver com construtor :D

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Estou de acordo com o kingless no que toca á utilização do __construct() num tutorial para pessoas que se estão a iniciar no PHP. Eu quando li pela primeira vez sobre OOP em PHP também não li sobre o __construct, visto que apresentava apenas como criar uma classe com uma função e como criar um objecto.

Cá está o link em que li pela primeira vez sobre este assunto: http://www.phpdeveloper.org/news/5719.

Não compreendi :( O artigo que mostraste fala logo em construtores... (de reparar que eu nunca falei no __construct() porque esse é apenas um dos métodos de o fazer e só é suportado pelo PHP5)

Como referi em qq tutorial de objectos se explica logo o conceito de construtor e o que o death apresentou não é excepção ;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Estou de acordo com o kingless no que toca á utilização do __construct() num tutorial para pessoas que se estão a iniciar no PHP. Eu quando li pela primeira vez sobre OOP em PHP também não li sobre o __construct, visto que apresentava apenas como criar uma classe com uma função e como criar um objecto.

Cá está o link em que li pela primeira vez sobre este assunto: http://www.phpdeveloper.org/news/5719.

Não compreendi ;) O artigo que mostraste fala logo em construtores... (de reparar que eu nunca falei no __construct() porque esse é apenas um dos métodos de o fazer e só é suportado pelo PHP5)

Como referi em qq tutorial de objectos se explica logo o conceito de construtor e o que o death apresentou não é excepção :D

Estive a rever conceitos e de facto parece que me equivoquei. Um construtor não tem obrigatoriamente de ser através da função __construct (que, como tu disseste, só pode ser utilizada pelo PHP5), mas pode também ser feito através de funções com o mesmo nome da classe correcto?

Assim sendo, o kingless poderia realmente ter referido esse aspecto, mas se preferiu introduzir esse conceito para a próxima parte do tutorial, então óptimo. Todos os tutoriais têm diferentes modos de apresentação, pelo que devem ser respeitados. Resta-nos esperar pela continuação do tutorial. :(

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Desrespeitar, julgo que ninguém desrespeitou :D Apenas tentamos alertar para algo que consideramos importante :(

Já agora, uma critica :X Execelente <- Isto é entre Excelente e Muito Bom? :P

abraços, HecKel

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Desrespeitar, julgo que ninguém desrespeitou :P Apenas tentamos alertar para algo que consideramos importante :(

Já agora, uma critica :X Execelente <- Isto é entre Excelente e Muito Bom? :D

abraços, HecKel

Já lhe corrigi o erro :P

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ok, há os reparos técnicos que foram discutidos com os quais concordo uma vez que o paradigma da programação orientada a objectos visa o uso eficiente e recorrente de código.

Na mesma linha ainda há outra coisa que gostaria de chamar a atenção: a nomenclatura das funções.

Para um principiante "criar" não é de todo um bom nome pois vai confundi-lo todo. Vai pensar que está a criar um objecto. Isso é tarefa que deve ser deixada para os construtores, como já foi discutido.

De um modo geral, as funções devem ter nomes de verbos. Se servirem para devolver um valor que seja ou dependa apenas de atributos privados normalmente dá-se um nome estilo get_privvar().

Isto não são os dez mandamentos nem nada disso, são simplesmente boas práticas que podem poupar muito tempo e produzir código muito mais eficiente.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ok, há os reparos tecnicos que foram discutidos com os quais concordo uma vez que o paradigma da programação orientada a objectos visa o uso eficiente e recorrente de código.

Na mesma linha ainda há outra coisa que gostaria de chamar a atenção: a nomenclatura das funções.

Para um principiante "criar" não é de todo um bom nome pois vai confundi-lo todo. Vai pensar que está a criar um objecto. Isso é tarefa que deve ser deixada para os construtores, como já foi discutido.

De um modo geral, as funções devem ter nomes de verbos. Se servirem para devolver um valor que seja ou dependa apenas de atributos privados normalmente dá-se um nome estilo get_privvar().

Isto não são os dez mandamentos nem nada disso, são simplesmente boas práticas que podem poupar muito tempo e produzir código muito mais eficiente.

Boas!

De facto estou totalmente de acordo e são bons hábitos que se devem ir logo cultivando, no entanto para este tutorial nem considero isso fundamental, o tutorial aborda uma iniciação à estrutura e não à extensibilidade e legibilidade de um programa.

Seguindo essas regras das funções (e mais umas quantas) de facto poupam-se muitas linhas de comentários quando o código é passível de vir a ser usado por outro programador. E até me irrita ver funções que fazem uso do input/output :( Uma função é para tratar dados e devolver um resultado, e não para interagir directamente com o utilizador, fica uma grande salganhada misturar tudo..., mas infelizmente vejo cada vez mais o uso de funções que usam in/output...

abraços, HecKel

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora