+3

Diferença entre $obj->func(); para obj::func();

criado por Ricardo Landim em 20/07/2002 3:02pm
Qual a diferença de se usar esses codigos abaixo

<?
class obj{
function func(){
$var="teste";
return $teste;
}
}
/* Caso 1 */
$obj=new obj();
echo $obj->func();

/*Caso 2*/
echo obj::func();

?>

Alem da sintaxe existe algo diferente ???

Lista de Respostas:

+1
13/08/2002 9:42am
(~22 anos atrás)
Eduardo Dias respondeu:
Na primeira situação é instanciado um objeto e assim você acessa os métodos daquele objeto.

Já no segundo caso você acessa os métodos diretamente na classe, podendo ter a seguinte situação:

objeto instanciado
$meuobj = new NomeClasse();
$meuobj->metodo();

diretamente na classe
NomeClasse::metodo();


Qualquer dúvida entre em contato,

Eduardo Dias

0
22/07/2002 9:22am
(~22 anos atrás)
Não tenho muita certeza.... mas acho que no caso 1 vc está criando o objeto novo.... e no segundo vc o instancia.

0
22/07/2002 7:46pm
(~22 anos atrás)
Ricardo Landim respondeu:
Fiquei sabendo que havia uma mudança no acesso de variaveis globais... o acesso a elas não muda ???

0
15/09/2002 1:54pm
(~22 anos atrás)
Daniel Melo respondeu:
Esta confusão acontece porque o modelo de objetos do PHP é muito falho.

A sintaxe $objeto->metodo() seria utilizado para chamar metodos de instancia. Metodos que dizem respeito a um determinado objeto. Tecnicamente falando, metodos que tenham a referencia $this (o proprio objeto) em seu corpo.

A sintaxe Classe::metodo() seria utilizado para chamar metodos de classe, ou metodos estaticos. Estes metodos nao dizem respeito a nenhuma instancia em particular (nao tem referencia a $this no corpo).

Acontece, que o PHP nao permite definir se os metodos sao estaticos ou de instancia na declaracao de classes. Ai comeca a confusão.
O PHP permite voce utilizar qualquer uma das sintaxes para chamar um metodos em uma classe.

1 - Se o metodo for de instancia :

Voce tem usar :
$obj = new Classe;
$obj->metodo();

Mas tambem pode usar :
$obj = new Classe;
$obj::metodo();

2 - Se o metodo for de classe (ou estatico) :

Voce tem que usar

Classe::metodo();

Se voce usar Classe::metodo(), em um metodo de instancia, vai dar erro.

Este apenas um dos topicos confusos do modelo de objetos do PHP, que finalmente vai ser corrigido no Zend Engine 2 (suposto PHP5).


0
28/06/2003 2:47pm
(~21 anos atrás)
No primeiro vc cria um instância do objeto, já no segundo você acessa diretamente qualquer metodo que esta na clase.
ex.:
<?php
class teste{
var nome;
function teste($a){
echo "Teste $a";
$this->nome=$a;
}
?>
<?php
class teste2 extends teste{
var $p;
function teste2($a){
teste::teste();
$this->a = $a;
}
}
?>

0
10/04/2004 6:22am
(~20 anos atrás)
Alessander Thomaz respondeu:
Na verdade o php é falho em OOP até a versão 4, na 5 está bem interessante o suporte a OOP, se bem que isso tudo é bastante questionável, se é ou não é importante, assim como a herança multipla que o Java não tem e dizem que é um dos principios básicos de orientação a objetos.

Cada louco com suas loucuras :-) ficar discutindo se herança multipla é ou não necessário, é uma falta do que fazer, risos.

O que importa é que a linguagem tem ou não tem. E isso é um limitante.

Abraços,
Alessander

0
27/12/2004 2:53pm
(~20 anos atrás)
Em relação a métodos eu não sei... mas em relação a classes, quando herdamos uma da outra, a mesma acessará o construtor da classe pai.
Ex:

Observe a linha "Pessoa::Pessoa($nome,$idade,$endereco,$telefone);". É aqui onde invocamos o construtor da classe pai.

<?php

class Pessoa{

var $nome;
var $idade;
var $endereco;
var $telefone;

//Construtor de Pessoa
function Pessoa($nome,$idade,$endereco,$telefone){
$this->nome=$nome;
$this->idade=$idade;
$this->endereco=$endereco;
$this->telefone=$telefone;
}

//Acessores
function getNome(){
return $this->nome;
}

function getIdade(){
return $this->idade;
}

function getEndereco(){
return $this->endereco;
}

function getTelefone(){
return $this->telefone;
}
}
?>




<?php

require_once("Pessoa.php");

class PessoaFisica extends Pessoa{

var $cpf;
//Construtor
function PessoaFisica($nome,$idade,$endereco,$telefone,$cpf){
Pessoa::Pessoa($nome,$idade,$endereco,$telefone);
$this->cpf=$cpf;
}

//Acessor
function getCpf(){
return $this->cpf;
}
}
?>

Nova Resposta:

(Você pode usar tags como <b>, <i> ou <code>. URLs serão convertidas para links automaticamente.)