Ir para conteúdo
Fórum Script Brasil
  • 0

classes


McBlade

Pergunta

Olá amigos. Comecei a programar PHPOO agora.

Tenho 2 classes, mas na hora de executar meu PHP está dando a seguinte mensagem:

Fatal error: Cannot access empty property in C:\apache\htdocs\teste\teste.php on line 45

Segue o código:

class Contato {
  public $fone1;
  public $fone2;
  public $email;
  public $MSN;
}

class Cliente {
  public $codigo;
  public $nome;
  public $contato;
  function __construct() {
    if (!isset($contato))
      $contato = new Contato();
  }
  function __destruct() {
    if (isset($contato))
      unset($contato);
  }
}

...

<input type="text" value="<?php echo $cliente->$contato->$email; //<---- ERRO DA LINHA 45 ?>">

Gostaria de criar na var $contato a classe Contato para ficar um código mais limpo. Como faz isso?

Depois, aproveitando, se eu quiser que $contato seja um array da classe Contato?

Link para o comentário
Compartilhar em outros sites

5 respostass a esta questão

Posts Recomendados

  • 0

Olá tudo bem?!

POOPHP! Ah que coisa boooa! =D

Estude um pouco de encapsulamento em objetos é uma ótima opção para quem está começando. A teoria de objetos é meio complicada para quem começa mas depois é uma mão na roda! =D

Primeiramente, aquele isset no construtor do cliente está meio estranho; se tu cria um cliente sem passar parâmetros, obviamente que tu vais tem que criar um novo contato =)

Faça assim:

class Contato {

public $fone1;

public $fone2;

public $email;

public $MSN;

}

class Cliente {

public $codigo;

public $nome;

public $contato;

function __construct() {

$this->contato = new Contato();

}

}

Para setar variáveis de objeto, é NECESSÁRIO utilizar a variável de objeto $this. Por que Sr Wanderson? Pois bem, cada vez que tu seta uma variável no php, se ela não existir, o php cria uma alocação nova para ela. Como não existe $this, o php vai criar uma nova var pra ti, e não utilizar o $this->contato do objeto, entendeste? É uma diferença que existe de quem migra de outras linguagens oo para php. O __destruct() não é necessário, só em último caso como desconexões de banco de dados =)

Abraços! =D

:ninja: :ninja: :ninja:

Para você tornar um array de contatos, faça um método que insere contatos na classe Cliente:

public function insertContato(Contato $contato) {
  array_push($this->contato,$contato);
}
Lembra de no construtor da classe Cliente inicializar:
$this->contato = array();

Editado por Wanderson Camargo
Link para o comentário
Compartilhar em outros sites

  • 0

Obrigado pela resposta [Matrix mode ON]mr. Wanderson[Matrix mode OFF] :P

Já trabalho com Delphi e sei conceito de OO mas em PHP é um pouco diferente do meu habitual ^^. Também sei um pouco de Javascript que têm me ajudado muito e estou aprendendo Ajax para desenvolver esta aplicação que é para um cliente (ou seja Preciso fazer se não minha cabeça rola xD).

Só duas pequenas dúvidas pois não testei o código ainda

1º Eu ví que você utiliza "$this->contato" não seria "$this->$contato"?

Quando eu for referenciar fone1 vai ser $cliente->contato->fone1 ou $cliente->$contato->$fone1?

2º No destrutor eu preciso matar as classes filhas ou o PHP faz automatico pra mim? Se não, como fazer?

Editado por McBlade
Link para o comentário
Compartilhar em outros sites

  • 0

^_^

É assim, o php é muito, mas muito dinâmico. Existe uma coisa que eu acho que só no php existe: variáveis de variáveis. Como elas funcionam? É assim: Digamos que tu por algum motivo necessitas trabalhar com muitas variáveis que somente mudam de número no final da linha, digamos. Assim, você as seta como:

$var0 = "PHP";
$var1 = "JAVA";
$var2 = "JS";
Mas tu não queres acessá-las uma por uma então você faz um for para tal processo:
for($i=0;$i<3;$i++)
  echo $var$i;
É engraçado né? Mas são coisas que existem ^_^. Se tu utilizares $this->$contato, a variável $contato ainda não foi setada, então o php irá interpretar como $this->"", digamos. Como ficaria?
$contato = "nome";
$this->$contato = "Wanderson"; // $this->nome = "Wanderson"

Isto é utilizado em encapsulamento de variáveis, mas a segurança fica muito, mas muito baixa e todos os conceitos do encapsulamento são quebrados. =)

Espero ter ajudado!

Ah, ao final de cada Script o php destroi tudo =) Até conexões de banco =D O __destruct() seria mais utilizado se por algum motivo, quando, digamos, finalizares um objeto que não está correto, avisar em algum lugar, como um ponteiro de banco que não foi fechado =)

Abraços!

Link para o comentário
Compartilhar em outros sites

  • 0

Ajudou e muito. Eu tentei aqui $this->$contato o o PHP me diz que a variável ainda não foi criada. Quanto ao destruct? Preciso matar as variáveis do tipo de outra classe criadas dentro dela ou o PHP faz pra mim?

Não vi suas observações quanto ao destruct :blush: estorna esse post :P

Editado por McBlade
Link para o comentário
Compartilhar em outros sites

  • 0

Eu adicionei no post acima =)

Não pois o php mata tudo pra ti no final do script =D

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...