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

php实现mysql

PHP 连接 MySQL 的基本方法 PHP 提供了多种方式与 MySQL 数据库进行交互,以下是最常用的几种方法。 使用 MySQLi 扩展 MySQLi 是 MySQL 的改进扩展,支持面向对…

php实现跳转

php实现跳转

PHP 实现页面跳转的方法 在 PHP 中实现页面跳转有多种方式,以下是常见的几种方法及其适用场景: 使用 header() 函数 通过 header() 函数发送 HTTP 头部信息实现跳转。注意…

php 实现下载

php 实现下载

PHP 实现文件下载的方法 使用 PHP 实现文件下载可以通过设置 HTTP 头信息,强制浏览器将文件作为附件下载而非直接打开。 基本下载实现 $file_path = 'path/to/your/…

php实现过程

php实现过程

PHP 实现过程 PHP 是一种广泛使用的服务器端脚本语言,特别适合 Web 开发。以下是 PHP 实现过程的关键步骤和注意事项。 安装与配置 下载并安装 PHP,可以从官方 PHP 网站获取最新版…

php实现伪静态

php实现伪静态

PHP 实现伪静态的方法 伪静态(URL Rewrite)是一种将动态URL转换为看似静态URL的技术,提升SEO友好性和用户体验。以下是几种常见的实现方式: 使用 Apache 的 mod_rew…

php实现验证码的识别

php实现验证码的识别

验证码识别的基本方法 验证码识别通常分为手动实现和第三方工具两种方式。手动实现需要图像处理和机器学习知识,而第三方工具则更快捷。 使用Tesseract OCR识别验证码 Tesseract是一个开…