当前位置:首页 > PHP

php ioc 实现

2026-01-28 21:55:41PHP

PHP IoC 实现方法

依赖注入容器

依赖注入(DI)是IoC的核心实现方式之一。通过容器管理对象的依赖关系,避免硬编码依赖。

class Container {
    protected $instances = [];

    public function bind($abstract, $concrete = null) {
        if (is_null($concrete)) {
            $concrete = $abstract;
        }
        $this->instances[$abstract] = $concrete;
    }

    public function make($abstract, $parameters = []) {
        if (!isset($this->instances[$abstract])) {
            $this->bind($abstract);
        }
        return $this->resolve($this->instances[$abstract], $parameters);
    }

    protected function resolve($concrete, $parameters) {
        if ($concrete instanceof Closure) {
            return $concrete($this, $parameters);
        }
        $reflector = new ReflectionClass($concrete);
        if (!$reflector->isInstantiable()) {
            throw new Exception("Class {$concrete} is not instantiable");
        }
        $constructor = $reflector->getConstructor();
        if (is_null($constructor)) {
            return new $concrete;
        }
        $dependencies = $constructor->getParameters();
        $instances = $this->resolveDependencies($dependencies);
        return $reflector->newInstanceArgs($instances);
    }

    protected function resolveDependencies($parameters) {
        $dependencies = [];
        foreach ($parameters as $parameter) {
            $dependency = $parameter->getClass();
            if (is_null($dependency)) {
                if ($parameter->isDefaultValueAvailable()) {
                    $dependencies[] = $parameter->getDefaultValue();
                } else {
                    throw new Exception("Cannot resolve dependency {$parameter->name}");
                }
            } else {
                $dependencies[] = $this->make($dependency->name);
            }
        }
        return $dependencies;
    }
}

服务定位器模式

服务定位器是另一种实现IoC的方式,通过中央注册表获取服务实例。

php ioc 实现

class ServiceLocator {
    private $services = [];
    private $instantiated = [];

    public function register(string $name, callable $resolver) {
        $this->services[$name] = $resolver;
    }

    public function has(string $name): bool {
        return isset($this->services[$name]);
    }

    public function get(string $name) {
        if (!isset($this->instantiated[$name])) {
            $this->instantiated[$name] = $this->services[$name]();
        }
        return $this->instantiated[$name];
    }
}

接口绑定实现

通过接口绑定具体实现,实现松耦合。

php ioc 实现

interface LoggerInterface {
    public function log(string $message);
}

class FileLogger implements LoggerInterface {
    public function log(string $message) {
        file_put_contents('log.txt', $message, FILE_APPEND);
    }
}

$container = new Container();
$container->bind(LoggerInterface::class, FileLogger::class);
$logger = $container->make(LoggerInterface::class);

自动装配实现

利用反射自动解析依赖关系,减少手动配置。

class AutoWiringContainer extends Container {
    public function make($abstract, $parameters = []) {
        if (!isset($this->instances[$abstract])) {
            $this->bind($abstract);
        }
        return parent::make($abstract, $parameters);
    }
}

实际应用示例

展示如何在MVC框架中使用IoC容器。

class UserController {
    private $userRepository;

    public function __construct(UserRepository $userRepository) {
        $this->userRepository = $userRepository;
    }
}

$container = new Container();
$container->bind(UserRepository::class, DatabaseUserRepository::class);
$controller = $container->make(UserController::class);

以上实现方法展示了PHP中IoC容器的核心概念和不同实现方式,从基础的依赖注入到自动装配,可以根据项目需求选择适合的方案。

标签: phpioc
分享给朋友:

相关文章

php实现上传图片

php实现上传图片

上传图片的基本流程 PHP 实现图片上传功能需要处理文件接收、验证、保存等步骤。以下是具体实现方法。 创建 HTML 表单 在 HTML 中创建一个表单,设置 enctype="multipart/…

php 实现秒杀

php 实现秒杀

PHP 实现秒杀的关键技术 秒杀系统需要解决高并发、超卖、性能瓶颈等问题。以下是实现秒杀的核心方案: 使用 Redis 预减库存 将商品库存提前加载到 Redis 中,通过原子操作保证库存准确性:…

php实现博客

php实现博客

使用PHP实现博客系统 数据库设计 创建数据库表存储博客文章和用户信息。常见的表包括posts(文章)和users(用户)。 CREATE TABLE users ( id INT AUTO…

php实现登陆

php实现登陆

PHP 实现登录功能 创建登录表单 在 HTML 文件中创建一个登录表单,包含用户名和密码输入框,表单的 action 属性指向处理登录的 PHP 文件。 <form action="logi…

php实现推送消息推送消息

php实现推送消息推送消息

PHP 实现消息推送的方法 使用 WebSocket 实现实时推送 WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议,适合实现实时消息推送。 安装 Ratchet 库(WebSo…

php实现域名

php实现域名

PHP实现域名操作的方法 获取当前域名 使用$_SERVER['HTTP_HOST']可以获取当前访问的域名: $currentDomain = $_SERVER['HTTP_HOST']; ech…