"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > 클래스 내에서 데이터베이스 개체에 액세스할 때 전역 변수를 방지하는 방법은 무엇입니까?

클래스 내에서 데이터베이스 개체에 액세스할 때 전역 변수를 방지하는 방법은 무엇입니까?

2024년 12월 21일에 게시됨
검색:246

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

클래스 내에서 전역 변수 사용

페이지 매김 기능을 생성하려면 클래스 내에서 데이터베이스 개체에 액세스해야 합니다. 그러나 클래스 내부의 외부 변수에 액세스하려고 하면 오류가 발생할 수 있습니다. 이 문제를 처리할 수 있는 가능한 솔루션을 살펴보겠습니다.

"객체가 아닌 멤버 함수 query() 호출"이라는 치명적인 오류를 해결하려면 클래스 내에서 데이터베이스 객체에 액세스할 수 있어야 합니다. 전역 변수를 사용하는 대신, 더 적절한 접근 방식은 데이터베이스 개체를 클래스나 해당 메서드에 주입하는 것입니다.

종속성 주입

한 가지 방법은 데이터베이스를 주입하는 것입니다. 아래와 같이 클래스 생성자에 객체를 추가합니다:

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);
    }
}

이를 통해 페이지 매김 클래스가 데이터베이스 객체에 직접 액세스할 수 있습니다.

메서드 주입

또 다른 옵션은 데이터베이스 객체를 특정 클래스에 주입하는 것입니다. 이를 요구하는 메소드:

$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);
    }
}

이는 여러 메서드에 다양한 데이터베이스 요구 사항이 있을 때 더 많은 유연성을 제공합니다.

종속성 주입의 이점

전역 변수를 사용하는 것과 비교하여 종속성 주입은 다음을 제공합니다. 몇 가지 장점:

  • 명시적으로 정의된 종속성: 어떤 개체가 종속되는지 명확하게 합니다. 다른 클래스에서는 숨겨진 종속성을 제거합니다.
  • 느슨한 결합: 클래스는 테스트 목적으로 다른 데이터베이스 개체 또는 모의 데이터베이스 개체로 쉽게 전환할 수 있습니다.
  • 테스트 가능성: 단위 테스트는 데이터베이스 기능을 방해하지 않고 클래스에만 집중할 수 있습니다.
  • 확장성: 다음을 사용할 수 있습니다. 주요 코드 변경 없이 여러 데이터베이스 또는 기타 프레임워크를 사용할 수 있습니다.
최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3