当前位置:首页 > 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 实现登录

PHP 登录功能实现 使用 PHP 实现登录功能通常需要结合数据库验证和会话管理。以下是一个基本的登录实现流程: 数据库准备 创建用户表存储用户名和密码(建议使用哈希加密): CREATE TAB…

php变量的实现

php变量的实现

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

php实现支付宝支付

php实现支付宝支付

支付宝支付集成步骤 准备工作 在开始集成支付宝支付前,确保已注册支付宝开放平台账号并完成企业实名认证。创建应用后获取APPID、应用私钥和支付宝公钥。 配置支付宝SDK 通过Composer安装支付…

php 实现锁

php 实现锁

PHP 实现锁的常见方法 文件锁(flock) 利用 flock 函数对文件进行独占锁定,适用于单机环境。 $fp = fopen("lockfile.lock", "w+"); if (flock…

php 实现https

php 实现https

在 PHP 中实现 HTTPS 确保 PHP 应用通过 HTTPS 协议安全传输数据,可以通过以下几种方式实现: 配置服务器强制 HTTPS 在 Web 服务器(如 Apache 或 Nginx)中…

php实现单例模式

php实现单例模式

单例模式的概念 单例模式是一种创建型设计模式,确保一个类只有一个实例,并提供一个全局访问点。这种模式常用于数据库连接、日志记录器等需要全局唯一实例的场景。 PHP实现单例模式的关键步骤 私有化构造函…