当前位置:首页 > PHP

php diy实现

2026-01-29 23:06:52PHP

PHP DIY 实现

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);

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

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

php diy实现

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 的依赖注入。

标签: phpdiy
分享给朋友:

相关文章

php实现图片上传

php实现图片上传

实现图片上传的基本步骤 创建HTML表单用于文件上传,表单需设置enctype="multipart/form-data"属性,确保文件数据正确传输。 <form action="upload…

php 实现自动收货

php 实现自动收货

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

php实现注册

php实现注册

注册功能实现步骤 数据库准备 创建用户表,包含字段如id、username、password、email等。示例SQL: CREATE TABLE users ( id INT AUTO_I…

php 无限分类的实现

php 无限分类的实现

无限分类的实现方法 无限分类通常用于构建树形结构数据,如商品分类、多级菜单等。以下是几种常见的实现方式: 邻接列表模型(Adjacency List) 邻接列表是最简单的实现方式,通过在每个节点中存…

php变量的实现

php变量的实现

PHP变量的实现机制 PHP变量的实现基于Zend引擎的底层数据结构。核心结构体zval用于存储变量类型和值,其设计允许动态类型转换和高效内存管理。 zval结构体 PHP变量通过zval结构体实现…

php 实现md5

php 实现md5

使用 PHP 内置函数实现 MD5 PHP 提供了 md5() 函数,可以直接计算字符串的 MD5 哈希值。该函数接受一个字符串参数,返回 32 字符的十六进制哈希值。 $string = "H…