Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Pedro Roccon

Chamando uma classe dentro da outra

Recommended Posts

Galera, primeiramente bom dia. Obrigado por se interessarem no tópico. Bom vamos lá, tenho 2 classes, uma já é nativa do PHP: a MySQLi. Primeiramente eu abro uma conexão com meu banco de dados no meu script, e depois disso eu tenho outra classe para inserir os dados de um idioma, bem simples mesmo somente para estudo. Bom vou resumir o código para vocês abaixo:

 

<?php

  $mysqli = new mysqli('localhost', 'root', '', 'exemplo');

  class Idiomas {

    # ... Início da função

    public function insertLanguage() {
      $sql = $mysqli->prepare('INSERT INTO idioma(nome) VALUES("Russo")');
      $sql->execute();
    }

  }

  $idiomas = new Idiomas();
  $idiomas->insertLanguage();
  
?>

Feito isso o PHP me retorna o seguinte erro:

 

Notice: Undefined variable: mysqli in C:\Users\Windows7\Desktop\Web\concept.php on line 10

Fatal error: Call to a member function prepare() on a non-object in C:\Users\Windows7\Desktop\Web\concept.php on line 10

 

O que está acontecendo de errado? Ele não enxerga o objeto MySQLi dentro de uma outra classe? Esse método de pensar está correto, ou eu deveria fazer de outro jeito?

 

Já vi o pessoal abrindo a conexão dentro da própria classe Idiomas, porém eu iria ter várias classes como por exemplo: Usuários, Filmes, entre outras... Abrir uma conexão em todas elas acho que não seria semântico.

 

Desde já agradeço.

Muito obrigado!

 

Abraços

Compartilhar este post


Link para o post
Compartilhar em outros sites

O que está acontecendo de errado? Ele não enxerga o objeto MySQLi dentro de uma outra classe? Esse método de pensar está correto, ou eu deveria fazer de outro jeito?

 

O código mysqli não está dentro de outra classe, está apenas solto no código.

 

<?php

  class Idiomas {


    # ... Início da função

    public function insertLanguage() {
      $mysqli = new mysqli('localhost', 'root', '', 'exemplo');
      $sql = $mysqli->prepare('INSERT INTO idioma(nome) VALUES("Russo")');
      $sql->execute();
    }

  }

  $idiomas = new Idiomas();
  $idiomas->insertLanguage();
  
?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Entendi Rual Silva, mas eu terei que fazer isso para todas as classes? Vou ter várias classes e precisarei instanciar a conexão toda vez em cada classe? Queria 1 classe que você instanciava apenas uma única vez referente à conexão ao banco de dados e outras classes poderiam utilizar ela, por exemplo:

 

<?php

  $mysqli = new mysqli('localhost', 'root', '', 'exemplo');

  class Idiomas {

    # ... Início da função

    public function insertLanguage() {
      $sql = $mysqli->prepare('INSERT INTO idioma(nome) VALUES("Russo")');
      $sql->execute();
    }

  }
  class Filmes {

    public function insertMovie() {
      $sql = $mysqli->prepare('INSERT INTO filmes(nome) VALUES("007 Die Another Day")');
      $sql->execute();
    }

  }


  $idiomas = new Idiomas();
  $idiomas->insertLanguage();

  $filmes = new Filmes();
  $filmes->insertMovie();
  
?>

Como visto, instanciei apenas uma vez e as outras classes puxam ela, se vocês souberem outro método de fazer algo semelhante eu estou aberto à idéias.

 

Obrigado :D

Compartilhar este post


Link para o post
Compartilhar em outros sites

Provavelmente vai ser complicado isso que vou te falar, mas você pode pesquisar um pouco sobre DocTrine...

 

Voltando ao assunto:

 

Você instanciou fora da classe, então sua classe não vai enxergar isso.

 

Você pode escrever uma classe para funções do banco de dados e dpois instancia-la dentro de suas classes:

 

<?php
Class Connection {
   private $con = null;
   public function __construct(){
      $this->con = new mysqli(...);
      return $this;
  }
  
  public function insert($table, $data){
     .......
  }
  public function update($table, $data, $id){
     .......
  }
  public function delete($table, $id){
     .......
  }
}

Class Livros {
   private $con = null;
   public function __construct(){
       $this->con = new Connection();
   }

  public function cadastrarLivro($dados){
      $this->con->insert('livros', $dados);
  }
}

É só um exemplo...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Hmmm, entendi, acho que deste modo então conseguiria o que eu preciso. Vou pesquisar pro DocTrine, já ouvi falar algo à respeito. É uma boa prática ou tem maneiras mais semânticas de fazer isso?

 

Muito obrigado, Raul Silva :D

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tem algumas outras boas maneiras também, mas não vou conseguir te falar agora (sono) Rs

 

Vou deixar para alguém comentar.

 

De nada =)

 

Tudo bem Raul Silva, você já me ajudou muito dando essa dica. Muito obrigado mesmo! :D

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.