Ứng dụng Dependency Injection Design Pattern trong lập trình PHP

Dependency Injection viết tắt là DI là một trong những software design pattern dùng để quản lý sự phụ thuộc trong ứng dụng. Điểm nhấn của DI là giúp cho các lớp giảm đi sự phụ thuộc lẫn nhau nhằm tạo ra tính linh hoạt và dễ mở rộng cho mã nguồn.

Cần nắm vững hai kỹ thuật sau đây trước khi bắt đầu tiềm hiểu sâu hơn: Type HintingMethod Chaining 

Nếu một đối tượng có một thuộc tính là một đối tượng khác thì ta có thể áp dụng ngay Dependency Injection.

Sử dụng Dependency Injection thao tác thuộc tính authorInfo trong đối tượng Book, Question

<?php
class Author
{
    protected $authorName;
    protected $authorEmail;
    public function __construct($name, $email)
    {
        $this->authorName = $name;
        $this->authorEmail = $email;
    }
    public function getAuthorName()
    {
        return $this->authorName;
    }
    public function getAuthorEmail()
    {
        return $this->authorEmail;
    }
}
 
class Book
{
    protected $authorInfo;
    protected $bookName;
    public function __construct($bookName)
    {
        $this->bookName = $bookName;
    }
    public function getBookName()
    {
        return $this->bookName;
    }
    public function getAuthorInfo()
    {
        return $this->authorInfo;
    }
    public function setAuthorInfo(Author $author)
    {
        $this->authorInfo = $author;
    }
}
 
class Question
{
    private $authorInfo;
    private $question;
 
    public function __construct($question)
    {
        $this->question = $question;
    }
 
    public function getAuthorInfo()
    {
        return $this->authorInfo;
    }
    
    public function setAuthorInfo(Author $author){
        $this->authorInfo = $author;
    }
 
    public function getQuestion()
    {
        return $this->question;
    }
}
 
$author = new Author('Văn Biển', 'contact@webchuanseo.vn');
$book = new Book('Lập trình PHP nâng cao');
$book->setAuthorInfo($author);
echo "Tên sách: " . $book->getBookName();
echo "<br /> Tác giả: " . $book->getAuthorInfo()->getAuthorName();
echo "<br /> Email: " . $book->getAuthorInfo()->getAuthorEmail();
 
$author2 = new Author('The PHP Group', 'security@php.net');
$question = new Question('I want to learn code my website by wordpress CMS, can you help me?');
$question->setAuthorInfo($author2);
echo "<br><br>Question name: " . $question->getQuestion();
echo "<br> Author: " . $question->getAuthorInfo()->getAuthorName();
echo "<br> Email: " . $question->getAuthorInfo()->getAuthorEmail();
?>

Ở ví dụ trên chúng ta có ba đối tượng: Author, Book, Question. Hai đối tượng Book và Question không liên quan đến nhau nhưng đều có một thuộc tính là authorInfo.

Nếu để lớp Book kế thừa lớp Author thì không đúng với thực tế, hơn nữa sẽ làm cho ứng dụng kém linh hoạt hơn. Vì thế tôi đã áp dụng Dependency Injection để giải quyết bài toán này bằng cách đưa vào hai phương thức là setAuthorInfo và getAuthorInfo. Tương tự với lớp Question.

 

Để lại một trả lời

Hãy trở thành người đầu tiên bình luận!

Thông báo cho
avatar
wpDiscuz