>데이터 베이스 >MySQL 튜토리얼 >종속성 주입을 사용하여 '객체가 아닌 멤버 함수 query() 호출' 오류를 방지하는 방법은 무엇입니까?

종속성 주입을 사용하여 '객체가 아닌 멤버 함수 query() 호출' 오류를 방지하는 방법은 무엇입니까?

Patricia Arquette
Patricia Arquette원래의
2025-01-18 00:23:11922검색

How to Avoid

클래스 메소드에서 전역 변수 방지: 페이지 매김 예

페이지 매기기 기능을 구축할 때 "비객체에서 쿼리() 멤버 함수 호출" 오류가 발생할 수 있습니다. 이는 클래스 자체 내에서 클래스 외부에 선언된 변수에 액세스하는 데서 비롯되는 경우가 많습니다. 더 나은 솔루션을 찾아보겠습니다.

의존성 주입: 선호되는 접근 방식

종속성 주입은 깔끔한 솔루션을 제공합니다. 전역 변수에 의존하는 대신 필요한 개체(예: 데이터베이스 연결)를 클래스에 직접 전달합니다. 이는 생성자를 통해 수행됩니다.

<code class="language-php">$db = new DB_MySQL("localhost", "root", "", "test"); // Database connection
include_once("pagi.php");

$pagination = new Paginator($db);
$records = $pagination->get_records("SELECT the, fields, you, want, to retrieve 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);
    }
}</code>

메소드 주입: 대안

또는 데이터베이스 개체를 필요한 메서드에 직접 삽입할 수도 있습니다.

<code class="language-php">$db = new DB_MySQL("localhost", "root", "", "test"); // Database connection
include_once("pagi.php");

$pagination = new Paginator();
$records = $pagination->get_records("SELECT the, fields, you, want, to retrieve FROM `table`", $db);

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

의존성 주입이 우수한 이유

종속성 주입은 전역 변수를 사용하는 것보다 상당한 이점을 제공합니다.

  • 명시적 종속성: 코드는 각 클래스가 무엇에 의존하는지 명확하게 표시하여 가독성과 유지 관리성을 향상시킵니다.
  • 느슨한 결합: 클래스는 특정 구현에 단단히 묶여 있지 않습니다. 핵심 클래스 로직을 변경하지 않고도 데이터베이스 시스템이나 기타 종속성을 쉽게 교체할 수 있습니다.
  • 테스트 용이성: 단위 테스트가 훨씬 간단해졌습니다. 테스트 중에 종속성을 쉽게 모의하여 테스트 중인 클래스를 격리할 수 있습니다.

요약하자면, 종속성 주입은 종속성 및 공유 리소스를 관리하고 더욱 깨끗하고 강력하며 테스트 가능한 코드를 촉진하기 위한 모범 사례입니다. 이 접근 방식을 채택하여 전역 변수의 함정을 피하세요.

위 내용은 종속성 주입을 사용하여 '객체가 아닌 멤버 함수 query() 호출' 오류를 방지하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.