Diferença entre $obj->func(); para obj::func();
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 ???
<?
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 ???
comentários (0)
suspender
Lista de Respostas:
13/08/2002 9:42am
(~22 anos atrás)
(~22 anos atrás)
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
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
22/07/2002 9:22am
(~22 anos atrás)
(~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.
22/07/2002 7:46pm
(~22 anos atrás)
(~22 anos atrás)
Fiquei sabendo que havia uma mudança no acesso de variaveis globais... o acesso a elas não muda ???
15/09/2002 1:54pm
(~22 anos atrás)
(~22 anos atrás)
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).
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).
28/06/2003 2:47pm
(~21 anos atrás)
(~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;
}
}
?>
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;
}
}
?>
10/04/2004 6:22am
(~20 anos atrás)
(~20 anos atrás)
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
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
27/12/2004 2:53pm
(~20 anos atrás)
(~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;
}
}
?>
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;
}
}
?>