首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 實作 IoC 控制反轉:簡易依賴注入容器教學

     編輯:PHP 相關知識

控制反轉 將物件建立與依賴管理權從程式碼移至外部容器,降低耦合度。本文用 PHP 動態特性實作簡易 IoC 容器,透過 JSON 設定檔動態建立物件並注入屬性。

核心元件

  1. 介面/基類:定義共同行為(`Fruit::showColor()`)。
  2. 具體實作:`Apple`、`Banana` 實作介面。
  3. 類別工廠:解析設定檔、載入類別檔、實例化並注入屬性。
  4. 設定檔:JSON 格式定義類別對應、檔案路徑、屬性值。

程式碼實作

1. Fruit.php - 介面與實作

<?php
interface Fruit {
    public function showColor();
}

class Apple implements Fruit {
    private $color;
    public function getColor() { return $this->color; }
    public function setColor($v) { $this->color = $v; }
    public function showColor() { echo "Apple Color: " . $this->color; }
}

class Banana implements Fruit {
    private $color;
    public function getColor() { return $this->color; }
    public function setColor($v) { $this->color = $v; }
    public function showColor() { echo "Banana Color: " . $this->color; }
}
?>

2. ClassFactory.php - IoC 容器核心

<?php
class ClassFactory {
    private $config;

    public function __construct($configFile) {
        $content = file_get_contents($configFile);
        // 移除註解 (簡易處理)
        $content = preg_replace('/\/\/.*?\n/', '', $content);
        $this->config = json_decode($content, true);
    }

    public function getBean($id) {
        foreach ($this->config as $conf) {
            if ($conf['id'] === $id) {
                require_once $conf['class_file'];
                $obj = new $conf['class_name']();

                // 注入屬性:對應 setXxx() 方法
                foreach ($conf['properties'] as $prop) {
                    $method = 'set' . ucfirst($prop['name']);
                    if (method_exists($obj, $method)) {
                        $obj->$method($prop['value']);
                    }
                }
                return $obj;
            }
        }
        return null;
    }
}
?>

3. config.json - 設定檔

[
    {
        "id": "Apple",
        "class_name": "Apple",
        "class_file": "Fruit.php",
        "properties": [ { "name": "color", "value": "Red" } ]
    },
    {
        "id": "Banana",
        "class_name": "Banana",
        "class_file": "Fruit.php",
        "properties": [ { "name": "color", "value": "Yellow" } ]
    }
]

4. test.php - 客戶端使用

<?php
require_once "ClassFactory.php";

$factory = new ClassFactory("config.json");

$fruit = $factory->getBean("Apple");
$fruit->showColor(); // Apple Color:Red
echo "<br/>";

$fruit = $factory->getBean("Banana");
$fruit->showColor(); // Banana Color:Yellow
?>

執行結果

Apple Color:Red
Banana Color:Yellow

優點與擴充方向

  • **解耦**:客戶端不依賴具體類別,只依賴介面與 ID。
  • **設定外部化**:修改 JSON 即可切換實作,無需改動程式碼。
  • **擴充建議**:支援建構子注入、介面綁定、生命週期管理、單例作用域、自動裝配(Reflection)。

PHP 動態語言特性讓 IoC 實作極簡潔,無需複雜反射即可完成核心功能。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved