ホームページ >データベース >mysql チュートリアル >依存関係の注入を使用して「非オブジェクトのメンバー関数 query() の呼び出し」エラーを回避する方法

依存関係の注入を使用して「非オブジェクトのメンバー関数 query() の呼び出し」エラーを回避する方法

Patricia Arquette
Patricia Arquetteオリジナル
2025-01-18 00:23:11922ブラウズ

How to Avoid

クラスメソッドでのグローバル変数の回避: ページネーションの例

ページネーション機能を構築するときに、「非オブジェクトのメンバー関数 query() を呼び出します。」というエラーが発生する場合があります。これは多くの場合、クラス外で宣言された変数にクラス自体の内部からアクセスすることに起因します。 より良い解決策を探ってみましょう。

依存関係の注入: 推奨されるアプローチ

依存性注入はクリーンなソリューションを提供します。 グローバル変数に依存する代わりに、必要なオブジェクト (データベース接続など) をクラスに直接渡します。 これはコンストラクターを通じて行われます:

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

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