Suntikan Ketergantungan (DI) ialah corak reka bentuk yang digunakan dalam pembangunan perisian untuk meningkatkan fleksibiliti kod, kebolehujian dan kebolehselenggaraan. Ia amat popular dalam pengaturcaraan berorientasikan objek (OOP), termasuk dalam PHP. DI membenarkan kelas menerima kebergantungannya (iaitu, objek yang diperlukan untuk berfungsi) daripada sumber luaran dan bukannya menciptanya secara dalaman. Ini memisahkan kelas daripada kebergantungannya, mempromosikan pangkalan kod yang lebih modular, boleh diselenggara dan boleh diuji.
Dalam artikel ini, kami akan meneroka apakah suntikan pergantungan, cara ia berfungsi dalam PHP dan sebab ia penting untuk menulis kod yang boleh diselenggara dan boleh diuji.
Suntikan Ketergantungan merujuk kepada proses menghantar objek atau perkhidmatan yang diperlukan oleh kelas (kebergantungannya) dari luar kelas, bukannya kelas yang menciptanya sendiri. Kebergantungan ini boleh menjadi objek seperti sambungan pangkalan data, perkhidmatan atau pustaka luaran yang diperlukan oleh kelas untuk melaksanakan operasinya.
Dalam pengaturcaraan berorientasikan objek tradisional, kelas boleh membuat seketika objek yang bergantung padanya, yang menjadikannya berganding rapat dengan kebergantungan tersebut. Ini boleh membawa kepada kod yang sukar untuk diubah suai, diuji dan dilanjutkan.
Dengan Suntikan Ketergantungan, tanggungjawab mencipta dan mengurus kebergantungan dialihkan ke luar kelas. Ini menjadikan kod lebih fleksibel dan lebih mudah untuk diuji kerana anda boleh menyuntik kebergantungan palsu semasa menguji.
Pertimbangkan contoh mudah berikut bagi kelas DatabaseService yang bergantung pada kelas DatabaseConnection:
class DatabaseService { private $dbConnection; public function __construct() { $this->dbConnection = new DatabaseConnection(); // Creates its own dependency } public function fetchData() { // Uses the database connection to fetch data return $this->dbConnection->query('SELECT * FROM users'); } }
Dalam contoh ini, kelas DatabaseService mencipta contoh DatabaseConnection sendiri. Ini menyukarkan untuk menggantikan DatabaseConnection dengan kelas yang berbeza atau mengejeknya untuk tujuan ujian.
class DatabaseService { private $dbConnection; // Dependency is injected through the constructor public function __construct(DatabaseConnection $dbConnection) { $this->dbConnection = $dbConnection; // Dependency is passed in } public function fetchData() { // Uses the injected database connection to fetch data return $this->dbConnection->query('SELECT * FROM users'); } }
Dalam contoh yang dipertingkatkan ini, kelas DatabaseService tidak mencipta tika DatabaseConnection. Sebaliknya, objek DatabaseConnection disalurkan dari luar (disuntik ke dalam pembina). Ini menjadikan kelas lebih fleksibel dan dipisahkan daripada pelaksanaan khusus DatabaseConnection. Kini, anda boleh menggantikan DatabaseConnection dengan mudah dengan objek olok-olok atau pelaksanaan pangkalan data yang berbeza.
Terdapat tiga kaedah utama untuk melaksanakan suntikan pergantungan:
class DatabaseService { private $dbConnection; public function __construct() { $this->dbConnection = new DatabaseConnection(); // Creates its own dependency } public function fetchData() { // Uses the database connection to fetch data return $this->dbConnection->query('SELECT * FROM users'); } }
class DatabaseService { private $dbConnection; // Dependency is injected through the constructor public function __construct(DatabaseConnection $dbConnection) { $this->dbConnection = $dbConnection; // Dependency is passed in } public function fetchData() { // Uses the injected database connection to fetch data return $this->dbConnection->query('SELECT * FROM users'); } }
class SomeClass { private $service; public function __construct(Service $service) { $this->service = $service; } }
Dengan menyuntik kebergantungan daripada menciptanya di dalam kelas, DI memisahkan kelas daripada pelaksanaan tertentu. Ini menjadikannya lebih mudah untuk menukar atau mengubah suai kebergantungan tanpa menjejaskan kelas yang bergantung padanya. Gandingan longgar ini menjadikan sistem lebih modular dan fleksibel.
Pengujian menjadi lebih mudah dengan suntikan kebergantungan kerana anda boleh menggantikan kebergantungan sebenar dengan objek olok-olok atau rintisan. Ini amat berguna untuk ujian unit, di mana anda ingin mengasingkan gelagat kelas yang sedang diuji.
Sebagai contoh, jika anda ingin menguji kelas DatabaseService, anda boleh menyuntik sambungan pangkalan data palsu yang mensimulasikan tingkah laku pangkalan data, menghapuskan keperluan untuk sambungan pangkalan data sebenar semasa ujian.
class SomeClass { private $service; public function setService(Service $service) { $this->service = $service; } }
Apabila aplikasi anda berkembang, pemfaktoran semula menjadi satu keperluan. Dengan DI, pemfaktoran semula adalah lebih mudah kerana kebergantungan kelas anda adalah jelas dan luaran. Anda boleh mengemas kini atau menggantikan kebergantungan tanpa mengubah suai kelas bergantung, menjadikannya lebih mudah untuk melanjutkan sistem tanpa merosakkan fungsi.
Memandangkan kelas tidak terikat rapat dengan kebergantungan tertentu, ia boleh digunakan semula dalam konteks yang berbeza. Contohnya, kelas DatabaseService boleh digunakan dengan sambungan pangkalan data yang berbeza (cth., MySQL, PostgreSQL, SQLite) dengan hanya menyuntik objek sambungan pangkalan data yang berbeza.
Apabila bekerja dengan pangkalan kod yang besar, mengurus kebergantungan secara manual boleh menjadi satu cabaran. Rangka kerja DI, seperti PHP-DI atau Symfony DependencyInjection, boleh membantu mengautomasikan suntikan kebergantungan, menjadikannya lebih mudah untuk mengurus kebergantungan dan menyambungkannya tanpa perlu membuat seketika dan menghantarnya secara manual.
Satu Bekas Suntikan Ketergantungan (atau bekas DI) ialah alat berkuasa yang secara automatik mengurus penciptaan dan suntikan kebergantungan. Bekas mengurus objek dan perhubungannya serta boleh digunakan untuk membuat seketika objek apabila diperlukan, menyuntik kebergantungan dan mengurus kitaran hayat objek.
Bekas PHP DI biasa ialah Bekas Suntikan Ketergantungan Symfony. Berikut ialah contoh cara ia berfungsi:
class DatabaseService { private $dbConnection; public function __construct() { $this->dbConnection = new DatabaseConnection(); // Creates its own dependency } public function fetchData() { // Uses the database connection to fetch data return $this->dbConnection->query('SELECT * FROM users'); } }
Dalam contoh ini, bekas DI mengurus penciptaan DatabaseService dan secara automatik menyuntik perkhidmatan db_connection ke dalamnya.
Suntikan Kebergantungan menjadikan ujian unit lebih mudah dengan membenarkan anda menyuntik kebergantungan palsu semasa ujian. Tanpa DI, adalah sukar untuk mengasingkan kelas yang anda ingin uji daripada kebergantungannya, terutamanya jika kebergantungan tersebut melakukan operasi luaran (cth., pertanyaan pangkalan data, fail I/O).
Dengan memusatkan penciptaan dan pengurusan tanggungan, DI mengurangkan pertindihan kod. Daripada mencipta contoh kelas baharu dalam setiap kaedah atau pembina, anda menciptanya sekali dan menyuntiknya di tempat yang diperlukan.
Kelas dengan kebergantungan luaran yang jelas (melalui DI) lebih mudah difahami. Kelas yang mempunyai kebergantungan yang disuntik adalah jelas tentang perkara yang diperlukannya, menjadikan kod lebih mudah dibaca dan mendokumentasikan diri.
Suntikan Kebergantungan sejajar dengan beberapa prinsip PEJAL, terutamanya Prinsip Tanggungjawab Tunggal (SRP) dan Prinsip Penyongsangan Ketergantungan (DIP). Dengan menyuntik kebergantungan, anda mengurangkan tanggungjawab kelas untuk mengurus kebergantungannya, menjadikan kod lebih mudah difahami dan diselenggara.
Dependency Injection ialah corak reka bentuk penting dalam PHP yang membantu meningkatkan kebolehselenggaraan, kebolehujian dan fleksibiliti kod anda. Dengan mengasingkan kelas daripada kebergantungan mereka, DI membolehkan ujian yang lebih mudah (dengan menyuntik kebergantungan olok-olok) dan modulariti yang lebih besar (dengan menggantikan kebergantungan dengan pelaksanaan yang berbeza).
Untuk aplikasi PHP moden, menggunakan DI adalah penting untuk mencipta kod yang bersih dan boleh diselenggara yang mudah untuk diuji dan difaktorkan semula. Sama ada anda melaksanakan DI secara manual atau menggunakan bekas DI, mengamalkan corak ini akan meningkatkan kualiti dan jangka hayat projek PHP anda dengan ketara.
Atas ialah kandungan terperinci Apakah Suntikan Ketergantungan dalam PHP dan Mengapa Ia Penting untuk Pengujian dan Kebolehselenggaraan. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!