>데이터 베이스 >MySQL 튜토리얼 >PHP 클래스의 데이터베이스에 액세스할 때 전역 변수를 방지하려면 어떻게 해야 합니까?

PHP 클래스의 데이터베이스에 액세스할 때 전역 변수를 방지하려면 어떻게 해야 합니까?

Linda Hamilton
Linda Hamilton원래의
2025-01-18 00:17:09354검색

How Can I Avoid Global Variables When Accessing a Database in a PHP Class?

PHP 클래스에서 데이터베이스에 액세스할 때 전역 변수를 사용하지 마세요

pagi 클래스 메서드의 전역 변수 $db에 액세스하는 동안 코드에서 오류가 발생했습니다. 이 오류는 query() 메서드가 객체가 아닌 개체에서 호출되었음을 나타냅니다. 이는 $db 변수를 클래스에서 사용할 수 없음을 나타냅니다.

의존성 주입 솔루션

이 문제를 해결하기 위해 권장되는 방법은 종속성 주입을 사용하고 전역 변수에 의존하는 대신 데이터베이스 개체를 매개변수로 클래스에 전달하는 것입니다. 예시는 다음과 같습니다.

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

$pagination = new Paginator($db);
$records = $pagination->get_records("SELECT * FROM `table`");</code>
<code class="language-php">class Paginator
{
    private $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>

이 예에서는 생성자를 통해 Paginator 개체를 종속성으로 전달하는 DB_MySQL이라는 새 클래스를 만듭니다. 이렇게 하면 데이터베이스 인스턴스가 클래스에 주입되어 클래스 내의 메서드에서 사용할 수 있게 됩니다.

의존성 주입의 장점

종속성 주입을 사용하면 다음과 같은 장점이 있습니다.

  • 분리: DB_MySQL 클래스에 대한 직접적인 종속성에서 클래스를 분리하여 더 유연하고 테스트하기 쉽게 만듭니다.
  • 테스트 가능성: 종속성을 모의하고 테스트 클래스를 격리할 수 있으므로 단위 테스트가 더 쉬워집니다.
  • 숨겨진 종속성 방지: global 키워드를 사용하는 것과 달리 종속성 주입을 사용하면 클래스가 특정 종속성에 종속된다는 점을 명확하게 알 수 있습니다.

다른 방법

데이터베이스 개체에 액세스하는 또 다른 방법은 다음과 같이 해당 개체를 필요로 하는 메서드에 직접 삽입하는 것입니다.

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

$pagination = new Paginator();
$records = $pagination->get_records("SELECT * FROM `table`", $db);</code>
<code class="language-php">class Paginator
{
    public function get_records($q, DB_MySQL $db)
    {
        $x = $db->query($q);
        return $db->fetch($x);
    }
}</code>

그러나 생성자를 통한 종속성 주입은 더 나은 캡슐화와 테스트 가능성을 제공하므로 일반적으로 선호됩니다.

위 내용은 PHP 클래스의 데이터베이스에 액세스할 때 전역 변수를 방지하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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