"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Como evitar variáveis ​​globais ao acessar um objeto de banco de dados dentro de uma classe?

Como evitar variáveis ​​globais ao acessar um objeto de banco de dados dentro de uma classe?

Publicado em 2024-12-21
Navegar:896

How to Avoid Global Variables When Accessing a Database Object within a Class?

Usando variáveis ​​globais dentro de uma classe

A criação da funcionalidade de paginação envolve acessar um objeto de banco de dados de dentro de uma classe. Entretanto, tentar acessar uma variável externa dentro da classe pode levar a erros. Vamos nos aprofundar nas soluções possíveis para lidar com esse problema.

Para resolver o erro fatal "Chamar uma função de membro query() em um não-objeto", o objeto do banco de dados precisa estar acessível dentro da classe. Em vez de usar variáveis ​​globais, uma abordagem mais apropriada é injetar o objeto do banco de dados na classe ou em seus métodos.

Injeção de dependência

Um método é injetar o banco de dados objeto no construtor da classe, conforme mostrado abaixo:

include_once("pagi.php");

$db = new DB_MySQL("localhost", "root", "", "test"); // connect to the database

$pagination = new Paginator($db);
$records = $pagination->get_records("SELECT * FROM `table`");

class Paginator
{    
    protected $db;

    public function __construct(DB_MySQL $db)
    {
        $this->db = $db;
    }

    public function get_records($q) {
        $x = $this->db->query($q);
        return $this->db->fetch($x);
    }
}

Isso permite que a classe de paginação acesse o objeto do banco de dados diretamente.

Method Injection

Outra opção é injetar o objeto do banco de dados no específico método que o requer:

$pagination = new Paginator();
$records = $pagination->get_records("SELECT * FROM `table`", $db);

class Paginator
{
    public function get_records($q, DB_MySQL $db) {
        $x = $db->query($q);
        return $db->fetch($x);
    }
}

Isso fornece mais flexibilidade quando vários métodos têm requisitos de banco de dados variados.

Benefícios da injeção de dependência

Em comparação ao uso de variáveis ​​globais, a injeção de dependência oferece diversas vantagens:

  • Dependências explicitamente definidas: Deixa claro quais objetos dependem de outros, eliminando dependências.
  • Acoplamento solto: A classe pode facilmente mudar para um objeto de banco de dados diferente ou simulado para fins de teste.
  • Testabilidade: Os testes de unidade podem concentre-se apenas na classe sem interferir na funcionalidade do banco de dados.
  • Extensibilidade: Permite o uso de vários bancos de dados ou outras estruturas sem grande código mudanças.
Tutorial mais recente Mais>

Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.

Copyright© 2022 湘ICP备2022001581号-3