PHP OO : Acessando Objetos em qualquer página

março 6th, 2009 | by DragaO~ |

Olá pessoas que visitam este pequeno blog :D
Hoje venho com uma dúvida que muitas pessoas possuem, e vejo que o material sobre o assunto me pareceu escasso (e na sua grande maioria em inglês): acessar objetos em diferentes partes de um sistema/site.

Um certo dia eu comecei a tentar “brincar” com programação orientada a objetos em PHP, e notei que eu precisava acessar o mesmo objeto em uma página, e logo após em outra, o que eu fiz? simplesmente criei uma sessão (eu costumo utilizar sessões) e “joguei” meu objeto lá dentro.
Trocando isso tudo em códigos, o que eu fiz foi mais ou menos isso :

meuobjeto.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?
class MeuObjeto
{
    private $algo;
 
    public function __construct()
    {
        $this->algo = mt_rand();
    }
 
    public function getAlgo()
    {
        return $this->algo;
    }
}
?>

Como podem ver, este é um objeto bastante simples, que não faz nada, porém vai me ser útil neste exemplo :D
(o intuito deste post não é ensinar programação orientada a objetos, portanto, não me aterei à esta parte)

Agora vamos fazer um exemplo bem básico para criar um objeto da classe “MeuObjeto”, acessar ele e ver as suas propriedades :

teste.php:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?
//dando um nome a sessao
session_name('minha_sessao');
//inicindo a sessao
session_start();
 
//incluindo o arquivo que contem o objeto
include('meuobjeto.php');
 
//instanciando um novo objeto e atribuindo-o a uma variavel
$objeto = new MeuObjeto();
//mostrando seu valor
echo "valor da variavel/objeto : " . $objeto->getAlgo();
//mostrando o var_dump para que possamos ver como a variavel "realmente eh"
var_dump($objeto);
 
//atribuindo o objeto a uma variavel qualquer de nossa sessao
$_SESSION['algo'] = $objeto;
//verificando o valor do objeto que esta na sessao
echo "valor da variavel/objeto que esta na sessao : " . $_SESSION['algo']->getAlgo();
//mostrando o var_dump para que possamos ver se continua tudo correto
var_dump($_SESSION['algo']);
?>

como disse anteriormente, gosto de utilizar sessões, porém, este exemplo pode ser perfeitamente praticável com cookies, arquivos, banco de dados, ou até mesmo pela URL (confesso que não testei em nada a não ser sessões, porém, na teoria, deve funcionar com todos, por isso peço que me avisem caso não funcione em algum destes ;)), isso depende tudo da sua “criatividade” :D

Como comentei o código creio não precisar explicar nada, apenas aconselhar que, quem não sabe o que são includes, que leia isto (não é pré-requisito para este post, mas para programação em si)

O exemplo acima deve mostrar algo como :

valor da variavel/objeto : 741366652

object(MeuObjeto)#2 (1) {
  ["algo:private"]=>
  int(741366652)
}

valor da variavel/objeto que esta na sessao : 741366652

object(MeuObjeto)#2 (1) {
  ["algo:private"]=>
  int(741366652)
}

Note que, ambas variáveis são objetos da classe “MeuObjeto” e que possuem um atributo chamado “algo” de visibilidade “privada”, com o valor inteiro “741366652″ atribuído à este atributo
Vendo isso parece que não existe problema algum não é mesmo? Pois bem, vamos ao próximo e “revelador” script:

teste2.php

1
2
3
4
5
6
7
8
9
10
11
<?
//iniciando novamente a nossa sessao
session_name('minha_sessao');
session_start();
 
//vendo os valores da variavel de sessao
var_dump($_SESSION['algo']);
 
//mostrando o numero
echo $_SESSION['algo']->getAlgo();
?>

ao ler o scrip parece tudo certo né? mas quando eu tentei acessar apareceu isso :

object(__PHP_Incomplete_Class)#1 (2) {
  ["__PHP_Incomplete_Class_Name"]=>
  string(9) "MeuObjeto"
  ["algo:private"]=>
  int(235422008)
}

Fatal error: main() [function.main]: The script tried to execute a method or access a property of an incomplete object. Please ensure that the class definition "MeuObjeto" of the object you are trying to operate on was loaded _before_ unserialize() gets called or provide a __autoload() function to load the class definition in /caminho/do/script.php on line 10

já de cara dá pra ver que a coisa não aconteceu como a gente esperava, pois nossa variável de sessão passou a ser pertencente à classe “__PHP_Incomplete_Class_Name” e não mais “MeuObjeto”, porém, podemos ver que o PHP salvou o nome da classe dentro deste objeto.
Pois é, mas isso não serve pra nada :)

Se a gente parar para ler o erro fatal (que, aliás, é bem grande), vemos que ele fala algo sobre uma função chamada “unserialize()” e também fala sobre o método mágico “__autoload()”
O que nos interessa é a função “unserialize()”, portanto, vamos à ela ;)

Basicamente falando, a função “unserialize()” desfaz o que a função “serialize()” fez; seria mais ou menos como uma criptografia (reversa, obviamente), portanto, vamos pegar o nosso arquivo “teste.php” e fazer algumas modiicações:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<?
//dando um nome a sessao
session_name('minha_sessao');
//inicindo a sessao
session_start();
 
//incluindo o arquivo que contem o objeto
include('meuobjeto.php');
 
//instanciando um novo objeto e atribuindo-o a uma variavel
$objeto = new MeuObjeto();
//mostrando seu valor
echo "valor da variavel/objeto : " . $objeto->getAlgo();
//mostrando o var_dump para que possamos ver como a variavel "realmente eh"
var_dump($objeto);
 
//atribuindo a serializaçao de um objeto a uma variavel qualquer de nossa sessao
$_SESSION['algo'] = serialize($objeto);
//vendo como fica o objeto serializado na sessao
var_dump($_SESSION['algo']);
 
//deserializando a nossa sessao e atribuindo a uma variave
$variavel = unserialize($_SESSION['algo']);
// verificando o valor do objeto que esta na sessao
echo "valor da variavel/objeto que esta na sessao : " . $variavel->getAlgo();
//vendo os valores que existem na sessao
var_dump($_SESSION['algo']);
//vendo os valores que existem na variavel
var_dump($variavel);
?>

vou me ater somente às modificações, beleza? ;)

20
$_SESSION['algo'] = serialize($objeto);

aqui estamos serializando nosso objeto e colocando-o em uma variável qualquer de nossa sessão, e esse é o primeiro passo que faz com que nosso objeto funcione normalmente ;)

22
var_dump($_SESSION['algo']);

aqui estamos mostrando novo valor da nossa sessão, que no meu caso, foi isso :

string(56) "O:9:"MeuObjeto":1:{s:15:"�MeuObjeto�algo";i:1119598129;}"

vejam como realmente é diferente de quando não havíamos serializado:

object(MeuObjeto)#2 (1) {
  ["algo:private"]=>
  int(741366652)
}

caso não lembre, o valor do atributo “algo” é diferente pois é gerado randomicamente, o que quero comparar é o modo como apareceu as informações na tela :)
Pois bem, aquela “coisa louca” é a representação do teu objeto, legal né ? :D

seguindo em frente…

27
$variavel = unserialize($_SESSION['algo']);

aqui estamos desfazendo o que fizemos acima, a fim de utilizar novamente o nosso objeto
afinal aquela string que vimos antes não é um objeto :)
básicamente a função “unserialize()” nos devolve o nosso objeto, nada mais, então, a partir desse ponto, temos o mesmo objeto que tínhamos antes na variável “$objeto”, mas ela passou pela sessão e agora “foi parar” na variável “$variavel” (novamente minha criatividade atacando :D)

29
echo "valor da variavel/objeto que esta na sessao : " . $variavel->getAlgo();

aqui estamos vendo se o valor realmente continuou o mesmo que estava antes (”1119598129″), vejam a minha saída:

valor da variavel/objeto que esta na sessao : 1119598129

como pode-se ver, realmente permaneceu o mesmo valor, mas será que após deserializar o nosso objeto a variável de sessão foi afetada? vejamos a seguir a minha saída:

valores da sessao :
string(56) "O:9:"MeuObjeto":1:{s:15:"�MeuObjeto�algo";i:1119598129;}"

como esperado, a sessão continuou intacta (até mesmo porque não mexemos nela né :))
e qual será o valor que existe na variável “$variavel”? será que é o valor da sessão ou será que está igual ao “$objeto”? na curiosidade, aí vai :

object(MeuObjeto)#2 (1) {
  ["algo:private"]=>
  int(1119598129)
}

mágico não? :)
agora conseguimos transferir um objeto para a sessão, serializá-lo e mesmo assim conseguimos obter os dados “reais” dele :)
e claro, não poderia me esquecer de mostrar a minha saída “na íntegra”:

valor da variavel/objeto : 1119598129

object(MeuObjeto)#1 (1) {
  ["algo:private"]=>
  int(1119598129)
}

string(56) "O:9:"MeuObjeto":1:{s:15:"�MeuObjeto�algo";i:1119598129;}"

valor da variavel/objeto que esta na sessao : 1119598129

valores da sessao :
string(56) "O:9:"MeuObjeto":1:{s:15:"�MeuObjeto�algo";i:1119598129;}"

object(MeuObjeto)#2 (1) {
  ["algo:private"]=>
  int(1119598129)
}

e, para provar que eu não simplesmente mostrei à vocês uma função que faz criptografia reversível, vamos ao novo arquivo “teste2.php”:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?
//iniciando novamente a nossa sessao
session_name('minha_sessao');
session_start();
//incluindo nosso objeto 
include('meuobjeto.php');
 
//vendo os valores da variavel de sessao
var_dump($_SESSION['algo']);
//deserializando o objeto da sessao e atribuindo a uma variavel comum
$outra_var = unserialize($_SESSION['algo']);
 
//vendo o que eh a variavel
var_dump($outra_var);
//mostrando o numero
echo $outra_var->getAlgo();
?>

novamente, apenas as modificações ;)

6
include('meuobjeto.php');

muito importante essa linha, pois caso o nosso objeto não exista no documento em questão, o PHP não vai conseguir identificar a classe, e logo vai “dizer” que esse objeto é da classe ‘__PHP_Incomplete_Class”, portanto lembre-se de incluir a classe :)

9
var_dump($_SESSION['algo']);

aqui estamos vendo o conteúdo da variável de sessão para ver se o nosso “objeto” continua lá, e eis o que aparece:

string(56) "O:9:"MeuObjeto":1:{s:15:"�MeuObjeto�algo";i:1119598129;}"

realmente, a nossa string permanece ali, mas será que ela funciona? veremos agora :)

11
$outra_var = unserialize($_SESSION['algo']);

primeiro, deserializamos a nossa variável de sessão em uma variável qualquer…

14
var_dump($outra_var);

…e vemos que o seu valor continua o mesmo de antes :

object(MeuObjeto)#2 (1) {
  ["algo:private"]=>
  int(1119598129)
}

mas será que o nosso método ainda funciona? eis a resposta, vejam a saída da liha 16 :

1119598129

pois é, agora conseguimos realmente passar objetos entre páginas utilizando sessões :)
o melhor de tudo, é que, como já é sabido, sessões são nada menos do que arquivos armazenados no servidor, então quer dizer que podemos armazenar nossos objetos em arquivos puros, cookies e até mesmo banco de dados :D
e como o objeto serializado não passa de uma string, poderíamos também passa-lo pela URL usando o método GET, portanto, o limite é a sua imaginação :D

ah, antes que eu me esqueça, esse modo de “utilização” preserva tudo do objeto, não somente métodos e atributos, mas também heranças e tudo mais :)

sinceramente, eu acho isso que o PHP faz uma baita gambiarra, mas, paciência né, afinal o PHP ainda está “migrando” para ser uma linguagem orientada a objetos (atualmente ela apenas “tem suporte”), portanto, pode ser que no futuro isso melhore ;)

Confesso que testei apenas com sessões, portanto, não posso afirmar com 100% de certeza que funciona de outros métodos, por isso, peço que caso algum deles não funcione, me avisem :D

e antes de terminar este post, como será que a gente faria para alterar o valor de um objeto que está na sessão? simples, deserializamos ela em uma variavel, fazemos as alterações nessa variável, e depois serializamos ela novamente, assim :

1
2
3
4
5
6
7
8
9
session_name('minha_sessao');
session_start();
 
//deserializando um objeto jah serializado
$variavel = unserialize($_SESSION['algo']);
//mudando o valor de algum atributo
$variavel->setaAlgumValor('algo');
//re-serializando para a sessao
$_SESSION['algo'] = serialize($variavel);

simples assim :)

bom, espero que tenham gostado deste post, e lembre-se:

  • em caso de dúvidas, pergunte
  • achou um erro? diga

agora, deixo informações que podem ser relevantes para esse exemplo ter funcionado, que é onde eu testei :

Sistema operacional : Fedora Linux 10 com kernel 2.6.27.15-170.2.24.fc10.i686
versao do PHP : PHP 5.2.6 (cli) (built: Sep 13 2008 11:13:29)
versao do apache : Apache/2.2.10 (Unix)

referência das funções :
serialize()“, “unserialize()

até o próximo post, e não se esqueça de dar uma nota :)

VN:F [1.4.3_701]
Rating: 9.8/10 (5 votes cast)


Postagens parecidas/interessantes:

  1. 10 Responses to “PHP OO : Acessando Objetos em qualquer página”

  2. By Claiton on mar 6, 2009 | Reply

    Olha eu aqui tra vez!!!!

    Cara como sempre arrasando nos teus post’s and get’s(>D essa ja é véia ).
    Achei bem interessante e testarei com cookies, pq eu tenho um sério problema com sessions ¬¬@

    Dai te aviso.
    Cara eu acho extremamente interessante um post sobre os fundamentos da orietação a objetos,tipo o que é uma classe abstrata, pq declarar uma variável pública ou private e por ai vai.
    Sei q tem materiais desses na net, mas todos muito frios e gelados…
    Precisamos dessa tua didática invejável…
    Bom, tai o pedido!!!
    Flw
    Abraço!!!

    Quote

    VA:F [1.4.3_701]
    Rating: 5.0/5 (1 vote cast)
  3. By DragaO~ on mar 6, 2009 | Reply

    Eu ainda gosto dessa piada :D

    Eu vou postar algo sobre orientação a objetos, jutamente com o tutorial que eu estou preparando sobre PHP, porque quero abrangir também OO, e só não começo a fazer algo desse tipo agora, porque ainda acho que não sei o suficiente sobre o assunto :)
    “didática invejável”, eu? nah, eu não tenho muita paciência pra ensinar, sei lá, mas obrigado pelo elogio ^^

    Acho que tu é o único que sempre acompanha o blog, AHSEuhAUehUSheuHSeu
    E obrigado pelo comentário :)

    Quote

    VN:F [1.4.3_701]
    Rating: 5.0/5 (2 votes cast)
  4. By Jhonatan Serafim on abr 29, 2009 | Reply

    Daew cara, arrassou no post.
    Gostei bastante sobre esse artigo,
    continui assim.

    vlw, abração

    Quote

    VA:F [1.4.3_701]
    Rating: 0.0/5 (0 votes cast)
  5. By DragaO~ on abr 29, 2009 | Reply

    Obrigado pelo elogio :)

    Quote

    VN:F [1.4.3_701]
    Rating: 0.0/5 (0 votes cast)
  6. By claiton on abr 29, 2009 | Reply

    Bah, quanto tempo né?
    Passando só pq o teu blog me mandou um aviso sobre novos comentários!!!
    Abraço cara.
    To sem net em casa ¬¬@,
    por isso o sumiço,flw.
    Se precisar de algo me manda um e-mail.
    claitonweb@gmail.com
    Abraço!

    Quote

    VA:F [1.4.3_701]
    Rating: 0.0/5 (0 votes cast)
  7. By Jhonatan Serafim on abr 29, 2009 | Reply

    Tu saberia me dizer se dá para manipular objetos php usando javascript???

    Quote

    VA:F [1.4.3_701]
    Rating: 0.0/5 (0 votes cast)
  8. By DragaO~ on abr 29, 2009 | Reply

    ah, é complicado mesmo :D
    na hora em que eu aceitei esse comentário (o que te mandou email avisando), curiosamente me lembrei de ti na hora
    pode deixar que qualquer coisa dou um grito ;)
    ah, tu que sempre me falava de javascript, comprei um livro de jQuery agora ha pouco, e me parece bem interessante esse framework, depois te digo o que eu consegui fazer :D
    Abraço

    Quote

    VN:F [1.4.3_701]
    Rating: 0.0/5 (0 votes cast)
  9. By DragaO~ on abr 29, 2009 | Reply

    sim, sei :D
    mas infelizmente não é possível, são duas coisas completamente distintas
    enquanto o PHP roda no lado servidor o Javascript roda no lado cliente.
    o que tu pode fazer é manipular objetos javascript utilizando objetos php (não consigo imaginar um exemplo, mas é possível tu criar objetos dinâmicamente, em javascript, utilizando php)

    Quote

    VN:F [1.4.3_701]
    Rating: 4.0/5 (2 votes cast)
  10. By claiton on abr 30, 2009 | Reply

    Comprou qual livro? O do Maujor?
    Eu ja uso este framework a um tempão.
    Ele é excelente além de ter diversos plugins.
    Te diverte ai!
    Abraço!

    Quote

    VA:F [1.4.3_701]
    Rating: 0.0/5 (0 votes cast)
  11. By DragaO~ on abr 30, 2009 | Reply

    Aham, o do maujor :D
    provavelmente esse vai ser o primeiro livro que eu comprei que eu vou ler de uma ponta à outra, já que eu não sei lhufas de javascript (quem dirá jquery)
    valeu a pena, to brinando e achando bem legal :D
    Já vi até um próximo livro pra comprar, o maujor vai lançar ainda esse ano, perto de junho, um livro de ajax com jquery; certo que eu vou comprar :D
    mas ainda assim quero aprender javascript “braçal”, pois ainda cho que frameworks são legais, mas te “prendem” àquilo ;x

    Abraço

    Quote

    VN:F [1.4.3_701]
    Rating: 0.0/5 (0 votes cast)

Deixe um comentário

Vai postar algum código? Leia isso antes