ホームページ >データベース >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 キーワードを使用する場合とは異なり、依存関係の注入により、クラスが特定の依存関係に依存していることが明確になります。

その他の方法

データベース オブジェクトにアクセスするもう 1 つの方法は、次のように、データベース オブジェクトを必要とするメソッドに直接挿入することです。

<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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。