当前位置:首页 > PHP

php diy实现

2026-01-29 23:06:52PHP

PHP DIY 实现

PHP DIY(依赖注入)可以通过手动实现或使用容器来实现。以下是几种常见的方法:

手动依赖注入

手动依赖注入是最基础的方式,通过构造函数或方法参数传递依赖对象。

class Database {
    public function query($sql) {
        // 数据库查询逻辑
    }
}

class UserRepository {
    private $db;

    public function __construct(Database $db) {
        $this->db = $db;
    }

    public function getUsers() {
        return $this->db->query('SELECT * FROM users');
    }
}

$db = new Database();
$userRepository = new UserRepository($db);

使用容器实现依赖注入

容器可以自动管理依赖关系,避免手动创建对象。

class Container {
    private $bindings = [];

    public function bind($abstract, $concrete) {
        $this->bindings[$abstract] = $concrete;
    }

    public function make($abstract) {
        if (!isset($this->bindings[$abstract])) {
            throw new Exception("No binding found for {$abstract}");
        }

        $concrete = $this->bindings[$abstract];
        if (is_callable($concrete)) {
            return $concrete($this);
        }
        return new $concrete();
    }
}

$container = new Container();
$container->bind(Database::class, function() {
    return new Database();
});

$container->bind(UserRepository::class, function($container) {
    return new UserRepository($container->make(Database::class));
});

$userRepository = $container->make(UserRepository::class);

使用反射实现自动依赖注入

反射可以自动解析类的依赖关系并注入。

class DependencyInjector {
    public function resolve($class) {
        $reflection = new ReflectionClass($class);
        $constructor = $reflection->getConstructor();
        if (!$constructor) {
            return new $class();
        }

        $parameters = $constructor->getParameters();
        $dependencies = [];
        foreach ($parameters as $parameter) {
            $dependencyClass = $parameter->getClass();
            if (!$dependencyClass) {
                throw new Exception("Cannot resolve dependency for {$parameter->getName()}");
            }
            $dependencies[] = $this->resolve($dependencyClass->getName());
        }

        return $reflection->newInstanceArgs($dependencies);
    }
}

$injector = new DependencyInjector();
$userRepository = $injector->resolve(UserRepository::class);

使用接口绑定

通过接口绑定可以实现更灵活的依赖注入。

interface DatabaseInterface {
    public function query($sql);
}

class MySQLDatabase implements DatabaseInterface {
    public function query($sql) {
        // MySQL 查询逻辑
    }
}

class UserRepository {
    private $db;

    public function __construct(DatabaseInterface $db) {
        $this->db = $db;
    }
}

$container = new Container();
$container->bind(DatabaseInterface::class, MySQLDatabase::class);
$userRepository = $container->make(UserRepository::class);

使用 Pimple 容器

Pimple 是一个轻量级的 PHP 依赖注入容器。

require_once 'vendor/autoload.php';

$container = new Pimple\Container();
$container['database'] = function() {
    return new Database();
};

$container['userRepository'] = function($c) {
    return new UserRepository($c['database']);
};

$userRepository = $container['userRepository'];

以上方法可以根据项目需求选择适合的方式实现 PHP 的依赖注入。

php diy实现

标签: phpdiy
分享给朋友:

相关文章

php实现分页

php实现分页

PHP实现分页的基本方法 使用原生PHP实现分页功能需要结合数据库查询和HTML展示。以下是核心实现步骤: 数据库查询与分页逻辑 // 连接数据库 $conn = new mysqli('lo…

php实现搜索功能

php实现搜索功能

实现基础搜索功能 使用PHP和MySQL实现基础的搜索功能需要结合表单提交与数据库查询。创建一个HTML表单用于接收用户输入的搜索关键词,通过PHP处理表单数据并查询数据库。 // 搜索表单 (H…

php实现文件上传

php实现文件上传

PHP 文件上传实现方法 在 PHP 中实现文件上传需要处理 HTML 表单和服务器端脚本。以下是详细步骤: 创建 HTML 表单 使用 enctype="multipart/form-data"…

php实现文件下载

php实现文件下载

PHP实现文件下载的方法 通过PHP实现文件下载功能,可以采用多种方式,以下是几种常见的实现方法: 使用header()函数强制下载 设置HTTP头信息,强制浏览器下载文件而非直接打开: $fi…

php 实现自动收货

php 实现自动收货

PHP 实现自动收货功能 自动收货功能通常用于电商系统,在订单超过一定时间未手动确认收货时自动完成订单。以下是实现方法: 数据库设计 需要订单表包含以下关键字段: CREATE TABLE…

php实现websocket

php实现websocket

PHP 实现 WebSocket WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议。PHP 可以通过多种方式实现 WebSocket 功能,以下是几种常见的方法: 使用 Ratc…