Rumah >pangkalan data >tutorial mysql >Bagaimana untuk Mengelakkan Ralat 'Panggil ke pertanyaan fungsi ahli () pada bukan objek' Menggunakan Suntikan Ketergantungan?

Bagaimana untuk Mengelakkan Ralat 'Panggil ke pertanyaan fungsi ahli () pada bukan objek' Menggunakan Suntikan Ketergantungan?

Patricia Arquette
Patricia Arquetteasal
2025-01-18 00:23:11922semak imbas

How to Avoid

Mengelakkan Pembolehubah Global dalam Kaedah Kelas: Contoh Penomboran

Apabila membina fungsi penomboran, anda mungkin menghadapi ralat "Panggil ke pertanyaan fungsi ahli() pada bukan objek." Ini selalunya berpunca daripada mengakses pembolehubah yang diisytiharkan di luar kelas dari dalam kelas itu sendiri. Mari terokai penyelesaian yang lebih baik.

Suntikan Kebergantungan: Pendekatan Pilihan

Suntikan kebergantungan menyediakan penyelesaian yang bersih. Daripada bergantung pada pembolehubah global, kami menghantar objek yang diperlukan (seperti sambungan pangkalan data) terus ke kelas. Ini dilakukan melalui pembina:

<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>

Kaedah Suntikan: Alternatif

Sebagai alternatif, anda boleh menyuntik objek pangkalan data terus ke dalam kaedah yang memerlukannya:

<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>

Mengapa Suntikan Ketergantungan Adalah Unggul

Suntikan kebergantungan menawarkan kelebihan yang ketara berbanding menggunakan pembolehubah global:

  • Ketergantungan Eksplisit: Kod dengan jelas menunjukkan perkara yang bergantung pada setiap kelas, meningkatkan kebolehbacaan dan kebolehselenggaraan.
  • Gandingan Longgar: Kelas tidak terikat rapat dengan pelaksanaan tertentu. Anda boleh menukar sistem pangkalan data atau kebergantungan lain dengan mudah tanpa mengubah logik kelas teras.
  • Kebolehujian: Ujian unit menjadi lebih mudah. Anda boleh dengan mudah mengejek kebergantungan semasa ujian, mengasingkan kelas yang sedang diuji.

Ringkasnya, suntikan kebergantungan ialah amalan terbaik untuk mengurus kebergantungan dan sumber yang dikongsi, mempromosikan kod yang lebih bersih, lebih mantap dan boleh diuji. Elakkan perangkap pembolehubah global dengan menggunakan pendekatan ini.

Atas ialah kandungan terperinci Bagaimana untuk Mengelakkan Ralat 'Panggil ke pertanyaan fungsi ahli () pada bukan objek' Menggunakan Suntikan Ketergantungan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn