「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > クラス内のデータベース オブジェクトにアクセスするときにグローバル変数を回避するにはどうすればよいですか?

クラス内のデータベース オブジェクトにアクセスするときにグローバル変数を回避するにはどうすればよいですか?

2024 年 12 月 21 日に公開
ブラウズ:536

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

クラス内でのグローバル変数の使用

ページネーション機能の作成には、クラス内からデータベース オブジェクトへのアクセスが含まれます。ただし、クラス内の外部変数にアクセスしようとすると、エラーが発生する可能性があります。この問題を処理するために考えられる解決策を詳しく見てみましょう。

致命的なエラー「非オブジェクトのメンバー関数 query() の呼び出し」に対処するには、データベース オブジェクトがクラス内でアクセスできる必要があります。グローバル変数を使用する代わりに、より適切なアプローチは、データベース オブジェクトをクラスまたはそのメソッドに注入することです。

依存関係の注入

1 つの方法は、データベースを注入することです。以下に示すように、オブジェクトをクラス コンストラクターに追加します。

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