Saya punya proyek di PHP biasa dan ada kelas yang bergantung pada perpustakaan eksternal.

Saya tidak merasa ingin meneruskannya ke konstruktor di mana-mana adalah ide yang bagus (ini disebut terutama dalam tes, tetapi pengguna paket harus meneruskannya ke konstruktor).

Saya tidak memiliki wadah DI dan tidak berpikir saya harus memilikinya karena proyek ini adalah paket kecil dan hanya akan memiliki beberapa kelas.

Jadi saya datang dengan pendekatan ini dan bertanya-tanya apakah ada konsekuensi atau kelemahan dari pendekatan ini atau apakah ada solusi lain untuk ini?

    protected $client;

    /**
     * @param Client|null $client
     */
    public function __construct(Client $client = null)
    {
        $this->client = $client ?? new Client();
    }
1
Ivan Kayzer 1 Februari 2020, 16:35

2 jawaban

Jawaban Terbaik

Saya tidak melihat ada masalah besar dengan itu. Kelas Anda hanya kembali ke implementasi Client default jika tidak ada yang disuntikkan ke dalamnya, tetapi karena Anda tidak menerapkannya, ia mempertahankan fleksibilitas/testabilitas yang sesuai.

Namun saya akan melangkah lebih jauh dan menerapkan Ketergantungan Inversi:

interface IClient  // maybe find a slightly more suitable name for it
{
  // define Client's public interface methods here
}

Ubah kelas Klien Anda untuk mengimplementasikannya:

class Client implements IClient 
{
  // ...
}

Kemudian ubah konstruktor menjadi ini:

public function __construct(IClient $client = null)
{
  $this->client = $client ?? new Client();
}

Dengan cara ini kelas Anda bahkan tidak bergantung pada implementasi apa pun sama sekali. Itu terjadi secara default ke Client jika tidak diberikan secara eksplisit.

0
Jeto 1 Februari 2020, 14:12

Mungkin itu mungkin berhasil untuk Anda?

protected $client;

public function __construct(Client $client = null)
{
   this->client = isset($client) ?? new Client();
}
0
İbrahim 1 Februari 2020, 14:03